关于 software-supply-chain-failures
面向 Python 团队的供应链安全审计技能,覆盖第三方依赖、构建和部署。内容结合漏洞扫描、SBOM 生成、依赖锁定及 CI/CD 加固指导。
主要功能
- 01扫描依赖中的已知漏洞
- 02生成和管理 SBOM
- 03指导哈希固定与锁文件管理
- 04审计传递依赖和可疑软件包
- 05提供 CI/CD 加固检查
适用场景
- 01审计 Python 项目的依赖
- 02在 CI 中加入漏洞扫描
- 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 是社区投票选出的首要关注项,也是整个 OWASP Top 10:2025 中按漏洞利用评分计算风险最高的类别,尽管它仅包含 6 个 CWE,且测试数据有限:
| 指标 | 值 |
|---|---|
| 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。发现严重或危急级别的问题时,让构建失败。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...
生成哈希固定的依赖项文件:
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 - 按计划重新生成锁文件(至少每周一次)
- 已配置 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 Level 1: 记录构建流程,提供基本来源证明
- SLSA Level 2: 构建服务生成带签名的来源证明
- SLSA Level 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— 导入xmlrpcB412— 检测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 | 中 | 生成 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— GitHub Actions + GitLab CI 流水线模板,包含 pip-audit、safety、SBOM 生成和 SLSA 来源证明步骤references/cwe-mapping.md— 用于审计报告的完整 CWE 到检测工具映射
评论
支持 Markdown