npmで自動的に修正できないvulnerabilityを解決する

Bash
npmで自動的に修正できないvulnerabilityを解決する

はじめに

gulp関連のパッケージをnpmでインストールした時に、vulnerability(脆弱性)の警告が出ました。

コマンド実行時に表示される案内の通りnpm audit fixを実行しましたが、パッケージの依存関係の都合上、自動的に更新がされませんでした。

パッケージの依存関係に関することなので、どうしようもないかもしれません。ですが、そのまま放置しておくのも落ち着かないので、解決に向けて対応してみました。

注意事項

パッケージの依存バージョンをいじります。各パッケージのバージョン対応の状況により、意図した動作をしなくなるかもしれません。くれぐれも自己責任でお願いいたします。

なお、各パッケージの提供元で脆弱性への対応がされているかもしれませんので、先に確認されることをおすすめします。

では解消していきましょう!

状況の確認をする

npm auditで脆弱性の詳細を確認します。

=== npm audit security report ===

┌──────────────────────────────────────────────────────────────────────────────┐
│                                Manual Review                                 │
│            Some vulnerabilities require your attention to resolve            │
│                                                                              │
│         Visit https://go.npm.me/audit-guide for additional guidance          │
└──────────────────────────────────────────────────────────────────────────────┘
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ High          │ Prototype Pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ dot-prop                                                     │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in    │ >=5.1.1                                                      │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ npm                                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ npm > libnpx > update-notifier > configstore > dot-prop      │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://npmjs.com/advisories/1213                            │
└───────────────┴──────────────────────────────────────────────────────────────┘

この例ではパッケージdot-propでプロトタイプ汚染攻撃に対する脆弱性があるとのこと。そして、バージョン5.1.1以降で修正がなされているようです。他に、依存しているパッケージとパスが表示されています。

基本的な対応方針は、脆弱性があるパッケージに依存しているパッケージ内にて、脆弱性が修正されたバージョンに更新することです。

参考:ところでプロトタイプ汚染攻撃とは?

初めて聞く攻撃です。

ふむふむ…… 🙁

npm lsでパッケージの依存関係をツリー表示してみる

今回の場合、npm ls dot-propしてみると、パッケージの依存関係がツリー表示されます。

└─┬ npm@6.14.7
   (中略)
      └── dot-prop@4.2.0

脆弱性で警告が出ているのはここですね。

package.jsonのdependenciesを修正する

厳密には修正ではなく改変。
dot-propに関する記述を探して、導入するパッケージのバージョンを指定します。

"dot-prop": "^5.1.1",

脆弱性が修正されたバージョン以降が導入されるようにしておきます。

チルダとキャレットのことについては、こちらを参考にしました。いつもど忘れする。

package.json のチルダ(~) とキャレット(^) - Qiita
バージョン指定でいっつもこいつの違いを忘れてしまって、npm とか semver のドキュメントを探すところから始まるから自分用のメモ。^1.1.2 = 1.x~1.1.2 = 1.1.x(追…

パッケージの入れ替え

npm uninstallで一度パッケージをアンインストールします。その後、改めてインストールします。

found 0 vulnerabilities

脆弱性が無事ゼロになりました。

npm ls dot-propでバージョンが変わっているかを確認します。

└─┬ npm@6.14.7
   (中略)
      └── dot-prop@5.2.0

変わってますね。

まとめ

npm audit fixで自動修復できない脆弱性について、マニュアル解決をしてみました。

これまでnpm audit fixを実行し、自動修復できなければ放置していました。試しに使うケースなどでは、そのまま放置していても問題は無いかと思います。ただし、公開前提のプロジェクトなどでは、可能な限り脆弱性には対応しておきたいものです。