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安全, 原型污染, 同步异常, 后端安全, 安全漏洞, 异常崩溃, 拒绝服务, 数据可视化, 暴力破解, 漏洞分析, 蓝队分析, 资源分配无限制, 路径探测