💂‍♀️

GitHub の npm security vulnerability アラートを強制的に解決する方法

2021/08/05に公開

GitHub リポジトリの Dependabot alerts 機能をオンにしていると、脆弱性が確認された npm モジュールのバージョンを上げるように警告が飛んできます。

その場合、対象のモジュールを直接リポジトリで使っている場合は対処が簡単なのですが、依存関係の根の深いところに使っていると割と大変です。

例えば、Aというモジュールに脆弱性が報告されたとして、

  • AというモジュールにBが依存している
  • BというモジュールにCが依存している
  • Cを自分のリポジトリが使っている

という感じになっている場合、まず B のメンテナが A の新しいバージョンを使ってリリースし、その後に C のメンテナが B の新しいバージョンを使ってリリースし、それから自分が C のバージョンを上げないといけません。
善意で成り立っている OSS コミュニティの場合、こういう作業は得てして遅かったりしますし、自分で PR を送ってもなかなか反応がないこともあります。

この問題に対して npm-force-resolutions を使うと強制的に解決できることを知ったのでメモしておきます。

例として minimist というモジュールに脆弱性が報告されており、これを解消したいものとします。
まず、npm install minimist --save-dev で最新バージョンを devDependencies として入れます。このときに最新バージョンがいくつか確認しておきます。ここでは minimist@1.2.5 だったとしましょう。
次に、package.jsonresolutions という項目を以下のように追加します。

  "resolutions": {
    "minimist": "^1.2.5"
  }

また、npm scripts に preinstall のスクリプトを追加します。

  "scripts": {
    "preinstall": "npx npm-force-resolutions"
  }

これで npm install をすると、依存関係の根の深いところでも minimist@1.2.5 を使うようになります。インストールが終わったら npm ls minimist で確認してみるとよいでしょう。

なお、脆弱性のある方の古いバージョンに依存しているモジュールがある場合、この方法で強制的に更新すると動かなくなることも起こりうるので、あくまで最終手段として捉えておいてください。

参考

Discussion