CVE-2026-8161CVE-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 的运行机制,未捕获的异常会导致当前进程立即终止,从而实现拒绝服务攻击。这种攻击方式不需要复杂的内存破坏操作,仅通过构造特定的数据包即可使服务瘫痪。