依存関係監査スキル
プロジェクトの依存関係に関する完全な監査レポートを作成します。セキュリティ脆弱性(CVE 参照付き)、ポリシーに照らしたライセンスの遵守状況、リスクの優先度順に並べた古いパッケージ、推移的依存関係のリスク分析、具体的なタイムラインを含む修正計画を網羅します。優れた依存関係監査では、誰も対応しない監査結果の生データを並べるのではなく、チームが明確に優先順位を付けて行動できるリストを提示します。
必要な入力
まだ提供されていない場合は、以下を確認してください。
- プロジェクトの言語とエコシステム — npm、pip/PyPI、Maven/Gradle、Go modules、Cargo、RubyGems、NuGet、または混在
- 依存関係リストまたはパッケージマニフェスト —
package.json、requirements.txt、go.mod、pom.xml などの内容を貼り付けるか、監査ツールの出力を提示してください
- ライセンスポリシー — 許可されているライセンス、制限されているライセンス(例:「GPLは禁止」、「MIT/Apache/BSD のみ」、または「まだポリシーがないため、推奨案が必要」)
- 現在のセキュリティツール — Dependabot、Snyk、OWASP Dependency-Check、npm audit、pip-audit、またはなし
出力形式
依存関係監査レポート:[Project Name]
エコシステム: [npm / pip / Maven / Go / など]
監査日: [Date]
監査担当者: [Name]
直接依存関係の合計: [N]
推移的依存関係の合計: [N]
使用した監査ツール: [npm audit / pip-audit / Snyk / OWASP Dependency-Check / など]
エグゼクティブサマリー
| カテゴリ | 検出事項 | リスクレベル |
|---|
| 重大な脆弱性 | 直ちに対応が必要な CVE が [N] 件 | [重大 / 高 / 低] |
| 高リスクの脆弱性 | CVE が [N] 件 — 7 日以内に修正 | [高 / 中] |
| ライセンス違反 | 非準拠ライセンスのパッケージが [N] 件 | [高 / 低] |
| 大幅に古いパッケージ | 2 つ以上前のメジャーバージョンのパッケージが [N] 件 | [中] |
| メンテナンスが停止しているパッケージ | 12 か月以上コミットがないパッケージが [N] 件 | [中] |
| 依存関係全体の健全性スコア | [Score]/100 | [赤 / 黄 / 緑] |
スコア算出方法: 重大な CVE:1 件につき −20 点。高リスクの CVE:1 件につき −10 点。ライセンス違反:1 件につき −15 点。放置されたパッケージ:1 件につき −5 点。減点の上限:100 点。スコアが 80 以上 = 緑、60~79 = 黄、60 未満 = 赤。
直ちに必要な対応:
- [最も重要な対応 — 例:「CVE-2021-23337(重大 — プロトタイプ汚染)を修正するため、lodash を 4.17.11 から 4.17.21 にアップグレードする」]
- [2 つ目の対応]
- [3 つ目の対応]
1. セキュリティ脆弱性の検出結果
重大および高リスク(24~72 時間以内に対応)
| パッケージ | インストール済みバージョン | 修正バージョン | CVE | 深刻度 | CVSS スコア | 説明 | 悪用可能性 |
|---|
| [package-name] | [X.Y.Z] | [A.B.C] | [CVE-YYYY-NNNNN] | 重大 | [9.x] | [merge 関数を介したプロトタイプ汚染 — リモートコード実行の可能性あり、など] | [既知のエクスプロイト / PoC あり / 既知のエクスプロイトなし] |
| [package-name] | [X.Y.Z] | [A.B.C] | [CVE-YYYY-NNNNN] | 高 | [7.x] | [ファイル配信ユーティリティのパストラバーサルなど] | [PoC あり] |
| [package-name] | [X.Y.Z] | [A.B.C] | [CVE-YYYY-NNNNN] | 高 | [7.x] | [正規表現によるサービス拒否(ReDoS)など] | [既知のエクスプロイトなし] |
中リスク(30 日以内に修正)
| パッケージ | インストール済みバージョン | 修正バージョン | CVE | 深刻度 | CVSS スコア | 説明 |
|---|
| [package-name] | [X.Y.Z] | [A.B.C] | [CVE-YYYY-NNNNN] | 中 | [5.x] | [説明] |
| [package-name] | [X.Y.Z] | [A.B.C] | [CVE-YYYY-NNNNN] | 中 | [4.x] | [説明] |
低リスク(90 日以内に修正するか、リスクを受容)
| パッケージ | インストール済みバージョン | 修正バージョン | CVE | 深刻度 | 説明 |
|---|
| [package-name] | [X.Y.Z] | [A.B.C] | Low | [説明] | |
修正が提供されていない脆弱性
| パッケージ | CVE | 深刻度 | 推奨される緩和策 |
|---|
| [package-name] | [CVE-YYYY-NNNNN] | [高] | [例:「このパッケージを削除する — 代替: [replacement]」] |
| [package-name] | [CVE-YYYY-NNNNN] | [中] | [例:「ベンダーが修正を進めています — [URL] の課題を追跡してください。[X] によってリスクを緩和してください」] |
2. ライセンスコンプライアンスマトリックス
ライセンスポリシーの参照
| ライセンス | カテゴリ | ポリシー | 備考 |
|---|
| MIT | 寛容型 | 許可 | 配布製品では著作権表示が必要です |
| Apache 2.0 | 寛容型 | 許可 | 著作権表示とNOTICEファイルが必要です |
| BSD 2-Clause / 3-Clause | 寛容型 | 許可 | 著作権表示が必要です |
| ISC | 寛容型 | 許可 | |
| MPL 2.0 | 弱いコピーレフト | レビュー後に許可 | 変更したMPLファイルのみ、ソースコードの開示が必要です |
| LGPL v2 / v3 | 弱いコピーレフト | レビュー後に許可 | 動的リンクは許可されています。静的リンクでは開示が必要になる場合があります |
| GPL v2 / v3 | 強いコピーレフト | 制限あり | コードベース全体のオープンソース化が必要になる場合があります。法務レビューが必要です |
| AGPL v3 | 強いコピーレフト | 制限あり | ネットワーク経由での使用によりコピーレフトが適用されます。特にSaaSではリスクが高くなります |
| SSPL | ソースコード公開型 | 禁止 | OSI承認ライセンスではありません。プロプライエタリとして扱ってください |
| プロプライエタリ / 商用 | 商用 | 契約が必要 | ライセンスが現在のユースケースと規模を対象としていることを確認してください |
| 不明 / ライセンスなし | — | 禁止 | ライセンスがない場合、すべての権利が留保されており、合法的に使用できません |
調査結果:コンプライアンス上の問題があるパッケージ
| パッケージ | ライセンス | 問題 | 推奨事項 | 未対応の場合のリスク |
|---|
| [package-name] | GPL v3 | コピーレフトにより、このプロジェクトのオープンソース化が必要になる場合があります | [alternative] に置き換えるか、法務部門の承認を得てください | 法務 / 知的財産リスク |
| [package-name] | AGPL v3 | ネットワーク経由でコピーレフトが適用されるため、SaaSでの使用には開示が必要です | [alternative] に置き換えてください | 法務 / 知的財産リスク |
| [package-name] | プロプライエタリ | ライセンスが現在の利用プランを対象としていない可能性があります | ベンダーにライセンスの適用範囲を確認してください | 契約違反 |
| [package-name] | 不明 | パッケージのメタデータにライセンスが記載されていません | メンテナーに問い合わせるか、別のものに置き換えてください | 合法的に使用できません |
使用中のすべてのライセンス(全件一覧)
| ライセンス | パッケージ数 | コンプライアンス状況 |
|---|
| MIT | [N] | 準拠 |
| Apache 2.0 | [N] | 準拠 |
| BSD-3-Clause | [N] | 準拠 |
| ISC | [N] | 準拠 |
| MPL 2.0 | [N] | レビューが必要 |
| GPL v3 | [N] | 非準拠 |
| 不明 | [N] | 非準拠 |
3. 古いパッケージの分析
大幅に古い(メジャーバージョンが2つ以上遅れている — アップグレード作業が多い)
| パッケージ | インストール済み | 最新の安定版 | 遅れているバージョン数 | 最終更新日 | 破壊的変更の概要 |
|---|
| [package-name] | [1.x.x] | [3.x.x] | メジャー2つ | [Date] | [例:「v2でAPIを再設計、v3で非同期処理を追加」] |
| [package-name] | [0.x.x] | [2.x.x] | メジャー2つ | [Date] | [概要] |
やや古い(メジャーバージョンが1つ遅れている)
| パッケージ | インストール済み | 最新の安定版 | 遅れているバージョン数 | 新しいバージョンにセキュリティ修正が含まれていますか? |
|---|
| [package-name] | [2.x.x] | [3.x.x] | メジャー1つ | [はい — CVE-YYYY-NNNNN / いいえ] |
| [package-name] | [4.x.x] | [5.x.x] | メジャー1つ | [いいえ] |
マイナー / パッチ更新が利用可能(更新リスクは低い)
| パッケージ | インストール済み | 最新 | セキュリティ修正が含まれていますか? |
|---|
| [package-name] | [2.3.1] | [2.3.9] | [はい / いいえ] |
| [package-name] | [1.0.0] | [1.2.1] | [いいえ] |
4. 依存関係グラフのリスク分析
推移的依存関係のリスク
推移的(間接的)依存関係は明示的に管理されていないため、リスクを伴います。このプロジェクトでリスクが最も高い推移的依存関係は次のとおりです。
| 脆弱性のある推移的依存関係 | 依存元 | インストール済みバージョン | 修正の有無 | 対応 |
|---|
| [transitive-package] | [direct-parent] | [X.Y.Z] | [はい — [parent] を [version] にアップグレード] | 直接依存関係 [parent] をアップグレード |
| [transitive-package] | [direct-parent] | [X.Y.Z] | [いいえ] | [parent] を削除するか、[alternative] を使用 |
依存関係の集中リスク
これらのパッケージは、プロジェクト内の多くのパッケージから依存されています。脆弱性や非推奨化が発生すると、広範囲に影響が及びます。
| パッケージ | 依存しているパッケージ数(N) | 活発にメンテナンスされていますか? | リスクレベル |
|---|
| [package-name] | [N] | [はい/いいえ — 最終コミット:date] | [高/中] |
| [package-name] | [N] | [はい] | [中] |
放棄/メンテナンスされていないパッケージ
| パッケージ | 最終リリース | 最終コミット | 週間ダウンロード数 | 推奨する代替パッケージ |
|---|
| [package-name] | [Date] | [Date] | [N] | [alternative-package] |
| [package-name] | [Date] | [Date] | [N] | [メンテナンスされているフォーク:URL] |
5. 修正計画
30日間の計画
第1週 — 重大な脆弱性(1~7日目)
| 対応 | 担当者 | パッケージ | 作業時間 | 備考 |
|---|
| [package] を [old] から [new] にアップグレード | [Name] | [package-name] | [30 min] | [API の変更なし/破壊的変更のガイドを確認:URL] |
| [package] を [alternative] に置き換え | [Name] | [package-name] | [2 hours] | [修正がないため、置き換えが必要] |
| [transitive-dep] のパッチをオーバーライド | [Name] | [transitive-dep] | [15 min] | [マニフェストに resolutions/overrides エントリを追加] |
# Commands for Week 1 upgrades:
# npm
npm install [package]@[target-version]
npm audit fix --force # use with caution — may introduce breaking changes
# pip
pip install --upgrade [package]==[target-version]
pip-audit --fix # if using pip-audit
# Go
go get [module]@[version]
go mod tidy
# Maven
# Update pom.xml version property, then:
mvn versions:use-latest-releases -DallowMajorUpdates=false
mvn dependency:resolve
第2週 — 高リスクの脆弱性とライセンス違反(8~14日目)
| 対応 | 担当者 | パッケージ | 作業時間 | 備考 |
|---|
| [package] をアップグレード | [Name] | [package-name] | [1 hour] | |
| GPL ライセンスの [package] を置き換え | [Name] | [package-name] | [4 hours] | [代替パッケージ:[package]] |
| [package] のライセンスを法務部門がレビュー | 法務部門 | [package-name] | [法務部門の SLA] | [[process] から申請] |
第3週 — 中リスクの脆弱性と放棄されたパッケージ(15~21日目)
| 対応 | 担当者 | パッケージ | 作業時間 | 備考 |
|---|
| [package] をアップグレード | [Name] | [package-name] | [30 min] | |
| 放棄された [package] を置き換え | [Name] | [package-name] | [2 hours] | [メンテナンスされているフォークまたは代替パッケージ:[URL]] |
第4週 — プロセスの改善(22~30日目)
| 対応 | 担当者 | 作業時間 | 備考 |
|---|
| 自動 PR 用に Dependabot / Renovate を有効化 | [Name] | [2 hours] | [設定はセクション 6] |
CI に npm audit / pip-audit を追加 — Critical/High で失敗させる | [Name] | [1 hour] | [設定はセクション 6] |
| CONTRIBUTING.md にライセンスポリシーを記載 | [Name] | [1 hour] | [セクション 2 のポリシーに基づく] |
| 次回の四半期監査を予定 | [Name] | [15 min] | [チームのカレンダーに追加] |
6. ポリシーに関する推奨事項
CI での脆弱性スキャンの自動化
マージ前に脆弱性を検出できるよう、以下を CI パイプラインに追加します。
# GitHub Actions — adapt for your CI platform
dependency-audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# npm
- name: npm audit
run: npm audit --audit-level=high
# Fails build on High or Critical vulnerabilities
# pip
- name: pip-audit
run: |
pip install pip-audit
pip-audit --requirement requirements.txt --severity high
# Go
- name: govulncheck
run: |
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...
Dependabot / Renovate の設定
# .github/dependabot.yml — automated dependency update PRs
version: 2
updates:
- package-ecosystem: "[npm / pip / gomod / maven]"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 10
labels:
- "dependencies"
- "automated"
ignore:
# Ignore major version bumps — review these manually
- dependency-name: "*"
update-types: ["version-update:semver-major"]
ライセンスのスキャン
# npm — license checker
npx license-checker --onlyAllow 'MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC' \
--failOn 'GPL;AGPL;LGPL'
# Python — pip-licenses
pip install pip-licenses
pip-licenses --allow-only="MIT;Apache Software License;BSD License;ISC License" \
--fail-on="GNU General Public License"
# Go — go-licenses
go install github.com/google/go-licenses@latest
go-licenses check ./... --allowed_licenses=MIT,Apache-2.0,BSD-2-Clause,BSD-3-Clause
7. 依存関係の健全性スコアの詳細
| カテゴリ | 最高点 | スコア | 備考 |
|---|
| 重大な脆弱性なし | 30 | [N]/30 | 重大な CVE ごとに −20 |
| 高リスクの脆弱性なし | 20 | [N]/20 | 高リスクの CVE ごとに −10 |
| ライセンスの準拠 | 20 | [N]/20 | 違反ごとに −15 |
| 放棄されたパッケージなし | 15 | [N]/15 | 放棄されたパッケージごとに −5 |
| メジャーバージョンが最新 | 10 | [N]/10 | メジャーバージョンが遅れているごとに −2 |
| 自動スキャンが有効 | 5 | [N]/5 | 達成か未達成かの二択 |
| 合計 | 100 | [Score]/100 | [赤/黄/緑] |
品質チェック
アンチパターン
トリガーとなるフレーズの例
- 「依存関係を監査して。」
- 「パッケージのセキュリティを確認して。」
- 「ライセンスコンプライアンスを確認して。」
- 「依存関係の健全性を評価して。」
- 「脆弱性レポートを作成して。」