差异安全审查
针对 PR、提交范围和差异的安全聚焦代码审查。
何时使用
- 需要对 PR、提交范围或差异进行安全聚焦审查,而非通用代码审查。
- 变更涉及认证、加密、外部调用、价值转移、权限或其他高风险逻辑。
- 需要基于代码证据、攻击场景和明确的报告产物的发现。
核心原则
- 风险优先:聚焦认证、加密、价值转移、外部调用
- 证据驱动:每个发现都由 git 历史、行号、攻击场景支撑
- 自适应:根据代码库规模调整(SMALL/MEDIUM/LARGE)
- 诚实:明确说明覆盖范围限制和置信度
- 输出导向:始终生成完整的 markdown 报告文件
合理化借口(不可跳过)
| 合理化借口 | 为何错误 | 必要行动 |
|---|---|---|
| "小 PR,快速审查" | Heartbleed 只有 2 行代码 | 按风险分类,而非大小 |
| "我熟悉这个代码库" | 熟悉滋生盲点 | 构建明确的基线上下文 |
| "Git 历史太耗时" | 历史揭示回归问题 | 绝不跳过 Phase 1 |
| "爆炸半径显而易见" | 你会遗漏传递调用者 | 定量计算 |
| "没测试 = 不是我的问题" | 缺少测试 = 提升风险等级 | 在报告中标记,提升严重性 |
| "只是重构,无安全影响" | 重构破坏不变量 | 按 HIGH 分析直到证明为 LOW |
| "我会口头解释" | 没有产物 = 发现丢失 | 始终撰写报告 |
快速参考
代码库规模策略
| 代码库规模 | 策略 | 方法 |
|---|---|---|
| SMALL(<20 文件) | DEEP | 读取所有依赖,完整 git blame |
| MEDIUM(20-200) | FOCUSED | 1 跳依赖,优先文件 |
| LARGE(200+) | SURGICAL | 仅关键路径 |
风险等级触发条件
| 风险等级 | 触发条件 |
|---|---|
| HIGH | 认证、加密、外部调用、价值转移、验证移除 |
| MEDIUM | 业务逻辑、状态变更、新增公开 API |
| LOW | 注释、测试、UI、日志 |
工作流概览
预分析 → Phase 0: 分诊 → Phase 1: 代码分析 → Phase 2: 测试覆盖
↓ ↓ ↓ ↓
Phase 3: 爆炸半径 → Phase 4: 深度上下文 → Phase 5: 对抗性分析 → Phase 6: 报告
决策树
开始审查?
├─ 需要详细的分阶段方法论?
│ └─ 阅读:methodology.md
│ (预分析 + Phases 0-4:分诊、代码分析、测试覆盖、爆炸半径)
│
├─ 分析 HIGH RISK 变更?
│ └─ 阅读:adversarial.md
│ (Phase 5:攻击者建模、漏洞利用场景、可利用性评级)
│
├─ 撰写最终报告?
│ └─ 阅读:reporting.md
│ (Phase 6:报告结构、模板、格式指南)
│
├─ 查找特定漏洞模式?
│ └─ 阅读:patterns.md
│ (回归、重入、访问控制、溢出等)
│
└─ 仅快速分诊?
└─ 使用上方快速参考,跳过详细文档
质量检查清单
交付前:
- 所有变更文件已分析
- 已对移除的安全代码执行 git blame
- HIGH 风险已计算爆炸半径
- 攻击场景具体(非泛泛而谈)
- 发现引用具体行号 + 提交
- 已生成报告文件
- 已通知用户并附摘要
集成
audit-context-building skill:
- 预分析:构建基线上下文
- Phase 4:HIGH RISK 变更的深度上下文
issue-writer skill:
- 将发现转化为正式审计报告
- 命令:
issue-writer --input DIFFERENTIAL_REVIEW_REPORT.md --format audit-report
使用示例
快速分诊(小型 PR)
输入:5 文件 PR,2 个 HIGH RISK 文件
策略:使用快速参考
1. 按文件分类风险等级(2 HIGH,3 LOW)
2. 仅聚焦 2 个 HIGH 文件
3. Git blame 移除的代码
4. 生成最小报告
时间:约 30 分钟
标准审查(中型代码库)
输入:80 文件,12 个 HIGH RISK 变更
策略:FOCUSED(见 methodology.md)
1. 对 HIGH RISK 文件执行完整工作流
2. 对 MEDIUM 进行表面扫描
3. 跳过 LOW 风险文件
4. 生成包含所有章节的完整报告
时间:约 3-4 小时
深度审计(大型、关键变更)
输入:450 文件,认证系统重写
策略:SURGICAL + audit-context-building
1. 用 audit-context-building 构建基线上下文
2. 仅对认证变更进行深度分析
3. 爆炸半径分析
4. 对抗性建模
5. 综合报告
时间:约 6-8 小时
何时不使用此技能
- 全新代码(无基线可比较)
- 仅文档变更(无安全影响)
- 格式化/linting(外观变更)
- 用户明确要求仅快速摘要(用户接受风险)
这些情况请使用标准代码审查。
红旗信号(停止并调查)
立即升级触发条件:
- 移除来自 "security"、"CVE" 或 "fix" 提交的代码
- 移除访问控制修饰符(onlyOwner、internal → external)
- 移除验证且无替代
- 新增外部调用但无检查
- 高爆炸半径(50+ 调用者)+ HIGH 风险变更
这些模式即使在快速分诊中也需要对抗性分析。
最佳实践提示
应该:
- 从 git blame 开始检查移除的代码
- 尽早计算爆炸半径以确定优先级
- 生成具体的攻击场景
- 引用具体行号和提交
- 对覆盖范围限制保持诚实
- 始终生成输出文件
不应该:
- 跳过 git 历史分析
- 做无证据的泛泛发现
- 时间有限时声称完整分析
- 忘记检查测试覆盖
- 遗漏高爆炸半径变更
- 仅在聊天中输出报告(需要文件)
支持文档
- methodology.md - 详细的分阶段工作流(Phases 0-4)
- adversarial.md - 攻击者建模和漏洞利用场景(Phase 5)
- reporting.md - 报告结构和格式(Phase 6)
- patterns.md - 常见漏洞模式参考
首次使用者: 从 methodology.md 开始理解完整工作流。
有经验用户: 使用本页快速参考和决策树直接导航到所需内容。
限制
- 仅当任务明确符合上述范围时使用此技能。
- 不要将输出视为环境特定验证、测试或专家审查的替代品。
- 如果缺少必要的输入、权限、安全边界或成功标准,请停止并请求澄清。