req.headersDistinct 拒绝服务(DoS)| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-21710 |
| 发布时间 | 2026-03-30 |
| CVSS v3.1 | 7.5 高危(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月安全发布 |
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 | 概念验证(PoC)漏洞利用 |
仅限授权的安全研究 / 负责任披露使用。
node server.js
# Listening on http://127.0.0.1:3000
node poc.js
预期输出:
__proto__ 请求头;服务器因未捕获的 TypeError 崩溃。