🤖 Agentic 全难度 📦 TrailOfBits

fix-review

fix-review Skill 深度评测:Trail of Bits 修复验证闭环

8.7 /10 ★★★★☆
📅 2026-06-15 · 🕒 5 分钟阅读 · 最后更新 2026-06-15 · 来源: TrailOfBits · 分析测评
#trailofbits#fix-review#security#regression#fix-verification
📄 相关文章

📊 评分明细

功能完备度
8.7 核心功能齐全
🎯 易用性
8.4 安装即用
🔧 可扩展性
9 支持定制和 fork
🔗 生态协同
8.6 可链式调用
🛡️ 稳定性
9.3 CI 集成验证

🎯 适用场景

trailofbitsfix-reviewsecurityregressionfix-verification

trailofbits-fix-review-skill 快速入门

“我修了”不等于”修好了”——专门验证修复有效性的 Skill。

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

安全团队的痛点:开发者说”我修了这个漏洞”,你信了,结果过了几个月漏洞又被攻击者利用。复盘发现:要么修复根本没起作用(逻辑错误),要么引入了新问题(回归)。

fix-review 是 Trail of Bits 出品的 Skill,专门做”修复验证”。它的工作流是:

  1. 理解原 Bug:读修复前的代码,理解漏洞机理
  2. 理解修复:读修复后的代码,理解为什么这样改
  3. 验证修复有效:构造能触发原漏洞的输入,确认修复后无法触发
  4. 回归测试:确认修复没破坏现有功能
  5. 同类问题扫描:这个漏洞的 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 拼接

[结论] 修复本身有效,但需关注回归测试失败,并扫描同类问题

常见踩坑

  1. 修复方式不对:用黑名单过滤危险字符而不是白名单,经常被绕过。Skill 会检测这种”假修复”。
  2. 修了表象没修根因:加了一行 input validation,但漏洞在更深的地方。Skill 会追问根因。
  3. 回归测试覆盖不足:只测了修复的那个分支,没测相关功能。Skill 会要求测试相关路径。
  4. 同类问题没扫:同一个漏洞模式在代码库其他地方可能也有,Skill 会主动扫描。
  5. 依赖升级的”修复”:某些修复其实是依赖升级带来的,不是开发者主动修的。要确认是不是升级本身包含的修复。
  6. 没考虑绕过方式:修了一个入口,但攻击者可以走另一个入口。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-analysissecurity-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/掘金/知乎

推荐资源:

避免的坑:

  • 不要装太多 Skill(超过 10 个会拖慢 Agent)
  • 不要把 Skill 装在不兼容的 Agent 上
  • 不要直接复制 Skill 默认 prompt——要根据项目调整
  • 定期 review Skill 库的实用性,清理不用的

参考链接


本文基于官方文档和公开资料整理,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 强制验证:

  1. 原漏洞真的被修了(不是表面修复)
  2. 没引入新漏洞(没破坏其他功能)
  3. 新代码符合安全规范

关键洞见:“修一个 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 触发条件详解

来源:trailofbits/skills README

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-analysisfix-review 前先跑 static-analysis
variant-analysis找同类漏洞后,fix-review 验证
insecure-defaults修配置后,fix-review 验证
supply-chain-risk-auditor升级依赖后,fix-review 验证
constant-time-analysis修密码代码后,fix-review 验证
differential-reviewfix-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("<", "&lt;") 替换一个字符 结果:绕过:<<script>>&lt;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%
修复平均时间4h1h-75%
团队对修复信任
安全债增长控制

来源:trailofbits 社区统计


十一、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 SecurityCVE 跟踪互补——跟踪 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)
  • 纯样式调整
  • 一次性脚本

参考链接:

📦 快速安装

1 Git Clone
git clone https://github.com/trailofbits/skills.git
cd skills
ls fix-review/