# 召回(revert)：axios/axios#10750 — 还原安全修复以重新引入漏洞

- 修复 PR: https://github.com/axios/axios/pull/10750  (GHSA-6chq-wfr3-2hj9 原型污染-FormData伪造-头注入)
- 方法: checkout 修复提交 `e3ddeb40f6a142a234925341151e2ca631a6de64` 后 git revert -n 把工作区改回**有漏洞**状态, 审查该 diff
- 期望：security/ai_smell 维度指出被还原掉的漏洞

## 还原后的工作区 diff（节选）
```
```

## review
```
ReviewGate 审查中（3 个维度并行：security, logic, ai_smell）…
闸口：BLOCK ✗ 阻断合并    3 文件改动 · 3 条可信发现 · 0 条已过滤

lib/adapters/http.js
  ✗ [security · high · conf 0.86] L203
    【安全漏洞回归 - GHSA-6chq-wfr3-2hj9 第二防御层被移除】原条件包含 `data.getHeaders !== Object.prototype.getHeaders` 以防止污染的 Object.prototype.getHeaders 被调用。新条件仅检查 `isFunction(data.getHeaders)`，无法区分对象自身方法与被污染的 prototype 方法。一旦 isFormData 被绕过（如上一条发现），攻击者污染的 getHeaders 将直接被执行，注入任意请求头（如 Authorization: Bearer ATTACKER_TOKEN）。（另由 ai_smell/logic 维度同时标记）
    ↳ 建议：恢复 `data.getHeaders !== Object.prototype.getHeaders` 检查，或改用 `Object.prototype.hasOwnProperty.call(data, 'getHeaders')` 验证 getHeaders 是对象自身属性而非继承自污染的原型。

lib/utils.js
  ✗ [security · high · conf 0.86] L207
    【安全漏洞回归 - GHSA-6chq-wfr3-2hj9】isFormData 移除了原型污染防护：旧代码拒绝原型直接为 Object.prototype 的普通对象并校验 append 方法存在性，新代码仅依赖 toString/instanceof。攻击者通过污染 Object.prototype[Symbol.toStringTag] = 'FormData' 即可让任意普通对象（如 { userId: 42 }）通过 isFormData 检查，进而触发下游 http.js 中的 getHeaders() 调用注入恶意请求头（如 Authorization）。（另由 ai_smell/logic 维度同时标记）
    ↳ 建议：恢复旧版 isFormData 中的多层防护：1) 拒绝 prototype 为 Object.prototype 的普通对象；2) 校验 thing.append 是否为函数；3) 保留 instanceof FormData 的提前返回。这些都是 GHSA-6chq-wfr3-2hj9 修复的关键组成部分。

test/unit/adapters/http.js
  ✗ [security · high · conf 0.77] L1678
    【安全测试被删除】针对 GHSA-6chq-wfr3-2hj9 的完整原型污染回归测试（test/unit/adapters/http.js 中约 60 行）被整体移除。该测试覆盖了攻击者污染 Object.prototype 上的 getHeaders/append/pipe/on/once 及 Symbol.toStringTag 后，通过普通 POST body 注入恶意 Authorization 头部的完整攻击链。删除此测试意味着该安全漏洞即使被重新引入也不会被 CI 捕获。（另由 logic 维度同时标记）
    ↳ 建议：恢复该测试用例。它不仅是安全回归的哨兵，也记录了完整的攻击向量（Symbol.toStringTag + getHeaders + append 等），对后续维护者理解该漏洞至关重要。

```
