# 真实 CVE 召回测试（revert 法）

方法：取真实项目里**已合并的安全修复**，`git revert -n` 把工作区改回**有漏洞**的状态，
让 ReviewGate 审查这个"重新引入漏洞"的 diff。修复对应的 GHSA 公告即 ground truth。

| 修复 | 漏洞类型 | 语言 | ReviewGate | 结论 |
|---|---|---|---|---|
| [axios#10750](2026-06-25__axios__revert-pr10750.md)（GHSA-6chq-wfr3-2hj9） | 原型污染 → FormData 伪造 → 头注入（**难**） | JS | **BLOCK**，security high 0.86×2 | ✅ 命中 |
| [gradio#13437](2026-06-25__gradio__revert-pr13437.md)（GHSA-qqr5-x4m8-g4gq） | 路径穿越（清晰） | Python | **BLOCK**，logic high 0.89×2 | ✅ 命中 |
| [echo#1718](2026-06-25__echo__revert-pr1718.md) | 目录穿越（`path.Clean`→Windows `\` 逃逸，**subtle**） | Go | **BLOCK**，logic high 0.86 | ✅ 命中，机理准确 |
| [smallvec](2026-06-25__smallvec__revert-pr254.md)（RUSTSEC-2021-0003, commit 9998ba0） | `insert_many` 缓冲区溢出（**unsafe，难**） | Rust | **BLOCK**，logic high 0.81 | ✅ 命中，推理 unsafe 指针越界 |

| [cJSON #800](2026-06-25__cJSON__revert-pr800.md)（commit 3ef4e4e） | 堆缓冲区越界读（**删除式**：移除边界检查） | C | **BLOCK**，security high 0.82 | ✅ 命中，精确还原越界路径 |

**覆盖语言：JS / Python / Go / Rust / C，5 个真实 CVE 全部 BLOCK。**

> **值得注意（删除式漏洞）**：cJSON 这例的 revert 是**纯删除**（移除一行边界检查），diff 里没有 `+` 新增行。
> 尽管系统提示说"只审查新增/修改、不评论已删除代码"，模型仍正确推理出**删除该检查后**剩余代码的越界后果
> （`{"a":1,` → `offset++` 越界 → `parse_string` 读 `content[length]`）。说明对"删除安全防护即引入漏洞"这类
> 常见真实场景，ReviewGate 也能覆盖（行为目前靠模型判断，后续可在 prompt 里显式确认以更可靠）。

## 细节
- **echo**：准确指出 `path.Clean` 仅识别 `/`、不识别 Windows 的 `\`，导致 `..\` 在 Windows 上逃逸 root；
  `filepath.Clean` 才是 OS 感知的。subtle 平台相关漏洞，机理解释正确。
- **smallvec**：推理 `unsafe` 指针路径——`set_len(0)` 后 `reserve(1)` 无法判断需 spill 到堆，
  迭代器元素超过 inline 容量时 `ptr::copy/write` 越界写。真实 unsafe 内存安全分析，非照抄。
- **axios**：准确指出 `isFormData` 移除原型污染防护后，攻击者可用 `Object.prototype[Symbol.toStringTag]='FormData'`
  让普通对象伪装成 FormData，再经 `getHeaders()` 注入 `Authorization` 头；还指出第二道防御
  `getHeaders !== Object.prototype.getHeaders` 被移除、以及安全回归测试被删除。攻击链解释正确。
- **gradio**：准确指出 `_safe_join` 被换成 `os.path.normpath(os.path.join(root_dir, *seg))` 后，
  `["/etc/passwd"]`（绝对段丢弃 root 前缀）与 `["..",".."]`（爬升）都能逃逸 `root_dir`；单/多文件两个分支都报。

## 诚实的方法学说明（重要）
- revert 法会把**修复自带的注释/测试**作为"被删除行"留在 diff 里（如 gradio 测试名、axios 注释里出现 `GHSA-…`），
  这对模型构成**提示**，可能高估召回。
- 但两例的**机理解释**（原型污染 gadget、join 逃逸路径）是模型自身推理、非照抄公告，且修复的**源码注释很简短**，
  逻辑判断主要来自代码本身。更严格的做法是只 revert 源文件、剥离测试与注释——本轮 gradio 源文件修复本身不含 GHSA 注释，
  其 logic 维度仍从纯代码判出穿越，可佐证非纯靠提示。
- 结合[植入式 bug 测试](2026-06-25__recall-planted-bugs.md)（无任何提示、纯新代码），召回证据是充分的。
