差异化安全评审(Differential Review)
概述
Trail of Bits 出品的安全聚焦代码评审技能。专注于 PR、提交和 diff 的安全分析,自动检测和防止安全回退。
核心原则
- 风险优先:聚焦认证、加密、价值转移、外部调用
- 证据驱动:每个发现都要有 git 历史、行号、攻击场景支撑
- 自适应:根据代码库大小(小/中/大)调整分析深度
- 诚实:明确说明覆盖范围限制和置信度
- 产出导向:始终生成完整的 Markdown 报告文件
不可接受的借口
| 借口 | 为什么是错的 | 正确做法 |
|---|---|---|
| "小 PR,快速看看" | Heartbleed 也只有 2 行 | 按风险分类,不是按大小 |
| "我熟悉这个代码库" | 熟悉导致盲点 | 构建显式的基线上下文 |
| "Git 历史太耗时" | 历史能揭示回退 | 永远不跳过阶段 1 |
| "爆炸半径很明显" | 你会遗漏传递调用者 | 定量计算 |
| "只是重构,没安全影响" | 重构会破坏不变量 | 视为高风险直到证明低风险 |
代码库大小策略
| 大小 | 策略 | 方法 |
|---|---|---|
| 小(< 20 文件) | 深度分析 | 读所有依赖,完整 git blame |
| 中(20-200 文件) | 聚焦分析 | 一跳依赖,优先级文件 |
| 大(200+ 文件) | 外科手术式 | 仅关键路径 |
风险等级触发器
| 风险等级 | 触发条件 |
|---|---|
| 高 | 认证、加密、外部调用、价值转移、验证移除 |
| 中 | 业务逻辑、状态变更、新公开 API |
| 低 | 注释、测试、UI、日志 |
工作流
预分析 → 阶段0:分诊 → 阶段1:代码分析 → 阶段2:测试覆盖
↓ ↓ ↓ ↓
阶段3:爆炸半径 → 阶段4:深度上下文 → 阶段5:对抗性分析 → 阶段6:报告
红旗(立即升级)
- 来自"security"、"CVE"或"fix"提交的代码被移除
- 访问控制修饰符被移除(onlyOwner、internal → external)
- 验证被移除但没有替代
- 新增外部调用但没有检查
- 高爆炸半径(50+ 调用者)+ 高风险变更
质量检查清单
- 所有变更文件已分析
- 对移除的安全代码做了 git blame
- 高风险变更计算了爆炸半径
- 攻击场景是具体的(不是泛泛的)
- 发现引用了具体行号和提交
- 生成了报告文件