dependency-supply-chain-security について
dependency-supply-chain-securityは、npmプロジェクトの依存関係とサプライチェーンの安全対策をまとめたガイドです。開発者やメンテナー向けに、監査、更新、整合性確認、依存関係の混同やタイポスクワッティングへの対策を説明し、チェック用スクリプトも示します。
主な機能
- 01npmの脆弱性監査
- 02古い依存関係の確認
- 03ロックファイルによるバージョン固定
- 04安全な更新とテスト手順
- 05セキュリティチェック用スクリプト
活用シーン
- 01本番デプロイ前の依存関係監査
- 02依存関係の定期確認と更新
- 03npmパッケージ追加前のリスク評価
- 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
実行内容:
npm auditを実行します(脆弱性を表示)npm outdatedを実行します(古いパッケージを表示)- 修正コマンドを提示します
想定される出力:
=== 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 の実行後:
- 変更点を確認します:
git diff package.json package-lock.json - 更新したパッケージの移行ガイドを読みます
- テストを実行します:
npm test - アプリを手動でテストします
- すべて正常に動作する場合のみコミットします
手動更新
# 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
脆弱性が見つかった場合:
npm audit fixを実行します- 十分にテストします
- 修正によって問題が発生した場合は、代替パッケージを調査します
- 既知の脆弱性がある状態でデプロイしてはいけません
フレームワークのメジャーアップデート(四半期ごと)
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. 新しいパッケージはインストール前に監査する
新しいパッケージを追加する前に:
-
npm のページを確認します: https://www.npmjs.com/package/PACKAGE_NAME
- 週間ダウンロード数(人気があるほど、より審査されている可能性があります)
- 最終更新日(最近もメンテナンスされていますか?)
- 依存しているパッケージの数(広く使われていますか?)
- GitHub のスター数/Issue 数
-
タイポスクワッティングがないか確認します:
react✅(正しい)raect❌(パッケージ名の誤字で、悪意のある可能性があります)reacct❌(パッケージ名の誤字で、悪意のある可能性があります)
-
パッケージのメンテナーを確認します:
- 認証済みのメンテナーを探します
- GitHub のプロフィールを確認します
- メンテナーが複数いるほうが望ましいです
-
GitHub を確認します:
- スター数(人気の指標)
- オープンな Issue(メンテナンスされていますか?)
- 最近のコミット
- コードの品質
-
インストール後に監査を実行します:
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!
防止策
-
内部パッケージにはスコープ付きパッケージを使います:
{ "name": "@mycompany/internal-package" } -
スコープ付きパッケージには、内部レジストリのみを使うよう npm を設定します:
# .npmrc @mycompany:registry=https://npm.mycompany.com -
内部パッケージを公開 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 で有効にします:
- リポジトリの Settings に移動します
- Security & analysis を選択します
- 「Dependabot alerts」を有効にします
- 「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
参考資料
- npm Audit のドキュメント:https://docs.npmjs.com/cli/v8/commands/npm-audit
- OWASP Dependency Check:https://owasp.org/www-project-dependency-check/
- Sonatype Supply Chain Report:https://www.sonatype.com/state-of-the-software-supply-chain
- Snyk:https://snyk.io/
- GitHub Dependabot:https://docs.github.com/en/code-security/dependabot
次のステップ
- デプロイ前のチェックには、
security-testingスキルを使用します - CI/CD との統合には、パイプラインに npm audit を追加します
- 監視には、GitHub Dependabot のアラートを有効にします
- スキャン機能を強化するには、Snyk をインストールします