fix-review
fix-review Skill 深度评测:Trail of Bits 修复验证闭环
评分明细
适用场景
trailofbits-fix-review-skill 快速入门
“我修了”不等于”修好了”——专门验证修复有效性的 Skill。
这是什么?解决什么问题?
安全团队的痛点:开发者说”我修了这个漏洞”,你信了,结果过了几个月漏洞又被攻击者利用。复盘发现:要么修复根本没起作用(逻辑错误),要么引入了新问题(回归)。
fix-review 是 Trail of Bits 出品的 Skill,专门做”修复验证”。它的工作流是:
- 理解原 Bug:读修复前的代码,理解漏洞机理
- 理解修复:读修复后的代码,理解为什么这样改
- 验证修复有效:构造能触发原漏洞的输入,确认修复后无法触发
- 回归测试:确认修复没破坏现有功能
- 同类问题扫描:这个漏洞的 pattern 在代码库其他地方有没有
这个 Skill 来自 Trail of Bits(知名区块链安全公司,审计过 Ethereum、Solana 等核心协议)。它最初是为智能合约审计设计的,但同样适用于任何安全修复:Web 漏洞、应用漏洞、基础设施配置修复。
准备工作
- 已有 Bug 报告(知道漏洞是什么)
- 修复前后的代码 diff
- 支持 Agent Skill 的 AI 客户端
- 能跑测试的环境
- 基本的漏洞利用知识
3 步快速上手
第 1 步:克隆仓库
git clone https://github.com/trailofbits/skills.git
cd skills
ls fix-review/
你会看到 SKILL.md、修复验证模板、示例报告。
第 2 步:加载 Skill
claude --skill trailofbits-fix-review
第 3 步:提交修复让 AI 审查
准备一个修复 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、security-and-hardening等)使用,效果更好。
常见问题 FAQ
Q1: 这个 Skill 跟 trailofbits-fix-review-skill 有什么关系?必须装吗?
A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。
Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?
A: trailofbits-fix-review-skill 来自 TrailOfBits,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 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-fix-review-skill 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。
进阶学习建议
如果想进一步用好 trailofbits-fix-review-skill,建议按以下路径学习:
第 1 周:熟练使用
- 完成 3 步快速上手,跑通第一个任务
- 试 2-3 个不同场景的真实任务
- 记录”哪些 prompt 有效、哪些没用”——形成自己的 prompt 笔记
第 2 周:理解机制
- 阅读 Skill 的官方文档(README、SKILL.md)
- 了解 Skill 的”触发关键词”和”输出格式”
- 学习”如何用更具体的描述触发 Skill”
第 3-4 周:组合使用
- 跟其他 Skill 组合(比如代码审查 + 性能优化)
- 跟其他 Agent 工具组合(Skill + MCP + 自定义脚本)
- 沉淀团队/个人的 Skill 库
长期:贡献社区
- 把自定义的 Skill 开源到 GitHub
- 提 PR 改进现有 Skill
- 写使用心得分享到 CSDN/掘金/知乎
推荐资源:
- 官方文档:https://github.com/trailofbits/skills
- 官方仓库 README 里的 Examples
- 社区最佳实践:Anthropic 官方博客 https://www.anthropic.com/blog
- 国内社区:CSDN AI 板块、掘金 AI 板块
避免的坑:
- 不要装太多 Skill(超过 10 个会拖慢 Agent)
- 不要把 Skill 装在不兼容的 Agent 上
- 不要直接复制 Skill 默认 prompt——要根据项目调整
- 定期 review Skill 库的实用性,清理不用的
参考链接
- 仓库:https://github.com/trailofbits/skills
- fix-review 目录:https://github.com/trailofbits/skills/tree/main/fix-review
- Trail of Bits 博客:https://blog.trailofbits.com/
- CWE(常见漏洞枚举):https://cwe.mitre.org/
- OWASP 修复指南:https://owasp.org/www-project-application-security-verification-standard/
本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。
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)
- 纯样式调整
- 一次性脚本
参考链接:
快速安装
git clone https://github.com/trailofbits/skills.git
cd skills
ls fix-review/