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.json
나 package-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 --dev
는devDependencies
만 설치하라는 의미이다. 패키지가 지정되어 있어서 굳이 여기서 필요한가 싶지만... 이--dev
옵션은 지금은 폐기되었고--only={prod[uction]|dev[elopment]}
와 같이 써야 한다.npm update log4js --depth 2
같은 경우는package.json
의 버전 규칙에 따라 업데이트를 하지만 현재는 최상위 모듈만 업데이트하고 있다.--depth
옵션을 주면 해당 계층까지 검사해서 최신 버전으로 올려준다.
개발단계에서는 크게 신경 쓰지 않아도 되지만 프로덕션에 나가는 코드에서는 의존성 관리는 중요한 부분이므로 audit
이 기본으로 포함되어 CI나 배포 전 단계에 검사하기가 좋아졌다.
포스팅 올려 주신 거 보고 npm 6.0.1/5.10.0으로 해 봤는데 ENOAUDIT 에러가 발생하네요. Your configured registry (https://registry.npmjs.org/) doest not support audit requests라는군요. 흠 아직 베타 registry에서만 사용 가능한지.. 혹 어떤 registry 사용하시나요?
아 그러네요? 찾아보니 아직은 베타 레지스트리만 되고 조만간 전체가 쓸 수 있게 한다고 하는군요.
저는 클라이언트 쪽에서는 따로 레지스트리를 지정한게 없고 말씀하신 퍼블릭 레지스트리를 쓰고 있습니다. npm 사이트가봐도 제가 베타인지 아닌지를 어디서 확인해야 하는지 잘 모르겠네요 ㅠ
네, 뭔가 A/B 테스팅처럼 랜덤하게 되는 건지..
전 베타 registry 사용하는 방법을 못 찾겠더라고요.
뭐 조만간 정식 사용 가능해지겠죠^^;
포스팅 감사합니다~