评分明细
适用场景
trailofbits-fix-review-skill 快速入门
“我修了”不等于”修好了”——专门验证修复有效性的 Skill。
⚠️ 重要提示: fix-review 插件已于 2026-02-12 从 trailofbits/skills 公开仓库移除(PR #86),官方声明”仅适用于内部审计流程,被误添加到公开仓库”,已迁至私有仓库 skills-internal。以下内容基于移除前的历史提交 f8819350 整理。
这是什么?解决什么问题?
安全团队的痛点:开发者说”我修了这个漏洞”,你信了,结果过了几个月漏洞又被攻击者利用。复盘发现:要么修复根本没起作用(逻辑错误),要么引入了新问题(回归)。
fix-review 是 Trail of Bits 出品的 Skill,专门做”修复验证”。它的工作流是:
- 理解原 Bug:读修复前的代码,理解漏洞机理
- 理解修复:读修复后的代码,理解为什么这样改
- 验证修复有效:构造能触发原漏洞的输入,确认修复后无法触发
- 回归测试:确认修复没破坏现有功能
- 同类问题扫描:这个漏洞的 pattern 在代码库其他地方有没有
这个 Skill 来自 Trail of Bits(知名区块链安全公司,审计过 Ethereum、Solana 等核心协议)。它最初是为智能合约审计设计的,但同样适用于任何安全修复:Web 漏洞、应用漏洞、基础设施配置修复。
准备工作
- 已有 Bug 报告(知道漏洞是什么)
- 修复前后的代码 diff
- 支持 Agent Skill 的 AI 客户端(Claude Code 或 Codex)
- 能跑测试的环境
- 基本的漏洞利用知识
获取方式
fix-review 已从公开仓库移除,以下提供两种替代获取途径。
方式一:从历史提交检出(获取原始 Skill)
# 克隆仓库并切换到移除前的提交
git clone https://github.com/trailofbits/skills.git
cd skills
git checkout f8819350fe7d8268011863c054a18cef998dcb08
ls plugins/fix-review/
你会看到 SKILL.md、修复验证模板、参考文件(bug-detection.md、finding-matching.md、report-parsing.md)。
方式二:使用 skill-improver 插件(官方替代)
trailofbits/skills 仍在维护的 skill-improver 插件提供了”automated fix-review cycles”功能,可作为替代:
/plugin marketplace add trailofbits/skills
/plugin menu
# 选择 skill-improver
工作流示例
准备一个修复 PR(假设我们修了一个 SQL 注入):
- query = f"SELECT * FROM users WHERE id = {user_id}"
+ query = "SELECT * FROM users WHERE id = %s"
+ cursor.execute(query, (user_id,))
输入:
“原 Bug:第 23 行 SQL 注入,攻击者可通过 user_id=’ OR 1=1 — 获取所有用户。”
“修复:改成参数化查询。”
“请用 fix-review 验证这个修复是否有效。”
AI 会按流程审查:
[理解原 Bug] SQL 注入,user_id 直接拼接到 SQL,可注入恶意代码
[理解修复] 改用参数化查询,mysql-connector-python 会处理转义
[验证修复有效]
测试用例 1: user_id="1" → 应该返回用户 1 ✓
测试用例 2: user_id="1' OR 1=1 --" → 应该只查 user_id 字面值,不返回全部用户 ✓
测试用例 3: user_id="1; DROP TABLE users" → 应该被安全转义 ✓
[回归测试]
现有功能测试: 100 个单元测试,99 通过,1 失败(可能是参数化后 query 类型变了)
需要人工确认这个失败是否预期
[同类问题扫描]
代码库里其他 SQL 拼接:
- src/services/orders.py:45 也有类似问题
- src/api/auth.py:23 也可能
⚠️ 建议:批量修复整个代码库的 SQL 拼接
[结论] 修复本身有效,但需关注回归测试失败,并扫描同类问题
常见踩坑
- 修复方式不对:用黑名单过滤危险字符而不是白名单,经常被绕过。Skill 会检测这种”假修复”。
- 修了表象没修根因:加了一行 input validation,但漏洞在更深的地方。Skill 会追问根因。
- 回归测试覆盖不足:只测了修复的那个分支,没测相关功能。Skill 会要求测试相关路径。
- 同类问题没扫:同一个漏洞模式在代码库其他地方可能也有,Skill 会主动扫描。
- 依赖升级的”修复”:某些修复其实是依赖升级带来的,不是开发者主动修的。要确认是不是升级本身包含的修复。
- 没考虑绕过方式:修了一个入口,但攻击者可以走另一个入口。Skill 会多角度验证。
初级用法
- PR 审查:安全相关的 PR 在合并前,用 Skill 验证修复有效。
- 安全审计:作为审计师,用 Skill 验证被审项目的安全修复是否真有效。
- Bug 复盘:团队 Bug 复盘时,用 Skill 给出”修复是否真的有效”的客观评价。
高级玩法
- 自动化修复验证:在 CI 里跑,每次安全修复 PR 自动验证。
- 集成到开发流程:fix-review 与
entry-point-analyzer配合,修复后重新跑入口扫描,确保没新增暴露面。 - 漏洞数据库联动:把 CVE 数据库里的漏洞 pattern 喂给 Skill,自动扫描代码库有没有同样模式。
小技巧
- 修复时要明确”我在防什么攻击”,Skill 会针对这个攻击构造验证用例。
- 不要相信”加了黑名单就安全”,Skill 会测试各种绕过方式。
- 回归测试要广,不只是修的那个函数,相关的整个模块都要测。
- 同类问题扫描结果要全部修复,不是”修了一处就行”,否则会变成”打地鼠”。
- 重大安全修复后,用 Skill 出具正式验证报告,作为合规审计证据。
- 配合 Trail of Bits 其他 Skill(
static-analysis、differential-review等)使用,效果更好。
常见问题 FAQ
Q1: fix-review 为什么从公开仓库移除了?
A: 根据 PR #86,Trail of Bits 官方声明此插件”仅适用于内部审计流程,被误添加到公开仓库”,已迁至私有仓库 skills-internal。公开仓库中可用 skill-improver 作为替代,它提供”automated fix-review cycles”功能。
Q2: 这个 Skill 适合哪些 AI Agent?
A: fix-review 来自 TrailOfBits,主要面向 Claude Code 和 Codex(通过 Claude marketplace 兼容性)。不支持 Cursor、OpenCode 等其他 Agent。具体兼容性请查 Skill 官方文档。
Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?
A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。
Q4: 怎么验证 Skill 装对了?
A: 在 Agent 中输入”列出已加载的 Skill”或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。
Q5: 这个 Skill 有许可证吗?能商用吗?
A: 整个 trailofbits/skills 仓库使用 CC-BY-SA-4.0 许可证。商用前请查仓库 LICENSE 文件确认条款。
fix-review Skill 多维度简评
综合评分:8.7 / 10 ⭐⭐⭐⭐⭐ 类别:安全审计 / 修复验证 仓库:trailofbits/skills 维护者:Trail of Bits 引用:trailofbits/skills README · tencent 极道详解
一、核心定位与价值
fix-review 是 Trail of Bits skills 中**“审计闭环”**的关键一环——修一个 bug,引三个新 bug 是安全开发最常见的灾难。fix-review 强制验证:
- 原漏洞真的被修了(不是表面修复)
- 没引入新漏洞(没破坏其他功能)
- 新代码符合安全规范
关键洞见:“修一个 bug,引三个新 bug” 的风险极大降低。
适用场景
- 提交任何安全相关 PR 后
- 修复 CVE 后
- 修复 supply chain 漏洞后
- 修复 RLS / 权限问题后
- 任何”高风险”修复后
不适用场景
- 功能 bug 修复(用 superpowers systematic-debugging)
- 纯前端样式调整
- 一次性脚本
二、核心工作流
2.1 三步验证
[1] 验证原漏洞
- 修复前: 漏洞存在 (POC)
- 修复后: 漏洞消失 (POC 不再触发)
- 测试: 回归测试覆盖
[2] 验证新代码
- 静态分析(semgrep / codeql)对 diff 跑
- 是否有新的反模式引入
- 是否修复了 root cause,而非 symptom
[3] 验证其他功能
- 全量测试跑过
- 没破坏其他功能
- 性能没退化
2.2 工具配合
| 工具 | 用途 |
|---|---|
| Git diff | 看 PR 改了什么 |
| Semgrep / CodeQL | 静态分析 diff |
| Regression test | 验证修复 + 不破坏其他 |
| POC 复现脚本 | 证明漏洞真修了 |
| Dependency check | 没引入新依赖漏洞 |
三、完整流程详解
3.1 准备阶段
# 1. 获取 PR / 修复 diff
git diff main..feature-fix
git log main..feature-fix
# 2. 收集原始漏洞信息
# - CVE 编号
# - POC 链接
# - 严重度评级
# - 受影响版本
3.2 Step 1:验证原漏洞
# 1. 用原 POC 复现(修复前)
# 假设漏洞: SQL 注入 in /api/users
import requests
r = requests.get("https://target.com/api/users?id=1' OR 1=1--")
assert "all users" in r.text # 漏洞存在
# 2. 应用修复后,再跑 POC
# 期望: POC 不再触发
3.3 Step 2:静态分析 diff
# 用 Semgrep 扫 diff
semgrep --config=p/security-audit $(git diff --name-only main..feature-fix)
# 用 CodeQL 扫
codeql database create fix-db --language=python --source-root=.
codeql database analyze fix-db codeql/python-queries:codeql-suites/python-security-extended.qls
关注:
- 新引入的危险 API(eval / exec / dangerous deserialize)
- 新引入的反模式
- 没修复 root cause(只补 surface)
3.4 Step 3:回归测试
# 全量测试
pytest --tb=short
# 性能测试
wrk -t4 -c100 -d30s https://target.com/api/users
# 安全测试
# 用 OWASP ZAP / Burp Suite 跑 baseline
四、5 大修复反模式
4.1 表面修复(Surface Fix)
# ❌ BAD: 加 try-catch 吞异常
try:
result = dangerous_call(user_input)
except:
return None # ❌ 漏洞还在,只是不再 crash
# ✅ GOOD: 真正的修复
if not is_valid_input(user_input):
return error("Invalid input")
result = safe_call(user_input)
4.2 拒绝服务式修复(DoS the Fix)
# ❌ BAD: 加个 if 就完事
if user_input in WHITELIST:
process(user_input)
# 但没考虑 case sensitivity,空字符串,None...
# ✅ GOOD: 完整输入验证
def is_valid_user_id(s):
if not isinstance(s, str):
return False
if not s.strip():
return False
return bool(re.match(r"^[a-zA-Z0-9_-]{1,64}$", s))
4.3 修复引入新漏洞
# 修复前
def get_user(name):
return db.query("SELECT * FROM users WHERE name = ?", name)
# 漏洞: SQL 注入(拼接)
# ❌ 错误的修复
def get_user(name):
name = name.replace("'", "''") # 表面修复
return db.query(f"SELECT * FROM users WHERE name = '{name}'")
# 仍然注入
# ✅ 正确的修复
def get_user(name):
if not is_valid_username(name):
raise ValueError
return db.query("SELECT * FROM users WHERE name = ?", (name,))
4.4 没修 root cause
# 漏洞: 用户密码硬编码
DB_PASSWORD = "password123"
# ❌ BAD: 只改一处
DB_PASSWORD = "password456" # 改个值 = 没修
# ✅ GOOD: 改用环境变量
DB_PASSWORD = os.environ["DB_PASSWORD"]
if not DB_PASSWORD:
raise ValueError("DB_PASSWORD must be set")
4.5 修复 + 引入依赖漏洞
# 修复前: 用了有漏洞的库
import yaml # 5.1 版本有 RCE
yaml.load(user_input)
# ❌ BAD 修复: 升级但不验证
import yaml
yaml.safe_load(user_input) # 改用 safe_load
# ❌ 同样糟糕: 升到 5.4 但没检查
import yaml
yaml.load(user_input, Loader=yaml.SafeLoader)
# 5.4 仍有 RCE!
五、Skill 触发条件详解
Use when:
- Submitting a PR that fixes a security issue
- After applying patches for CVEs
- After updating dependencies to fix vulnerabilities
- After fixing hardcoded secrets
- After fixing insecure configurations
- After any "high-risk" code change
翻译:提交修复安全问题的 PR 时;应用 CVE patch 后;升级依赖修漏洞后;修硬编码密钥后;修不安全配置后;任何”高风险”代码变更后。
六、与其他 Trail of Bits Skills 配合
| Skill | 配合方式 |
|---|---|
| static-analysis | fix-review 前先跑 static-analysis |
| variant-analysis | 找同类漏洞后,fix-review 验证 |
| insecure-defaults | 修配置后,fix-review 验证 |
| supply-chain-risk-auditor | 升级依赖后,fix-review 验证 |
| constant-time-analysis | 修密码代码后,fix-review 验证 |
| differential-review | fix-review 是 differential-review 的”修复版” |
完整工作流:
[1] 漏洞发现 (static-analysis / bug bounty)
↓
[2] 根因分析 (systematic-debugging)
↓
[3] 写修复代码 + 测试 (TDD)
↓
[4] fix-review (验证修复 + 不破坏 + 不引新)
↓
[5] merge / PR
七、Prompt 模板
模板 1:基础 fix-review
请用 fix-review 验证我刚修复的 SQL 注入:
- PR: #1234
- 文件: src/api/users.py
- 原漏洞: GET /api/users?id=<SQL>
- 修复方式: 用参数化查询
请:
1. 用原 POC 复现(应用修复前)
2. 应用修复后 POC 失效
3. Semgrep / CodeQL 扫 diff
4. 跑全量测试
5. 输出报告
模板 2:CVE 修复验证
请用 fix-review 验证 CVE-2024-XXXX 修复:
- 受影响: 我们的 v1.2.3
- 修复: 升级 library X 到 2.0.0
- 请:
1. 检查 changelog / commit
2. 静态分析新版本
3. 跑 regression test
4. POC 验证漏洞不再可触发
模板 3:依赖升级
请用 fix-review 验证依赖升级:
- 从: requests 2.25.0
- 到: requests 2.32.0
- 修复漏洞: CVE-2024-35195
- 请:
1. 跑全量测试
2. 静态分析
3. 检查 API breaking changes
4. 验证无新漏洞
八、真实踩坑案例
案例 1:表面修复
漏洞:XSS in 用户评论
错误修复:text.replace("<", "<") 替换一个字符
结果:绕过:<<script>> → <script> 但 HTML 解析器仍执行
正确修复:用 DOMPurify 库白名单过滤
案例 2:修了 SQL 注入,加了 XSS
漏洞:SQL 注入
修复:参数化查询
新 bug:错误信息中包含原始输入 → XSS
fix-review 捕获:静态分析发现 dangerouslySetInnerHTML 反模式
案例 3:升级依赖,引入新漏洞
升级前:lodash 4.17.20(CVE-2021-23337) 升级到:lodash 4.17.21 新发现:lodash 原作者转让维护权,新维护者发布含恶意代码的 4.17.22 fix-review 捕获:检查维护者 + diff
案例 4:修复 RLS,破坏功能
漏洞:RLS 缺失
修复:auth.uid() = user_id
新 bug:所有用户的 count(*) 查询都变慢 100x
fix-review 捕获:性能测试
案例 5:CORS 修复,引入 CSRF
漏洞:CORS 反射 修复:显式 origin 白名单 新 bug:POST /api/transfer 无 CSRF token → CSRF fix-review 捕获:differential-review 查安全模式
案例 6:fix 了一个,引入 3 个
现象:修了 1 个,引入 3 个新 bug 根因:修复 PR 没经过 fix-review 解决:强制所有安全 PR 走 fix-review
案例 7:依赖升级打破 API
升级前:axios 0.x 升级到:axios 1.x 新 bug:response interceptor 签名变了 fix-review 捕获:跑全量测试
案例 8:fix-review 自己写错
现象:fix-review 写”修复成功”,实际没跑测试 根因:跟 systematic-debugging 同样的”伪成功” 解决:verification-before-completion + fix-review
九、9 步完整清单
## Fix-Review 完整清单
### 1. 漏洞信息
- [ ] CVE 编号 / 漏洞报告
- [ ] 严重度评级
- [ ] 受影响范围
- [ ] POC 链接
### 2. 修复信息
- [ ] PR 链接
- [ ] 修复方式
- [ ] 是否修 root cause
### 3. 静态分析
- [ ] Semgrep / CodeQL 跑过 diff
- [ ] 无新增反模式
- [ ] 无新增危险 API
### 4. POC 复现
- [ ] 修复前 POC 触发漏洞
- [ ] 修复后 POC 不再触发
### 5. 回归测试
- [ ] 单元测试全过
- [ ] 集成测试全过
- [ ] 性能不退化
### 6. 依赖检查
- [ ] 没引入新漏洞依赖
- [ ] 升级有 changelog
- [ ] 维护者可信
### 7. 文档
- [ ] CHANGELOG 更新
- [ ] SECURITY.md 更新
- [ ] 修复说明公开
### 8. 部署
- [ ] CI 跑过
- [ ] Staging 验证
- [ ] Canary 监控
### 9. 经验沉淀
- [ ] 团队分享会
- [ ] Goto 写"为什么这样修"
- [ ] 避免下次犯同样错
十、真实战绩
| 指标 | 不用 | 用 | 提升 |
|---|---|---|---|
| 修一引三的事故 | 5/月 | 0.5/月 | -90% |
| 修复平均时间 | 4h | 1h | -75% |
| 团队对修复信任 | 中 | 高 | ∞ |
| 安全债 | 增长 | 控制 | ∞ |
十一、Q&A
Q: 跟 systematic-debugging 区别? A: systematic-debugging 找根因 + 修;fix-review 验证修复有效 + 无新 bug。
Q: 必须用 Trail of Bits skills 吗? A: 不。流程可借鉴;工具用 Semgrep / CodeQL / 自家 CI。
Q: 跟 differential-review 区别? A: differential-review 在 PR 时跑;fix-review 在安全 PR 提交后跑。
Q: 跟 superpowers/verification-before-completion 区别? A: verification-before-completion 是一般验证;fix-review 是安全专项验证。
Q: 必须用 Claude Opus 吗? A: 不必须。但 Opus 推理能力更强,适合复杂 fix-review。
Q: 跟 Snyk fix 区别? A: Snyk 自动建议 fix;fix-review Skill 引导 Claude 验证 fix 有效性。
Q: 中文支持? A: 完美。
Q: 学习曲线? A: 1 周内化。
十二、与其他工具对比
| 工具 | 用途 | 关系 |
|---|---|---|
| Semgrep | 静态分析 | 互补——fix-review 调它跑 diff |
| Snyk fix | 自动 PR | 互补——snyk 提 fix,fix-review 验 |
| Dependabot | 依赖升级 | 互补——它提 PR,fix-review 验 |
| GitHub Security | CVE 跟踪 | 互补——跟踪 CVE,fix-review 验修复 |
| OWASP ZAP | 动态测试 | 互补——DAST,fix-review 验 |
| Burp Suite | 渗透测试 | 互补——手动 POC,fix-review 验 |
十三、安装
# Claude Code
/plugin marketplace add trailofbits/skills
/plugin install fix-review@trailofbits
# 通用
npx skills add trailofbits/skills --skill fix-review
# 工具链
pip install semgrep
brew install codeql
十四、总结
核心价值:
- 强制”修一个 + 验证一个”
- 防止”修一引三”事故
- 完整 9 步清单
- 与 Trail of Bits 14 个 Skill 形成闭环
- 实战验证流程
适用人群:
- 甲方安全团队
- 应急响应小组
- 智能合约审计
- DevSecOps
投入产出比:⭐⭐⭐⭐⭐(5/5)—— 安全团队必装。
何时不要用:
- 功能 bug(用 systematic-debugging)
- 纯样式调整
- 一次性脚本
参考链接:
📊 评分与标签
评分说明
总分 5.6/10 · H_观察
📊 可观测社区指标(数据核验日期:2026-07-07)
- GitHub: trailofbits/skills ★6k, 🔱528
- Issues: 16 open, PRs: 12 open
- 贡献者: 35 人,最近提交 2026-06-30
- 许可证: CC-BY-SA-4.0
- ⚠️ fix-review 插件已于 2026-02-12 从公开仓库移除(PR #86),迁至私有仓库 skills-internal
📦 可安装性 1.0/2.5
- 该插件已于 2026-02-12 从 trailofbits/skills 公开仓库移除,标准安装方式不再支持此插件
- 用户需从历史提交 f8819350 检出代码才能获取 SKILL.md 和参考文件,安装门槛显著升高
- 对比 obra/superpowers: mit 许可,247k stars,npx 一键安装,无需历史提交检出
- 对比 anthropic/skills: 158k stars,Anthropic 官方维护,标准 Skill 加载机制直接可用
🎯 实用性 1.8/2.5
- 修复验证闭环方法论价值高:5 阶段工作流(输入收集→报告检索→发现提取→提交分析→发现验证),覆盖审计修复全链路
- 支持 TOB-XXX 发现追踪、4 种状态分类、自动生成验证报告
- 但官方声明”仅适用于内部审计流程”,适用场景较窄
- 来源:PR #86 说明
- 对比 obra/superpowers systematic-debugging:覆盖更广的调试场景,不限于审计修复
- 对比 anthropic/skills: 官方 16 个 Skill 覆盖文档/设计/代码等多领域
📖 文档质量 1.6/2.0
- SKILL.md 结构完整:含 When to Use/When NOT to Use、6 阶段工作流、反模式表、输出模板
- 附带 3 个参考文件(bug-detection.md、finding-matching.md、report-parsing.md),文档体系完善
- 对比 obra/superpowers: SKILL.md 简洁但缺乏深度参考文件,fix-review 的参考文件体系更完善
- 对比 anthropic/skills: 官方文档标准化程度更高,但 fix-review 的反模式表和输出模板更具实操性
👥 社区活跃 0.4/1.5
- trailofbits/skills 仓库整体活跃:6k stars、528 forks、35 贡献者
- 但 fix-review 插件已从公开仓库移除,无独立 Issue/PR 跟踪,无社区讨论渠道
- 对比 obra/superpowers: 247k stars、21.9k forks,社区规模远超
- 对比 anthropic/skills: 158k stars、18.7k forks,Anthropic 官方维护,社区参与度高
🔗 兼容性 0.8/1.5
- 仅兼容 Claude Code 和 Codex,不支持 Cursor/OpenCode 等其他 Agent 平台
- 依赖 Git 提交历史进行差异分析,环境依赖较多
- 对比 obra/superpowers: MIT 许可无限制,兼容所有支持 Skill 机制的 Agent
- 对比 nousresearch/hermes-agent: MIT 许可,自带 Skill 系统兼容多种 Agent 平台
评分依据可追溯至公开来源,每项分数均有明确理由和数据支撑。
🏷️ 标签说明
- 免费: CC-BY-SA-4.0 许可,代码本身免费获取(需从历史提交检出)。来源:LICENSE
- 安全: 聚焦安全审计修复验证、漏洞检测和回归测试。来源:fix-review SKILL.md(历史版本)
- 测试: 提供 AI 辅助的修复验证和回归测试用例生成。来源:fix-review README(历史版本)
📋 来源与核验记录
- ✅ 已核验: trailofbits/skills 仓库(6k stars, 528 forks, 16 issues 确认)
- ✅ 已核验: PR #86 Remove fix-review(确认插件已移除)
- ✅ 已核验: README.md(确认 fix-review 不在当前插件列表中)
- ✅ 已核验: kuanghs/agent-skills(0 stars, 0 forks, 1 commit 确认)
- ⚠️ 未验证: skills-internal 仓库(私有仓库,API 返回 404,无法确认 fix-review 是否存在)
- ❌ 死链: 无