dajneem23/CVE-2026-21710
GitHub: dajneem23/CVE-2026-21710
针对 Node.js「req.headersDistinct」原型链缺陷导致的拒绝服务漏洞(CVE-2026-21710)提供概念验证代码与复现环境。
Stars: 0 | Forks: 0
# CVE-2026-21710 — Node.js `req.headersDistinct` 拒绝服务漏洞
## 概述
| 字段 | 值 |
|---|---|
| **CVE ID** | CVE-2026-21710 |
| **发布日期** | 2026-03-30 |
| **CVSS v3.1** | 7.5 HIGH (`AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H`) |
| **CWE** | CWE-770 — 无限制或无节流的资源分配 |
| **受影响版本** | Node.js 20.x, 22.x, 24.x, 25.x |
| **修复版本** | [2026 年 3 月安全版本](https://nodejs.org/en/blog/vulnerability/march-2026-security-releases) |
## 漏洞描述
Node.js HTTP 请求处理中存在一个缺陷,当接收到带有名为 `__proto__` 标头的请求,且应用程序访问 `req.headersDistinct` 时,会导致一个未捕获的 `TypeError`。
`dest["__proto__"]` 解析为 `Object.prototype` 而不是 `undefined`,导致在非数组上调用了 `.push()`。此异常是**在属性 getter 内部同步抛出**的,无法被 `error` 事件监听器拦截——除非将每一次 `req.headersDistinct` 的访问都包装在 `try/catch` 中,否则无法对其进行处理。
## 根本原因
`headersDistinct` getter 将标头值累积到一个普通对象中:
```
const dest = {};
// ...
dest[name] = dest[name] || [];
dest[name].push(value);
```
当 `name === "__proto__"` 时:
- `dest["__proto__"]` 返回 `Object.prototype`(真值,非 `undefined`)
- 跳过了 `|| []` 初始化
- 在 `Object.prototype` 上调用 `.push(value)` → `TypeError: dest[name].push is not a function`
- 同步抛出的错误逃逸了事件循环的错误边界并导致进程崩溃
## 文件列表
| 文件 | 描述 |
|---|---|
| `server.js` | 存在漏洞的 HTTP 服务器(直接访问 `req.headersDistinct`) |
| `poc.js` | 概念验证漏洞利用代码 |
## 使用方法
### 启动存在漏洞的服务器
```
node server.js
# 监听于 http://127.0.0.1:3000
```
### 运行 POC
```
node poc.js
```
**预期输出:**
1. **步骤 1** — 正常请求成功(HTTP 200)。
2. **步骤 2** — 发送 `__proto__` 标头;服务器因未捕获的 `TypeError` 崩溃。
3. **步骤 3** — 后续请求出现连接错误,确认服务器已崩溃。
## 参考
- [NVD — CVE-2026-21710](https://nvd.nist.gov/vuln/detail/CVE-2026-21710)
- [Node.js 2026 年 3 月安全版本](https://nodejs.org/en/blog/vulnerability/march-2026-security-releases)
标签:CISA项目, CMS安全, CVE-2026-21710, CWE-770, DoS, GNU通用公共许可证, HTTP请求处理, JavaScript, MITM代理, Node.js, PoC, __proto__, req.headersDistinct, Web安全, 原型污染, 同步异常, 后端安全, 安全漏洞, 异常崩溃, 拒绝服务, 数据可视化, 暴力破解, 漏洞分析, 蓝队分析, 资源分配无限制, 路径探测