サプライチェーンのリスク
現代の JavaScript アプリケーションは数万に及ぶ推移的依存関係(transitive dependencies)を抱えています。そのひとつひとつが攻撃ベクトルになり得ます。2018年の event-stream インシデントでは、悪意あるパッケージが人気ライブラリの依存関係に忍び込み、多くのプロジェクトに影響を与えました。この規模を手動でレビューすることは現実的ではありません。
自動化ツールによる防御が唯一の実用的な対策です。
npm audit
npm audit は依存関係ツリーを npm が管理する脆弱性データベースと照合します。
npm audit
出力は深刻度(critical、high、moderate、low)でグループ化され、脆弱なパス、修正バージョン、CVE 参照が表示されます。
npm audit fix # 安全なバージョンに自動更新
npm audit fix --force # 破壊的変更を許可
--dry-run で適用前の変更をプレビューできます。
限界
npm auditは npm レジストリのアドバイザリデータベース のみを対象とします。すべての CVE をカバーしているわけではありません。- 使用していないコードパスの脆弱性を報告する偽陽性が発生しがちです。
- コマンド実行にはレジストリへのネットワークアクセスが必要です。オフライン環境ではローカルにアドバイザリミラーを用意する必要があります。
Snyk
Snyk は npm だけでなく、package-lock.json、yarn.lock、pnpm-lock.yaml、Docker イメージ、IaC テンプレートまでスキャンします。GitHub / GitLab との統合機能も充実しています。
npm install -g snyk
cd my-project
snyk auth
snyk test
Snyk の特徴:
- Fix PR — 脆弱な依存関係を自動更新するプルリクエストを作成
- ライセンス準拠 — GPL/AGPL パッケージを検出
- コンテナスキャン — Docker イメージ内の OS パッケージ脆弱性を検出
- 到達可能な脆弱性分析 — アプリが実際に使っていないコードパスの脆弱性をフィルタリング
GitHub Dependabot
GitHub ネイティブの Dependabot は、リポジトリの依存関係を監視し自動更新します。
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10
Dependabot はバージョンアップを含む PR を自動生成します。各 PR には変更ログ、リリースノート、深刻度の概要が含まれます。
CI/CD パイプラインへの統合
監査は自動化が必須です。典型的な GitHub Actions ワークフロー:
name: Dependency audit
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci
- run: npm audit --audit-level=high
--audit-level=high を設定すると、high または critical の脆弱性のみでビルドを失敗させ、低重要度のノイズを排除できます。
ロックファイルの安全性
package-lock.json はすべての推移的依存関係の正確なバージョンを固定します。これをコミットしない場合、npm install がインストール時にバージョンを動的に解決し、悪意のあるパッチが紛れ込む可能性があります。
package-lock.jsonを必ずバージョン管理に含める- CI では
npm installではなくnpm ciを使用(決定論的インストール) - 監査ワークフローでロックファイルの検証を有効化
ツール比較
| ツール | スコープ | 修正機構 | CI統合 |
|---|---|---|---|
| npm audit | npm registry advisories | npm audit fix | --audit-level=high |
| Snyk | npm, Docker, IaC, ライセンス | Fix PR, snyk fix | GitHub Action, CLI |
| Dependabot | npm, pip, Docker等 | 自動PR | GitHubネイティブ |
| Renovate | npm, Docker, カスタム | 自動PR, スケジュール設定可 | GitHub App |
まとめ
依存関係の監査はプロダクションプロジェクトにおいて必須です。ローカルでは npm audit を定期的に実行し、GitHub では Dependabot で自動 PR を有効にし、CI パイプラインに npm audit --audit-level=high を組み込みましょう。さらに深いカバレッジが必要な場合は Snyk を追加してコンテナスキャンやライセンスチェックも行います。多層的なアプローチにより、推移的依存関係の中に潜む脆弱性が本番環境に到達するのを防げます。
