Node.jsのパッケージ管理ツール「npm」のバージョン6から、npm audit
コマンドでセキュリティチェックが可能になりました。
さらに、バージョン6.1.0ではチェックと同時にエラーも修正してくれるnpm audit fix
のコマンドも追加されました。
【関連】脆弱性の警告を受けたnpmパッケージの依存関係を力技で直す
僕がこのauditコマンドを初めて使ったのはバージョン公開後半年以上経ってからだったんですが、僕の環境と相性が悪いのか、npm audit fix
でエラーが解決できた試しがありません。
かれこれ4回ほど失敗しているのではないでしょうか。パトラッシュ、僕はもう疲れたよ。。
で、もしかしたら僕と同じ「npm audit fix難民」がいるかもしれないと思い、この度解決策をまとめました。
以下の手順を参考に進めてみてください。
エラー内容の確認
まず、npm audit
コマンドをターミナルで打ち、エラーの詳細を確認します。

この例だと、npm→libcipm→npm-lifecycle→node-gypの階層にある「tar」が脆弱性の原因になっていることがわかります。
解決策はPatched inの項目に記載されていて、この例では「バージョンを2.2.2以上3.0.0未満にする」か「4.4.2以上にする」ということだと思います。
間違ってたらごめんなさい(´・ω・`)
まあ、ほとんどの場合、新しいバージョンにするのがベターだと思うので、提示された1番上のバージョンにするのが良いと思います。
修正手順
さて、ここからが具体的な修正手順になります。
修正対象になるファイルは「package-lock.json」で、node_moduledsやpackage.jsonなどと同じ階層にあります。
修正手順を簡単に言うと、依存関係を正常にしてリセット。
なんか色々文字列があって意味不明だと思いますが、依存関係は「requires」の部分なのでそれ以外は削除してOKです。削除してOKというか削除しないとダメです。
ハマりポイントだと思うんですが、該当する部分、今回の例だと「tar」のバージョンを推奨にしても、最終的に元通りになってしまうんですね。
いくつかサンプルを紹介するので参考にしてみてください。
サンプル1

この画像の例だと…

こうなります。requires以外すべて削除し、バージョンを変更しました。
サンプル2

この画像の例だと…

こうなります。一行しかないので行末のカンマを削除するのをお忘れなく。削除しないとエラーになります。
node_modulesの削除と再インストール
さて、依存関係を修正したら、node_modulesを削除して、再インストールします。
rm -rf node_modules/
のコマンドでnode_modulesフォルダが強制的に削除されるので(メッセージなし)、その後に以下のコマンドを入力します。
npm install
エラーがないかどうかの確認
最後にnpm audit
コマンドを入力してエラーが0になっていることが確認できたら終わりです。

もちろん、package-lock.jsonの削除した部分などについても元通りになっているので安心してくださいね。