Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

npm에 새로 추가된 audit 기능

npm v6가 나오면서 npm audit이라는 기능이 추가되었다. 이는 사용하는 npm 모듈의 취약점을 검사해주는 Node Security Platform(보통 nsp 명령어로 사용한다)를 npm, Inc가 인수하면서 NSP의 데이터베이스를 이용해서 취약점을 점검해 주는 기능을 추가한 것이다. 이번에 npm audit이 npm v6뿐만 아니라 v5.10.0에도 추가되면서 6으로 올리지 않더라도 사용할 수 있게 되었다.

이제는 GitHub에서도 취약점 경고를 해주지만 Node 생태계에 특화된 NSP쪽이 데이터베이스가 좀 더 풍부하고 빠른 것으로 보인다.(GitHub이 어디의 데이터를 사용하는지 모르지만, GitHub은 JavaScript만 지원해야 하는 것은 아니라..)

npm audit

npm을 쓰면서 크게 불편을 느끼진 않아서 버전이 올라갈 때마다 달라진 기능을 일일이 보진 않지만 새로운 기능이 나와서 사용해 봤다.

일단 기존 npm이 5.6.0이라서 최신 버전 6.0.1로 업데이트를 했다.

$ npm -v
5.6.0

$ npm install -g npm
+ npm@6.0.1
added 156 packages, removed 37 packages and updated 17 packages in 134.362s

$ npm -v
6.0.1

현재 작업 중인 사이드 프로젝트에서 실행을 해봤다.

$ npm audit

                       === npm audit security report ===

# Run  npm install --dev nodemon@1.17.4  to resolve 1 vulnerability
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Low           │ Prototype Pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ deep-extend                                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ nodemon [dev]                                                │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ nodemon > chokidar > fsevents > node-pre-gyp > rc >          │
│               │ deep-extend                                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/612                       │
└───────────────┴──────────────────────────────────────────────────────────────┘


┌──────────────────────────────────────────────────────────────────────────────┐
│                                Manual Review                                 │
│            Some vulnerabilities require your attention to resolve            │
│                                                                              │
│         Visit https://go.npm.me/audit-guide for additional guidance          │
└──────────────────────────────────────────────────────────────────────────────┘
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Prototype pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ hoek                                                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in    │ > 4.2.0 < 5.0.0 || >= 5.0.3                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ pkg [dev]                                                    │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ pkg > pkg-fetch > request > hawk > boom > hoek               │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/566                       │
└───────────────┴──────────────────────────────────────────────────────────────┘
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Prototype pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ hoek                                                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in    │ > 4.2.0 < 5.0.0 || >= 5.0.3                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ pkg [dev]                                                    │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ pkg > pkg-fetch > request > hawk > cryptiles > boom > hoek   │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/566                       │
└───────────────┴──────────────────────────────────────────────────────────────┘
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Prototype pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ hoek                                                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in    │ > 4.2.0 < 5.0.0 || >= 5.0.3                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ pkg [dev]                                                    │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ pkg > pkg-fetch > request > hawk > hoek                      │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/566                       │
└───────────────┴──────────────────────────────────────────────────────────────┘
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Prototype pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ hoek                                                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in    │ > 4.2.0 < 5.0.0 || >= 5.0.3                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ pkg [dev]                                                    │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ pkg > pkg-fetch > request > hawk > sntp > hoek               │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/566                       │
└───────────────┴──────────────────────────────────────────────────────────────┘

[!] 5 vulnerabilities found - Packages audited: 6825 (2068 dev, 123 optional)
    Severity: 1 Low | 4 Moderate

결과가 보기 쉽게 나오고 의존성을 업데이트한 지가 그리 오래되지 않아서 많은 취약점이 나오진 않았다. 낮은 심각도의 취약점이 1개 중간 심각도의 취약점이 4개 발견되었다. nodemon에서 사용하는 deep-extend에서 취약점이 있고 nodemon@1.17.4로 업데이트하면 이 취약점을 해결할 수 있다고 나온다.

하단에 나오는 Manual Review는 취약점은 발견되었지만, 아직 패치가 존재하지 않아서 신경 써야 한다는 의미이다. 문서에 따르면 이렇기는 한지 위 결과에서 나온 pkg안에 포함된 hoek을 보면(hoek만 4개 나온 것은 hoek이 4개 포함되었기 때문이다.) Patched in에서 > 4.2.0 < 5.0.0 || >= 5.0.3라고 나와있다. 이는 4.2.0보다 크고 5.0.0보다 작은 버전이나 5.0.3이상인 버전에서는 패치되었다는 의미이다. 버그인지 데이터베이스 업데이트가 느린 것인지 모르지만 이미 패치가 되었는데 왜 Manual Review로 나오는지는 잘 모르겠다.

$ npm install

added 900 packages from 1012 contributors in 12.728s
[!] 5 vulnerabilities found [6825 packages audited]
    Severity: 1 Low | 4 Moderate
    Run `npm audit` for more detail

추가로 이제는 npm install을 할 때 취약점 검사도 함께 해주고 결과를 알려주므로 설치할 때 참고해서 볼 수 있다.(설치 시에 검사하지 않으려면 --no-audit 옵션을 사용해야 한다.) 그리고 audit 명령어는 npm-shrinkwrap.jsonpackage-lock.json 파일이 있어야만 사용할 수 있다. package-lock.json의 충돌이 귀찮아서 사용하지 않고 있다면 npm i --package-lock-only 등으로 package-lock.json을 만들어야 audit을 사용할 수 있다.

                       === npm audit security report ===


┌───────────────┬──────────────────────────────────────────────────────────────┐
│ High          │ Denial of Service                                            │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ http-proxy-agent                                             │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ karma [dev]                                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ karma > log4js > mailgun-js > proxy-agent > http-proxy-agent │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/607                       │
└───────────────┴──────────────────────────────────────────────────────────────┘


# Run  npm install --dev parcel-bundler@1.8.1  to resolve 1 vulnerability
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Low           │ Prototype Pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ deep-extend                                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ parcel-bundler [dev]                                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ parcel-bundler > chokidar > fsevents > node-pre-gyp > rc >   │
│               │ deep-extend                                                  │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/612                       │
└───────────────┴──────────────────────────────────────────────────────────────┘


# Run  npm update log4js --depth 2  to resolve 16 vulnerabilities
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Prototype pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ hoek                                                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ karma                                                        │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ karma > log4js > slack-node > requestretry > request > hawk  │
│               │ > boom > hoek                                                │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/566                       │
└───────────────┴──────────────────────────────────────────────────────────────┘


# Run  npm install mocha@5.1.1  to resolve 2 vulnerabilities
SEMVER WARNING: Recommended action is a potentially breaking change
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Low           │ Regular Expression Denial of Service                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ debug                                                        │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ mocha                                                        │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ mocha > debug                                                │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/534                       │
└───────────────┴──────────────────────────────────────────────────────────────┘

npm 의존성을 업데이트한 지 좀 된 프로젝트에서도 한번 돌려봤다. 여기서는 훨씬 많은 취약점이 발견되었는데 그중 몇 개만 위에 올렸다. 위 결과를 보면 그냥 취약점을 보고해 주는 부분도 있고 상단에 어떤 명령어를 실행하면 취약점을 해결할 수 있는지까지 알려주고 있다. 그리고 모듈을 업데이트해서 취약점을 해결할 때 호환성이 깨진 업데이트가 있으면 SEMVER WARNING: Recommended action is a potentially breaking change라고 알려주고 있다.

위 결과를 보다가 전혀 사용해 보지 않은 옵션이 보여서 궁금해졌다.

  • npm install --devdevDependencies만 설치하라는 의미이다. 패키지가 지정되어 있어서 굳이 여기서 필요한가 싶지만... 이 --dev 옵션은 지금은 폐기되었고 --only={prod[uction]|dev[elopment]}와 같이 써야 한다.
  • npm update log4js --depth 2 같은 경우는 package.json의 버전 규칙에 따라 업데이트를 하지만 현재는 최상위 모듈만 업데이트하고 있다. --depth 옵션을 주면 해당 계층까지 검사해서 최신 버전으로 올려준다.

개발단계에서는 크게 신경 쓰지 않아도 되지만 프로덕션에 나가는 코드에서는 의존성 관리는 중요한 부분이므로 audit이 기본으로 포함되어 CI나 배포 전 단계에 검사하기가 좋아졌다.

2018/05/12 22:45 2018/05/12 22:45