🤖

[pnpm] 直接依存していないパッケージのバージョンを上げたい

に公開

はじめに

こんにちは!株式会社 TERASS でエンジニアをしている myrear です。
GitHub では、リポジトリ内で使用しているパッケージに脆弱性があると Dependabot により通知してくれる Dependabot alerts という設定があります。
この設定を有効化したところ1件の critical が通知されました。
リポジトリはパッケージ foo に依存しており、その依存に bar があり、さらに bar が依存している baz@1.0.0 に脆弱性が見つかった、という感じです。

foo <- 直接依存しているパッケージ
└── bar
    └── baz@1.0.0 <- 脆弱性のあるバージョンのパッケージ

Dependabot alerts の通知から直接 PR を作ることもできるのですが、今回 baz はリポジトリが直接依存しているパッケージではなかったため PR を自動で作成することができませんでした。
本記事ではこんな場合の暫定的な対処方法を紹介します。

結論

早速結論ですが pnpm の overrides という設定を利用しました。
これは依存グラフ内の特定のパッケージを特定のバージョンで上書きできる設定です。
下記の例では baz のバージョンを 2.0.0 に上書きしています。

package.json
{
  "pnpm": {
    "overrides": {
      "baz": "2.0.0" // 脆弱性のないバージョン
    }
  }
}

これによりアラートをなくすことができました。
ちなみに pnpm だけでなく npm や yarn にも似たような設定があります。

注意点

脆弱性のない baz のバージョンに bar が対応しているとは限らないため、この方法はあくまで暫定的な対処でしかないことに注意が必要です。
理想的には barbaz のバージョンを脆弱性のないバージョンにアップデートし、さらに foo も同様に bar をアップデートする、という流れになります。
Dependabot alerts にも下記の記載があります。

npm や RubyGems のように、エコシステムに深く複雑な依存関係グラフがある場合、エコシステム全体をアップグレードせずに単一の依存関係をアップグレードすることは不可能な場合があります。

今回の場合 bar にあたるパッケージが DefinitelyTyped でありランタイムへの影響はないだろうということでこのような方法で解決することができました。

おわりに

初めて Dependabot alerts に触れてみましたが、アラートに対応しよう!みたいな情報はいくらでも出てくる割にどう対応するかがあんまりなかったので備忘録として書き残すことにしました。
有効活用してセキュリティリスクを回避していきたいですね。

Terass Tech Blog

Discussion