Featured image of post 依存ライブラリのセキュリティ監査:npm auditとSnykによる自動対策 Featured image of post 依存ライブラリのセキュリティ監査:npm auditとSnykによる自動対策

依存ライブラリのセキュリティ監査:npm auditとSnykによる自動対策

依存ライブラリのセキュリティ脆弱性を自動検知するnpm auditやSnykの実践的な活用法を解説。CI/CDパイプラインに脆弱性スキャンを統合し、サプライチェーン攻撃や既知の脆弱性からプロジェクトを保護する運用アプローチと具体的な修正手順を紹介します。

サプライチェーンのリスク

現代の 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 auditnpm レジストリのアドバイザリデータベース のみを対象とします。すべての 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 auditnpm registry advisoriesnpm audit fix--audit-level=high
Snyknpm, Docker, IaC, ライセンスFix PR, snyk fixGitHub Action, CLI
Dependabotnpm, pip, Docker等自動PRGitHubネイティブ
Renovatenpm, Docker, カスタム自動PR, スケジュール設定可GitHub App

まとめ

依存関係の監査はプロダクションプロジェクトにおいて必須です。ローカルでは npm audit を定期的に実行し、GitHub では Dependabot で自動 PR を有効にし、CI パイプラインに npm audit --audit-level=high を組み込みましょう。さらに深いカバレッジが必要な場合は Snyk を追加してコンテナスキャンやライセンスチェックも行います。多層的なアプローチにより、推移的依存関係の中に潜む脆弱性が本番環境に到達するのを防げます。