취약한 종속 패키지를 npm audit로 감사

미래 AdventCalendar2020 15일째입니다.

어제는, iwamoto-san( @qiiwa )씨에 의한, 핑에서 리눅스 서버의 사활 모니터링을해서는 안된다는 이야기 였습니다.

소개



안녕하세요. 2019년 4월 입사의 이치카와입니다.
현재 저는 Vue.js에서 SPA(Single Page Application) 개발 업무에 종사해 주시는 경우가 많습니다만, 프로젝트에서 사용하고 있는 패키지의 취약성 대응을 업무로 실시했습니다.

이번은 내가 조사하면서 취약성 대응을 실시한 내용을, 여기에서 소개를 해 나가고 싶습니다.

환경


  • npm 6.14.8
  • node 14.9.0

  • 현재 상태 파악



    npm v.6.0.0부터 프로젝트에서 사용하는 패키지 종속성을 감사하여 취약점이 존재하는지 확인할 수 있는 npm audit 명령이 제공됩니다. ( htps://도 CS. 응 pmjs. 작은 m/cぃ/V6/코만 ds/응 pm- 맞는ぢt )

    우선 이번에는 여기를 사용하여 자신의 프로젝트에서 사용하는 패키지 종속성에 어느 정도의 취약성이 있는지 확인해 봅시다.

    실행하면 아래와 같은 출력 결과를 얻을 수 있습니다.
    $ npm audit
    
                           === npm audit security report ===                        
    ┌───────────────┬──────────────────────────────────────────────────────────────┐
    │ Low           │ Prototype Pollution                                          │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Package       │ foo                                                          │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Dependency of │ bar                                                          │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Path          │ hoge                                                         │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ More info     │ https://npmjs.com/advisories/fuga                            │
    └───────────────┴──────────────────────────────────────────────────────────────┘
    ...
    ...
    ...(割愛)
    ...
    found 100 vulnerabilities (95 low, 5 high) in 200 scanned packages ・・・①
      run `npm audit fix` to fix 98 of them. ・・・②
      2 vulnerabilities require manual review. See the full report for details. ・・・③
    

    (↑ 취약성 건수의 수치를 적게 잡고 있습니다)

    npm audit에 의해 다음과 같은 것을 알았습니다.

    ① 프로젝트에서 사용하고 있는 200개의 패키지 중 100건의 취약성이 있으며,
    그 중 95건은 low level, 5건은 high level인 것
    ② 100건 중 98건의 취약성에 관해서는 npm audit fix 커맨드로 취약성 대응이 가능한 것
    ③ 2개의 취약성에 대해서는 수동으로 확인이 필요한 것

    npm audit fix의 취약성 대응



    현재의 상황도 파악할 수 있었기 때문에 취약성 대응을 실시하고 있습니다.
    위의 출력에 있는 npm audit fix 명령은 npm v6.1.0에서 사용할 수 있으며 node_modules에 존재하는 대부분의 취약점을 자동 수정합니다.

    이제 npm audit fix 를 실행합시다.
    $ npm audit fix
    
    + [email protected]
    added 1 package from 1 contributor, removed 10 packages and updated 15 packages in 10.000s
    
    63 packages are looking for funding
      run `npm fund` for details
    
    fixed 98 of 100 vulnerabilities in 200 scanned packages
      2 vulnerabilities required manual review and could not be updated
    
    npm audit fix 에 의해 100개의 취약성 중 98개에 대응할 수 있었습니다. 편리하네요.
    로그에 출력된 대로 패키지 종속성에 의해 npm audit fix 에서 자동으로 수정할 수 없는 취약성이 남아 버리는 일이 있어, 이쪽은 수동으로 해소하지 않으면 안됩니다.

    이번에 수동으로 대응해야 하는 취약성이 두 가지 남아 있으므로 그 내용을 확인합니다.
    
    $ npm audit
                           === npm audit security report ===                        
    
    # Run  npm update webpack --depth 2  to resolve 2 vulnerabilities
    ┌───────────────┬──────────────────────────────────────────────────────────────┐
    │ High          │ Remote Code Execution                                        │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Package       │ serialize-javascript                                         │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Dependency of │ @vue/cli-plugin-babel [dev]                                  │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Path          │ @vue/cli-plugin-babel > webpack > terser-webpack-plugin >    │
    │               │ serialize-javascript                                         │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ More info     │ https://npmjs.com/advisories/1548                            │
    └───────────────┴──────────────────────────────────────────────────────────────┘
    
    ┌───────────────┬──────────────────────────────────────────────────────────────┐
    │ High          │ Remote Code Execution                                        │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Package       │ serialize-javascript                                         │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Dependency of │ @vue/cli-plugin-eslint [dev]                                 │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ Path          │ @vue/cli-plugin-eslint > webpack > terser-webpack-plugin >   │
    │               │ serialize-javascript                                         │
    ├───────────────┼──────────────────────────────────────────────────────────────┤
    │ More info     │ https://npmjs.com/advisories/1548                            │
    └───────────────┴──────────────────────────────────────────────────────────────┘
    

    npm audit를 실행하면 위와 같은 출력 결과를 얻었습니다.
    로그에 출력되는 More info 링크에 액세스할 때 자세한 내용을 설명합니다.


    ( htps //w w. 음 pmjs. 코 m/아 dゔぃ소리에 s/1548 )

    이 두 가지 취약점을 해결하기 위해 npm update webpack --depth 2
    $ npm update webpack --depth 2
    ...
    ...
    $ npm audit                                                                     
                           === npm audit security report ===                        
    
    found 0 vulnerabilities in 200 scanned packages
    

    여기에서 의존하는 패키지의 취약성이 0건인 것을 확인할 수 있었습니다.

    취약성 대응 자동화



    소프트웨어 세계에서 매일 취약점이 발견되고 수정되었습니다 반복합니다.
    인간이 항상 취약성 정보를 잡고 업데이트 작업을 수행하는 것은 조금 억권입니다.

    프라이빗으로 사용하고 있는 Github에서는 취약성이 발견되었을 때, 자동으로 취약성 대응을 실시하는 Pull Request를 작성하는 설정을 실시하고 있습니다만, 업무의 쪽에서는 그다지 자동화할 수 없기 때문에, gitlab- ci를 등을 활용한 취약성 대응을 할 수 없는지 나중에 검증해 보고 싶습니다.

    참고


  • npm-audit | npm Docs
  • Auditing package dependencies for security vulnerabilities | npm Docs
  • 좋은 웹페이지 즐겨찾기