software-supply-chain-failures について
サードパーティ依存関係、ビルド、デプロイを管理する Python チーム向けのサプライチェーン監査スキルです。脆弱性スキャン、SBOM 生成、依存関係の固定、CI/CD 強化のガイダンスをまとめています。
主な機能
- 01既知の脆弱性を依存関係からスキャン
- 02SBOM の生成と管理
- 03ハッシュ固定とロックファイルのガイド
- 04推移的依存関係と不審なパッケージの監査
- 05CI/CD 強化チェック
活用シーン
- 01Python プロジェクトの依存関係監査
- 02CI への脆弱性スキャン追加
- 03コンプライアンス向け SBOM 生成
- 04パッケージとビルドのワークフロー強化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scholarly360/ owasp-top10-web-skills --skill software-supply-chain-failuresインストール後、Claude Code で/software-supply-chain-failuresを入力して読み込まれたか確認します。
同梱ファイルreferences/ci-cd-templates.mdreferences/cwe-mapping.md
詳細
ソフトウェアサプライチェーンの障害 — OWASP A03:2025
概要
A03:2025はコミュニティ投票で第1位となった懸念事項であり、OWASP Top 10:2025全体でエクスプロイトスコアが最も高いリスクカテゴリです。該当するCWEは6件のみで、テストデータも限られているにもかかわらず、次のとおりです。
| 指標 | 値 |
|---|---|
| OWASP順位 | #3(新設 — A06:2021「脆弱で古いコンポーネント」を拡張) |
| 平均発生率 | 5.72% |
| 平均エクスプロイトスコア | 8.17(全カテゴリ中最高) |
| 平均影響スコア | 5.23(全カテゴリ中最高) |
| 主なCWE | CWE-1104、CWE-1395、CWE-1329 |
主なCWE:
- CWE-1104 — 保守されていないサードパーティコンポーネントの使用
- CWE-1395 — 脆弱なサードパーティコンポーネントへの依存
- CWE-1329 — 更新できないコンポーネントへの依存
このカテゴリの対象範囲
サプライチェーンの障害は、パッケージの調達からビルド、配布、デプロイまで、ライフサイクル全体に及びます。
- 追跡・監視されていない依存関係 — 直接依存と推移的依存
- 脆弱またはサポート対象外のコンポーネント — 既知のCVEが未修正
- SBOM管理の欠如 — ソフトウェア部品表がない
- セキュリティ強化されていないCI/CDパイプライン — 職務分離がなく、ビルドに署名がない
- 信頼できないパッケージソース、またはタイポスクワッティングされたパッケージソース
- パッチ適用の遅延、またはパッチ適用サイクルの欠如
- ビルドシステムの侵害(例:SolarWinds 2019、Log4Shell 2021、npmワーム)
Python固有の攻撃対象領域: Flaskだけでも7つ以上の推移的パッケージ(Jinja2、Werkzeug、 MarkupSafe、itsdangerous、click、blinker、packaging)が導入されます。FastAPIはStarlette、Pydanticと、 それらの依存関係を導入します。推移的パッケージはすべて攻撃対象領域です。
脆弱性の検出 — ツールの手順書
1. pip-audit(推奨 — OSVとPyPI Advisory DBをスキャン)
# Install
pip install pip-audit
# Scan current environment
pip-audit
# Scan a requirements file
pip-audit -r requirements.txt
# Output JSON for CI
pip-audit -r requirements.txt -f json -o audit-results.json
# Fix automatically where possible
pip-audit --fix
2. safety(Safety DB / PyUpをスキャン)
pip install safety
# Basic scan
safety check
# Scan requirements file
safety check -r requirements.txt
# Full JSON output
safety check --json
3. osv-scanner(Google OSV — 最も広範なデータベース)
# Install via Go or download binary
go install github.com/google/osv-scanner/cmd/osv-scanner@latest
# Scan a project directory
osv-scanner --lockfile=requirements.txt .
4. Trivy(コンテナとファイルシステム)
# Scan Python project
trivy fs --scanners vuln .
# Scan a Docker image
trivy image myapp:latest
CI/CDへの統合: すべてのPRで
pip-auditとsafetyを実行します。重大度がHIGHまたはCRITICALの検出結果があれば、ビルドを失敗させます。GitHub ActionsとGitLab CIの例については、references/ci-cd-templates.mdを参照してください。
SBOMの生成と管理
SBOM(ソフトウェア部品表)は、コンプライアンス要件(米国大統領令14028)であると同時に、運用上不可欠なものとなっています。
cyclonedx-pyの使用
pip install cyclonedx-bom
# Generate CycloneDX SBOM from current environment
cyclonedx-py environment -o sbom.json --format json
# From a requirements file
cyclonedx-py requirements requirements.txt -o sbom.json --format json
# From poetry
cyclonedx-py poetry -o sbom.json
ライセンスコンプライアンスのためのpip-licensesの使用
pip install pip-licenses
pip-licenses --format=json --output-file=licenses.json
SBOMには以下を含める必要があります:
- パッケージ名、バージョン、ハッシュ
- ライセンス識別子
- 生成時点での既知の脆弱性
- 推移的依存関係ツリー
ハッシュのピン留めとロックファイル
requirements.txtでのハッシュのピン留め
# BAD — unpinned, vulnerable to substitution attacks
flask==3.0.0
# GOOD — hash-pinned, tamper-evident
flask==3.0.0 \
--hash=sha256:34a14a9e9ea... \
--hash=sha256:a9b5cf1a...
ハッシュをピン留めしたrequirementsを生成します:
pip install pip-tools
pip-compile --generate-hashes requirements.in -o requirements.txt
ロックファイル(アプリケーションではこちらを推奨)
| ツール | ロックファイル | コマンド |
|---|---|---|
| Poetry | poetry.lock | poetry install --no-root |
| uv | uv.lock | uv sync |
| pip-tools | requirements.txt(コンパイル済み) | pip-sync requirements.txt |
| Pipenv | Pipfile.lock | pipenv install --ignore-pipfile |
重要な確認事項:
- ロックファイルがソース管理にコミットされている
- CIは緩い
requirements.txtではなく、ロックファイルからインストールする - ロックファイルが定期的に(最低でも週1回)再生成される
- Dependabot / Renovate Botが自動PR用に設定されている
推移的依存関係の監査
依存関係ツリー全体を可視化する
pip install pipdeptree
pipdeptree --json-tree > deptree.json
# Find who requires a specific package
pipdeptree --reverse --packages flask
既知の悪意あるパッケージを確認する
# guarddog — detects malicious behavior in packages
pip install guarddog
guarddog pypi scan flask
guarddog pypi verify flask 3.0.0
ソースコード内の危険なインポートパターンを検出する
# Bandit catches these automatically:
import sys
sys.path.insert(0, '/untrusted/path') # CWE-426: Untrusted Search Path
sys.path.append('/local/unverified') # Same risk
bandit -r . -t B322,B323,B411 # sys.path manipulation checks
CI/CDパイプラインのセキュリティ強化
セキュリティ強化されていないパイプラインは、サプライチェーン攻撃の主要な侵入経路です(SolarWinds攻撃モデル)。
パイプラインの最低限のセキュリティ要件
| 制御 | 実装 |
|---|---|
| パイプライン認証での MFA | 静的シークレットではなく、OIDC トークンを必須にします |
| ビルドへの署名 | コンテナイメージに sigstore / cosign を使用します |
| 改ざんを検知できるログ | 不変の監査ログ(例:Rekor) |
| 依存関係の固定 | タグではなく SHA でアクションのバージョンを固定します |
| 最小権限 | 各ステージで読み取り/書き込みトークンを分離します |
| 段階的なロールアウト | 全体に展開する前にカナリアデプロイを実施します |
GitHub Actions — コミット SHA で固定
# BAD — tag can be moved by attacker
- uses: actions/checkout@v4
# GOOD — immutable SHA
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
SLSA フレームワークの準拠レベル
- SLSA レベル 1: ビルドプロセスを文書化し、基本的な来歴情報を記録します
- SLSA レベル 2: ビルドサービスが署名済みの来歴情報を生成します
- SLSA レベル 3: 強化されたビルドプラットフォームと、偽造不可能な来歴情報を使用します
# Generate SLSA provenance with slsa-verifier
pip install slsa-verifier
slsa-verifier verify-artifact mypackage.tar.gz \
--provenance-path provenance.json \
--source-uri github.com/myorg/myrepo
FastAPI と Flask — 固有のテスト対象
監査対象の依存関係ファイル
| フレームワーク | 直接依存関係 | 監視すべき主な間接依存関係 |
|---|---|---|
| Flask | flask, flask-login, flask-wtf, sqlalchemy | Jinja2, Werkzeug, MarkupSafe, itsdangerous |
| FastAPI | fastapi, uvicorn, sqlalchemy, pydantic | Starlette, anyio, httpx, h11 |
Bandit による静的解析
pip install bandit
# Full scan with supply-chain relevant rules
bandit -r . -t B301,B302,B303,B324,B411,B412 --format json -o bandit-report.json
サプライチェーンに関する主な Bandit ルール:
B301—pickleの使用(デシリアライズのリスク)B302—marshal(同様のリスク)B411—xmlrpcのインポートB412—httpoxyの検出
タイポスクワッティングされたパッケージや不審なパッケージを確認する
# Use pip-audit with strict mode
pip-audit --strict -r requirements.txt
# guarddog behavior analysis
guarddog pypi scan <package>
修正優先度マトリクス
| 検出事項 | 深刻度 | 対応 |
|---|---|---|
| 直接依存関係に CVSS ≥ 9.0 の CVE がある | 重大 | 直ちにパッチを適用し、デプロイをブロックします |
| 直接依存関係に CVSS 7.0~8.9 の CVE がある | 高 | 48 時間以内にパッチを適用します |
| 間接依存関係のみに CVE がある | 中 | 2 週間以内にパッチを適用します |
| 依存関係が固定されていない | 中 | 次のスプリントでロックファイルに追加します |
| SBOM がない | 中 | CI で生成を自動化します |
requirements に --hash がない | 低 | ロックファイルツールに移行します |
| ロックファイルが古い(30 日超) | 低 | 再生成し、変更内容を確認します |
| 依存関係更新ボットが自動化されていない | 低 | Dependabot/Renovate を有効にします |
クイックスタートチェックリスト
[ ] pip-audit and safety check passing in CI (no HIGH/CRITICAL)
[ ] All dependencies pinned in lockfile (poetry.lock / uv.lock)
[ ] Lockfile committed to source control and used in CI installs
[ ] SBOM generated (cyclonedx-py) and stored as CI artifact
[ ] Dependabot or Renovate Bot enabled on repository
[ ] GitHub Actions pinned by commit SHA
[ ] No sys.path.insert() / sys.path.append() on unverified paths
[ ] SLSA Level 2+ for published packages
[ ] Weekly lockfile refresh scheduled
参考ファイル
references/ci-cd-templates.md— pip-audit、safety、SBOM 生成、SLSA 来歴情報の手順を含む GitHub Actions および GitLab CI のパイプラインテンプレートreferences/cwe-mapping.md— 監査レポート用の CWE と検出ツールの完全な対応表