Vega跨站脚本(XSS)漏洞分析
漏洞概述
在满足以下两个条件的应用程序中存在任意JavaScript代码执行风险:
- 应用程序将vega库和vega.View实例附加到全局window对象(类似于Vega Editor的做法)
- 允许用户自定义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)
|
|
攻击流程
- 当鼠标移动时,提供的对象的toString函数在尝试将其与1相加时被隐式调用
- toString函数被重写为"gadget函数"(VEGA_DEBUG.vega.CanvasHandler.prototype.on)
- 该函数执行以下操作:
- 使用undefined调用this.eventName(设置为console.log)
- 设置d为this._handlers
- 调用this._handlerIndex(设置为window.eval),使用从_handlers对象中索引undefined返回的字符串
影响分析
此漏洞允许DOM XSS攻击,具体形式取决于库的使用方式(可能是存储型或反射型)。利用该漏洞需要用户与页面交互。
攻击者可通过诱使用户打开恶意Vega规范来利用此问题,成功利用允许攻击者在应用程序域上下文中执行任意JavaScript,可能导致身份验证令牌等敏感信息被盗、显示给用户的数据被操纵,或以受害者身份执行未经授权的操作。
技术细节
CVSS评分:8.1(高危) 弱点类型:CWE-79 - Web页面生成期间输入中和不当(跨站脚本)