🔴 严重 | CVE-2026-12866 — All versions of the package expr-eval are vulnerab...
🔴 【深度分析】严重安全漏洞:CVE-2026-12866
CVSS 评分: 严重(9.2)🔴 状态: Deferred 发布时间: 2026-06-23
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-12866 |
| CVSS 评分 | 9.2 🔴 |
| 严重程度 | 严重 |
| CVSS 向量 | CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X |
| CWE 分类 | CWE-94,CWE-94 |
| 发布时间 | 2026-06-23 |
| 最后更新 | 2026-06-23 |
| 状态 | Deferred |
| 数据来源 | report@snyk.io |
好的,请看基于您提供的 NVD 数据生成的深度安全分析文章。
⚠️ 严重漏洞预警:CVE-2026-12866
CVSS 4.0 评分:9.2(严重)
CVSS 向量: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
危害等级: 严重(Critical)
漏洞概述
CVE-2026-12866 是一个影响广泛使用的 JavaScript 表达式解析库 expr-eval 的严重安全漏洞。该漏洞存在于 toJSFunction() API 中,允许攻击者通过精心构造的表达式,绕过沙箱限制,最终在应用上下文中执行任意 JavaScript 代码。成功利用此漏洞可能导致完全的数据泄露、服务中断甚至服务器被接管。所有版本的 expr-eval 均受影响。
受影响组件与版本
- 受影响组件:
expr-eval(npm 包) - 影响版本: 所有版本(All versions)
此漏洞影响范围极广,任何在其产品中集成了 expr-eval 库并允许用户输入或外部数据传递到 toJSFunction() 的应用都将处于高风险状态。
漏洞原理分析
该漏洞的核心在于 expr-eval 库的 toJSFunction() 方法在处理用户输入时,存在危险的反序列化/代码生成风险。
功能机制:
expr-eval库本身是一个安全的表达式解析器,旨在将数学或逻辑表达式(如2 + 3或x > 5)解析为可执行的函数。为了方便性能优化或集成,库提供了toJSFunction()方法,该方法试图将解析后的表达式树编译成原生 JavaScript 函数。漏洞成因: 根据漏洞描述和 CWE-94(代码生成控制不当)分类,问题出在
toJSFunction()的实现方式上。为了将表达式转换为原生 JS 函数,该库很可能使用了new Function()构造函数。new Function()是一个强大的 JavaScript 特性,它允许从字符串动态创建函数。然而,这个特性本身就是一个巨大的安全风险,因为它会创建一个新的全局作用域,并直接执行传入的字符串作为函数体。攻击向量: 攻击者无需认证(
PR:N)也无需用户交互(UI:N)。他们只需要通过网络(AV:N)向目标应用发送一个精心构造的表达式字符串。这个字符串看似是一个合法的表达式,但实际上包含了恶意的 JavaScript 代码。当toJSFunction()调用new Function('return ' + maliciousExpression)或类似操作时,攻击者的代码就脱离了表达式沙箱的限制,直接以当前应用程序的权限运行。例如,一个看似无辜的表达式如1 + 1可以被替换为1; require('child_process').execSync('rm -rf /'); //之类的代码。攻击复杂度: 攻击者需要理解
expr-eval库对表达式语法的处理方式,以及如何绕过其内置的安全检查。虽然这需要一些技术知识,但一旦构造出有效的 payload,攻击过程本身的复杂度较低(AC:L)。然而,值得注意的是 CVSS 向量中的AT:P(攻击所需目标:存在),这暗示了利用漏洞需要绕过某些特定的防护机制,例如沙箱对Function构造函数的屏蔽或正则表达式检查。尽管存在这些预设限制(AT:P),但在真实世界中,找到绕过方法仍然被认为是可行的,因此攻击复杂度依然被判定为低。
影响评估
攻击复杂度: 低
所需权限: 无(远程未授权)
用户交互: 无需
攻击向量: 网络(远程)
潜在后果(严重):
- 机密性丧失(VC:H):攻击者可以读取服务器上的任意文件,包括数据库凭据、源代码、用户数据等。
- 完整性丧失(VI:H):攻击者可以修改或删除数据,植入后门,或篡改应用逻辑。
- 可用性丧失(VA:H):攻击者可以执行拒绝服务攻击,关闭服务,或完全控制服务器导致业务中断。
此漏洞属于“一键式”RCE(远程代码执行)漏洞,对业务连续性和数据安全构成直接、致命的威胁。即使在 CVSS 4.0 评分体系中对被攻击目标(AT:P)和后续影响(SC:S等)有一定权衡,其基础评分 9.2 已充分说明其严重性。任何使用此库的团队都应将此漏洞视为最高优先级的风险。
修复建议
鉴于 expr-eval 的所有版本均受影响且状态为“Deferred”(延期,暗示官方可能不会发布修复补丁),以下是紧急的修复和缓解措施:
立即停用并替换库(强烈推荐):
- 根本解决方案: 立即停止使用
expr-eval库。寻找一个设计上更安全、且不依赖new Function()进行表达式评估的替代品。例如:- math.js:一个强大的数学库,但有更明确的沙箱和安全评估模式。
- filtrex:一个专门为安全而设计的简单表达式引擎,不执行任意代码。
- jexl:另一个表达式语言引擎,同样注重安全。
- 操作步骤: 在
package.json中移除expr-eval依赖,并重构相关代码,改用新的、安全的库。
- 根本解决方案: 立即停止使用
立即修复/禁用脆弱 API(临时缓解):
- 完全禁用
toJSFunction()调用: 如果无法立即替换整个库,必须立即审查代码库,找到所有调用toJSFunction()的地方。如果可以,完全移除或禁用这些调用。改为使用库中其他不生成原生 JS 的评估方法(如evaluate()),如果其本身也是安全的。但需注意,evaluate()方法也可能存在其他已知或未知的绕过风险。
- 完全禁用
实施严格的输入验证(辅助措施,不能完全依赖):
- 使用正则表达式白名单: 定义一个极其严格的正则表达式,只允许非常有限的字符集(例如,仅允许数字、运算符、括号),并彻底禁止任何函数调用、属性访问或特殊字符。
- 沙箱化执行环境(如果业务逻辑必须): 如果业务逻辑无法避免使用
toJSFunction(),必须在一个隔离的子进程或使用vm2(注意vm2自身也有历史漏洞,需评估)、isolated-vm等更高级的沙箱技术中执行该函数。但请记住,这只能作为最后的手段,且无法保证万无一失。
部署 WAF 规则:
- 在 Web 应用防火墙(WAF)上编写规则,拦截包含可疑 JavaScript 代码模式(如
require、process、eval、Function、constructor等)的请求,作为应急的防御层。
- 在 Web 应用防火墙(WAF)上编写规则,拦截包含可疑 JavaScript 代码模式(如
参考资料
- CVE 详情页: https://nvd.nist.gov/vuln/detail/CVE-2026-12866
- CWE-94(代码生成控制不当): https://cwe.mitre.org/data/definitions/94.html
- NPM 包
expr-eval: https://www.npmjs.com/package/expr-eval (请注意核对包的官方状态和仓库)