Node.jsのパッケージ管理ツール「npm」では、バージョン6からセキュリティが強化され、
脆弱性があるパッケージをインストールする場合は警告が出るようになりました。
npm audit fixコマンドにて自動で修正できる場合もあるのですが、
それだけでは修正できず手動での修正が必要な場合があります。
- npm audit fixを打ってもエラーを解決できない
- npm auditで出たエラーを手動で修正したい
上記のような悩みをお持ちの方に、
npm audit fixで修正できないエラーを手動で解決する手順を紹介します。
- package-lock.jsonを修正
- node_modules/ を削除
- npm installを再実行
エラー内容の確認 – npm installが失敗する
npm installを実行すると脆弱性に関する以下のようなエラーが出ます。
$ npm install
found 5 vulnerabilities (1 low, 3 moderate, 1 high)
run `npm audit fix` to fix them, or `npm audit` for details
npm audit fixでは直らず、手動で直してくださいとの表示が出ます。
$ npm audit fix
fixed 0 of 5 vulnerabilities in 827 scanned packages
5 vulnerabilities required manual review and could not be updated
どうやって手動で直すかは特に明言されていません。
npm audit fixで修正できないエラーを手動で解決する方法
まずはnpm auditで脆弱性の内容を確認します。(以下一部抜粋)
$ npm audit
┌──────────────────────────────────────────────────────────────────────────────┐
│ Manual Review │
│ Some vulnerabilities require your attention to resolve │
│ │
│ Visit https://go.npm.me/audit-guide for additional guidance │
└──────────────────────────────────────────────────────────────────────────────┘
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ High │ Arbitrary Code Execution │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ underscore │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in │ >=1.12.1 │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ jsonlint [dev] │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ jsonlint > nomnom > underscore │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://npmjs.com/advisories/1674 │
└───────────────┴──────────────────────────────────────────────────────────────┘
jsonlint → nomnom → underscore が脆弱性の原因となっているようです。
「Patched in │ >=1.12.1」とあるので、1.12.1以上を指定する必要があります。
手動修正は以下の手順を実行します。
- package-lock.jsonを修正
- node_modules配下を削除
- npm installを再実行
package-lock.jsonを修正
package-lock.jsonのファイルにて、脆弱性を含むパッケージ(今回の例だとunderscore)を
requiresで指定している部分にて、該当パッケージ以外の記述すべて削除し、
該当パッケージのバージョンに脆弱性がないものを指定します。
編集前
"nomnom": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
"integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
"dev": true,
// この部分を修正する
"requires": {
"chalk": "~0.4.0",
"underscore": "~1.6.0"
},
編集後
"nomnom": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
"integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
"dev": true,
// この部分を修正する
"requires": {
// requires内の脆弱性があるパッケージ以外を全て消す(例としてunderscore以外を消す)
// 脆弱性があるパッケージのバージョンを、脆弱性を含まないバージョンに変更する
// 今回の例では1.12.1以上を指定
"underscore": "^1.12.1"
},
エディタの検索機能などで脆弱性があるパッケージ名で検索をかけて、それが含まれているrequires内を編集します。
node_modules配下を削除
以下のコマンドでnode_modules配下を削除します。
$ rm -rf node_modules/
npm installを再実行
npm installを再実行します。問題なく処理が完了すればOKです。
$ npm install
最後にエラーがないかの確認を実施
再度「npm audit」を実行して、脆弱性がなくなっていればOKです。
$ npm audit
=== npm audit security report ===
found 0 vulnerabilities
in 824 scanned packages

「npm audit fix」でも脆弱性の問題が修正できない場合は、今回紹介した方法を試してみると良いでしょう!
コメント