mcpField
D
dependency-supply-chain-security

dependency-supply-chain-security

github.com/harperaaセキュリティ19252 回インストール45 週間前に更新
リポジトリ

dependency-supply-chain-security について

dependency-supply-chain-securityは、npmプロジェクトの依存関係とサプライチェーンの安全対策をまとめたガイドです。開発者やメンテナー向けに、監査、更新、整合性確認、依存関係の混同やタイポスクワッティングへの対策を説明し、チェック用スクリプトも示します。

主な機能

  1. 01npmの脆弱性監査
  2. 02古い依存関係の確認
  3. 03ロックファイルによるバージョン固定
  4. 04安全な更新とテスト手順
  5. 05セキュリティチェック用スクリプト

活用シーン

  1. 01本番デプロイ前の依存関係監査
  2. 02依存関係の定期確認と更新
  3. 03npmパッケージ追加前のリスク評価
  4. 04CI/CDへの依存関係監査の組み込み

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/harperaa/secure-claude-skills --skill dependency-supply-chain-security

インストール後、Claude Code で/dependency-supply-chain-securityを入力して読み込まれたか確認します。

詳細

依存関係とサプライチェーンのセキュリティ

依存関係に潜むリスク

アプリケーションには、数百の npm パッケージが含まれています。各パッケージは他の誰かが作成したコードであり、アプリケーション内で完全な権限を持って実行されます。

深刻な統計データ

Sonatype の「2024 State of the Software Supply Chain Report」によると:

  • npm に公開された悪意のあるパッケージは245,000件(2023年)
  • サプライチェーン攻撃は700%増加(2022年比)
  • アプリケーションには平均で200以上の依存関係がある
  • 各依存関係には平均で5つの推移的依存関係(依存関係が依存するパッケージ)がある
実際に発生したサプライチェーン攻撃

event-stream のインシデント(2018年): 人気の npm パッケージ(週あたり200万ダウンロード)が乗っ取られました。攻撃者は暗号資産ウォレットのキーを盗むコードを追加しました。発覚するまでに数千のアプリケーションが影響を受けました。

ua-parser-js のインシデント(2021年): 週あたり800万ダウンロードされていたパッケージが侵害されました。攻撃者は暗号資産のマイニングとパスワード窃取を行うコードを追加しました。

colors.js / faker.js のインシデント(2022年): メンテナーが抗議のため、意図的にパッケージを破損させました。数百万のアプリケーションが動作しなくなり、単一障害点のリスクが明らかになりました。

依存関係のセキュリティアーキテクチャ

現在の状況
  • ✅ すべての依存関係が最新
  • ✅ Next.js 15.5.4(最新の安定版)
  • ✅ 既知の脆弱性は0件(npm audit)
  • ✅ package-lock.json をコミット済み(再現可能なビルド)
Next.js 15.5.4 を採用している理由

3つのセキュリティ脆弱性を修正するため、15.3.5 から 15.5.4 に更新しました:

  • キャッシュキーの混同(中程度)
  • コンテンツインジェクション(中程度)
  • ミドルウェアのリダイレクト経由の SSRF(中程度)

フレームワークを最新の状態に保つことは重要です。 Snyk の調査によると、脆弱性の80%には数日以内にパッチが提供されますが、パッチ適用までの平均期間は148日です。

実装ファイル

  • scripts/security-check.sh - npm audit を実行し、古いパッケージを表示します
  • package-lock.json - 正確なバージョンを固定します(サプライチェーンの一貫性)

セキュリティ監査の実行

基本監査
# Check for vulnerabilities
npm audit

# Output shows:
# - Severity (critical, high, moderate, low)
# - Vulnerability description
# - Affected package
# - Recommended fix
本番環境のみの監査
# Only check production dependencies (ignores devDependencies)
npm audit --production

本番環境へのデプロイ前に毎回実行してください。 脆弱性が0件であることを確認してください。

セキュリティチェックの自動化スクリプト
# Run our comprehensive security check
bash scripts/security-check.sh

実行内容:

  1. npm audit を実行します(脆弱性を表示)
  2. npm outdated を実行します(古いパッケージを表示)
  3. 修正コマンドを提示します

想定される出力:

=== Security Audit ===
found 0 vulnerabilities

=== Outdated Packages ===
Package    Current  Wanted  Latest  Location
next       15.5.4   15.5.4  15.5.4  node_modules/next

✓ All packages up to date!

脆弱性の修正

自動修正(安全)
# Fix vulnerabilities with patch/minor version updates
npm audit fix

実行内容:

  • 最新のパッチバージョンに更新します(例:1.2.3 → 1.2.4)
  • 最新のマイナーバージョンに更新します(例:1.2.3 → 1.3.0)
  • 安全です: 破壊的変更はありません
強制修正(リスクあり)
# Fix vulnerabilities with major version updates
npm audit fix --force

⚠️ 警告: 破壊的変更が発生する可能性があります!

実行内容:

  • 最新のメジャーバージョンに更新します(例:1.2.3 → 2.0.0)
  • API が変更されている場合、コードが動作しなくなる可能性があります

--force の実行後:

  1. 変更点を確認します:git diff package.json package-lock.json
  2. 更新したパッケージの移行ガイドを読みます
  3. テストを実行します:npm test
  4. アプリを手動でテストします
  5. すべて正常に動作する場合のみコミットします
手動更新
# Update specific package
npm update package-name

# Update to specific version
npm install [email protected]

# Update all packages to latest (respecting semver)
npm update

依存関係の更新戦略

毎月のルーティン(30分)
# 1. Check for outdated packages
npm outdated

# 2. Review what's outdated and why
# Check changelogs for major updates

# 3. Update safe packages (patch/minor)
npm update

# 4. Run audit
npm audit

# 5. Fix vulnerabilities
npm audit fix

# 6. Test everything
npm test
npm run build

# 7. Commit if successful
git add package.json package-lock.json
git commit -m "chore: update dependencies"
本番環境へのデプロイ前に毎回実行
# Must show 0 vulnerabilities
npm audit --production

脆弱性が見つかった場合:

  1. npm audit fix を実行します
  2. 十分にテストします
  3. 修正によって問題が発生した場合は、代替パッケージを調査します
  4. 既知の脆弱性がある状態でデプロイしてはいけません
フレームワークのメジャーアップデート(四半期ごと)

Next.js のメジャーアップデート(例:15.x → 16.x)がリリースされた場合:

# 1. Read upgrade guide
# https://nextjs.org/docs/upgrading

# 2. Create new branch
git checkout -b upgrade-nextjs-16

# 3. Update Next.js
npm install next@latest react@latest react-dom@latest

# 4. Follow migration guide
# Update deprecated APIs
# Test all features

# 5. Run full test suite
npm test
npm run build
npm run lint

# 6. Test locally
npm run dev
# Click through all features

# 7. Deploy to staging first
# Test in production-like environment

# 8. If successful, deploy to production

サプライチェーン攻撃の防止

1. Package-lock.json(必ずコミット)
# Package-lock.json ensures:
# - Exact versions installed
# - Reproducible builds
# - Detect tampering

✅ package-lock.json を git にコミットしてください

❌ package-lock.json を .gitignore に追加してはいけません

2. パッケージの整合性を検証
# npm automatically verifies package integrity using
# checksums from package-lock.json

# If integrity check fails:
# Error: integrity checksum failed

これにより、以下の脅威から保護されます:

  • npm レジストリ上の改ざんされたパッケージ
  • ダウンロード中の中間者攻撃
  • 破損したパッケージ
3. 新しいパッケージはインストール前に監査する

新しいパッケージを追加する前に:

  1. npm のページを確認します: https://www.npmjs.com/package/PACKAGE_NAME

    • 週間ダウンロード数(人気があるほど、より審査されている可能性があります)
    • 最終更新日(最近もメンテナンスされていますか?)
    • 依存しているパッケージの数(広く使われていますか?)
    • GitHub のスター数/Issue 数
  2. タイポスクワッティングがないか確認します:

    • react ✅(正しい)
    • raect ❌(パッケージ名の誤字で、悪意のある可能性があります)
    • reacct ❌(パッケージ名の誤字で、悪意のある可能性があります)
  3. パッケージのメンテナーを確認します:

    • 認証済みのメンテナーを探します
    • GitHub のプロフィールを確認します
    • メンテナーが複数いるほうが望ましいです
  4. GitHub を確認します:

    • スター数(人気の指標)
    • オープンな Issue(メンテナンスされていますか?)
    • 最近のコミット
    • コードの品質
  5. インストール後に監査を実行します:

    npm install new-package
    npm audit
    
4. クリーンインストールには npm ci を使う
# In CI/CD pipelines, use:
npm ci

# Instead of:
npm install

npm ci を使う理由:

  • package-lock.json の内容どおりにインストールします
  • package.json と package-lock.json の内容に不整合があると失敗します
  • インストール前に node_modules を削除します
  • CI/CD でより高速かつ信頼性の高い方法です
5. 危険なパッケージを避ける

次のようなパッケージは絶対にインストールしないでください:

  • ダウンロード数が極端に少ない(週 100 回未満)
  • 公開されたばかり(数週間待ちます)
  • 不審な名前が付いている(タイポスクワッティング)
  • 通常とは異なる権限を要求する
  • ソースコードを確認できない

危険なパッケージの例(実際に発生した事例):

  • crossenv(cross-env の誤字で、悪意のあるものでした)
  • babelcli(babel-cli の誤字で、悪意のあるものでした)
  • mongose(mongoose の誤字で、悪意のあるものでした)

依存関係の混同攻撃

概要

攻撃者が、内部パッケージと同じ名前の悪意あるパッケージを公開します。npm が代わりに悪意あるパッケージをインストールする可能性があります。

実例
# Internal package (not on npm)
"@mycompany/auth": "1.0.0"

# Attacker publishes to npm
"@mycompany/auth": "99.0.0"

# npm might install attacker's version!
防止策
  1. 内部パッケージにはスコープ付きパッケージを使います:

    {
      "name": "@mycompany/internal-package"
    }
    
  2. スコープ付きパッケージには、内部レジストリのみを使うよう npm を設定します:

    # .npmrc
    @mycompany:registry=https://npm.mycompany.com
    
  3. 内部パッケージを公開 npm に公開しないでください

Scripts/security-check.sh

#!/bin/bash

echo "================================="
echo "Security & Dependency Check"
echo "================================="
echo ""

echo "=== Security Audit ==="
npm audit --production

echo ""
echo "=== Outdated Packages ==="
npm outdated

echo ""
echo "================================="
echo "To fix vulnerabilities:"
echo "  npm audit fix              (safe patch/minor updates)"
echo "  npm audit fix --force      (risky major updates)"
echo ""
echo "To update outdated packages:"
echo "  npm update                 (respects semver)"
echo "  npm update package-name    (specific package)"
echo "================================="

セキュリティをさらに強化するために Snyk を使う

Snyk をインストールする
npm install -g snyk

# Authenticate
snyk auth
脆弱性をスキャンする
# Test project
snyk test

# Monitor project (continuous monitoring)
snyk monitor

# Test specific package before installing
snyk test package-name
CI/CD に追加する
# .github/workflows/security.yml
name: Security Audit

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  schedule:
    # Run daily at 2am
    - cron: '0 2 * * *'

jobs:
  security:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm ci

      - name: Run npm audit
        run: npm audit --production

      - name: Check for outdated packages
        run: npm outdated || true

      - name: Run Snyk test
        run: npx snyk test --severity-threshold=high
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

新たな脆弱性を監視する

GitHub Dependabot

GitHub で有効にします:

  1. リポジトリの Settings に移動します
  2. Security & analysis を選択します
  3. 「Dependabot alerts」を有効にします
  4. 「Dependabot security updates」を有効にします

できること:

  • 依存関係を毎日スキャンします
  • 脆弱性が見つかると PR を作成します
  • 修正バージョンに自動で更新します
  • 内容を確認してマージします
CI/CD での npm Audit
# Add to CI/CD pipeline
npm audit --production --audit-level=moderate

次の場合にビルドを失敗させます:

  • 中程度以上の脆弱性が見つかった場合
  • デプロイ前に修正することを徹底できます

依存関係のセキュリティで防げること

✅ 既知の脆弱性の悪用 - 定期的な監査で CVE を検出します ✅ 悪意あるパッケージの混入 - 検証によって改ざんを防ぎます ✅ サプライチェーン攻撃 - Package-lock.json と検証で防ぎます ✅ 依存関係の混同 - スコープ付きパッケージとレジストリ設定で防ぎます ✅ タイポスクワッティング攻撃 - インストール前の手動確認で防ぎます ✅ 脆弱性のある古いコード - 定期的な更新で防ぎます ✅ ゼロデイ攻撃を受ける期間 - 迅速なパッチ適用でリスクを軽減します

避けるべきよくある間違い

❌ npm audit の警告を無視しないでください ❌ 非推奨のパッケージを使わないでください ❌ 依存関係の更新後にテストを省略しないでください ❌ package-lock.json を .gitignore に追加しないでください ❌ 事前に確認せずにパッケージをインストールしないでください ❌ テストせずに npm audit fix --force を実行しないでください

✅ デプロイの前に毎回 npm audit を実行してください ✅ package-lock.json をコミットしてください ✅ 新しいパッケージはインストール前に検証してください ✅ 依存関係を毎月更新してください ✅ Dependabot alerts を有効にしてください ✅ CI/CD では npm ci を使ってください

コマンド早見表

# Check for vulnerabilities
npm audit
npm audit --production

# Fix vulnerabilities
npm audit fix              # Safe
npm audit fix --force      # Risky, test thoroughly

# Check outdated packages
npm outdated

# Update packages
npm update                 # All packages
npm update package-name    # Specific package

# Install from lock file (CI/CD)
npm ci

# Run security check script
bash scripts/security-check.sh

# Test with Snyk
npx snyk test

参考資料

次のステップ

  • デプロイ前のチェックには、security-testing スキルを使用します
  • CI/CD との統合には、パイプラインに npm audit を追加します
  • 監視には、GitHub Dependabot のアラートを有効にします
  • スキャン機能を強化するには、Snyk をインストールします

コメント