1. 何が起きたか
GitHub Dependabot から、あるパッケージの脆弱性アラートが届いた。
しかし自分の package.json を確認すると、そのパッケージは「直接」依存に含まれていない。なぜ脆弱性が発生するのか分からない状態から調査。
2. package.json を確認
- dependencies
- devDependencies
両方を確認したが、該当パッケージは見当たらない。
→ 間接依存(transitive dependency)に存在する可能性が高い
3. 依存ツリーを確認して原因を特定
実際に依存関係を見るためにコマンドを実行(npm の場合)
npm ls <パッケージ名>
すると、複数のライブラリが内部的に問題のパッケージを利用していることが判明。
典型的な例:
- Jest
- Storybook
- ESLint
- Babel
- Webpack
- Tailwind
など、ビルドツールやテストツールが内部で色々なパッケージを引き込む。
→ 直接依存していなくても、内部で使われているため脆弱性が出る。
4. 一番問題のパッケージ(原因箇所)を特定
依存ツリーを見て、
どのパッケージ経由で問題バージョンが入っているかを特定する。
ツールA → 内部依存X → 問題のパッケージ
5. package.json の overrides で依存を強制上書き
npm では overrides を使って依存ツリー全体のバージョンを書き換えることができる。
{
"overrides": {
"<パッケージ名>": "<安全なバージョン>"
}
}
この仕組みを使うと、
- 直接依存していない
- どのライブラリが引き込んでいるかも関係ない
という状況でも、
依存ツリー全体の問題バージョンを安全なバージョンへ一括置換できる。
6. 再インストールして反映確認
npm install
npm ls <パッケージ名>
すべての依存が安全バージョンに統一されていることを確認。
7. 動作確認
依存を書き換えたことでアプリに影響が出ていないか確認。
npm test
npm run build
npm run dev
- 開発ツール
- 本番ビルド
- Storybook
- テストランナー
などが正常に動作することを確認。
8. まとめ
- 直接依存していなくても Dependabot から警告が来る理由は間接依存に存在するため
- npm ls により実際の依存ツリーを確認できる
- overrides で安全バージョンに固定すると解決