Vega 表达式滥用 toString 调用导致跨站脚本 (XSS) 漏洞分析
Vega Cross-Site Scripting (XSS) via expressions abusing toString calls in environments using the VEGA_DEBUG global variable · CVE-2025-59840
漏洞详情
影响范围
满足以下两个条件的应用程序面临任意 JavaScript 代码执行风险,即使使用"安全模式"表达式解释器:
在应用程序中将 vega 库和 vega.View 实例附加到全局 window 对象(类似于 Vega Editor 的做法)
允许用户定义的 Vega JSON 定义(而非仅通过源代码提供的 JSON)
修复版本
如果使用最新的 Vega 6.x 系列:
vega 6.2.0 / vega-expression 6.1.0 / vega-interpreter 2.2.1(如果使用 AST 评估器模式)
如果使用非 ESM 环境中的 Vega:
vega-expression 5.2.1 / 1.2.1(如果使用 AST 评估器模式)
临时解决方案
用户无需升级即可修复或缓解漏洞的方法:
不要将 vega View 实例附加到全局变量,正如编辑器曾经的做法
不要将 vega 库附加到全局 window 对象,正如编辑器曾经的做法
这些将 vega 库和 View 实例附加到全局的做法可能便于调试,但不应在生产环境或任何可能由不受信任方提供 vega/vega-lite 定义的情况下使用。
PoC 摘要
Vega 在安全上下文中提供表达式评估,禁止任意函数调用。当事件暴露给表达式时,可以获取 window 对象的成员。由于这种暴露,在某些应用程序中,精心构造的重写其 toString 方法的对象可以通过调用 this.foo(this.bar)实现 DOM XSS。
实际上,全局 VEGA_DEBUG 代码中存在这样的可访问小工具:
PoC 详情
此有效载荷创建了一个场景:每当移动鼠标时,尝试将其与 1 相加时会隐式调用所提供对象的 toString 函数。toString 函数已被重写为"小工具函数"(VEGA_DEBUG.vega.CanvasHandler.prototype.on),该函数执行以下操作:
PoC 链接
导航到 vega 编辑器,移动鼠标,观察配置中的任意 JavaScript 到达 eval 接收器并实现 DOM XSS。
未来调查
在未启用 VEGA_DEBUG 的情况下,理论上可能存在其他全局范围内的小工具允许类似行为。在使用 AST 评估器且存在阻止获取 eval 引用的情况下,理论上可能存在其他全局范围内的小工具(如 jQuery),允许以相同方式实现 eval(如 $.globalEval)。截至本文撰写时,尚未发现此类全局范围内的小工具。
影响
此漏洞允许 DOM XSS,可能是存储型或反射型,具体取决于库的使用方式。该漏洞需要用户与页面交互才能触发。
攻击者可以通过诱骗用户打开恶意的 Vega 规范来利用此问题。成功利用允许攻击者在应用程序域的上下文中执行任意 JavaScript。这可能导致窃取敏感信息(如身份验证令牌)、操纵向用户显示的数据或以受害者身份执行未经授权的操作。此漏洞危及受影响应用程序的机密性和完整性。
技术规格
严重程度
高危 - CVSS 总体评分:8.1
CVSS v3 基础指标
攻击向量:网络
攻击复杂度:低
所需权限:无
用户交互:需要
范围:未改变
机密性:高
完整性:高
可用性:无
弱点
CWE-79 - 在网页生成过程中输入中和不当(跨站脚本)
标识符
CVE ID: CVE-2025-59840
GHSA ID: GHSA-7f2v-3qq3-vvjf
受影响版本
npm vega 包: < 6.20npm vega-expression 包: >= 6.0.0, < 6.1.0 或 < 5.2.1npm vega-interpreter 包: >= 2.0.0, < 2.2.1 或 < 1.2.1 更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码







评论