NiceGUI 交互式图像组件 SVG 内容未经净化导致的存储/反射型 XSS 漏洞解析

本文详细分析了CVE-2025-66470漏洞,该漏洞存在于NiceGUI框架的ui.interactive_image组件中,由于SVG内容未经净化即通过v-html指令渲染,导致攻击者可利用foreignObject标签注入恶意脚本。

漏洞详情

包管理器: pip 受影响包: nicegui (pip) 受影响版本: <= 3.3.1 已修复版本: 3.4.0

描述

概述 NiceGUI(3.3.1及更早版本)的 ui.interactive_image 组件中存在一个跨站脚本(XSS)漏洞。该组件使用Vue的 v-html 指令渲染SVG内容,但未进行任何净化处理。这使得攻击者可以通过SVG的 <foreignObject> 标签注入恶意的HTML或JavaScript。

详情 该漏洞位于 nicegui/elements/interactive_image.js 文件中。 组件使用以下代码渲染内容:

1
<g v-html="content"></g>

Vue的 v-html 指令将原始HTML字符串渲染到DOM中。如果应用程序允许将用户控制的输入传递给交互式图像的 content 属性,攻击者可以嵌入包含恶意脚本的 <foreignObject> 标签,从而绕过典型的图像限制。

概念验证(PoC)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from nicegui import ui

@ui.page('/')
def main():
    ui.label('NiceGUI SVG XSS PoC')
    
    # 标准图像加载
    img = ui.interactive_image('https://picsum.photos/640/360')
    
    # 负载:在SVG中嵌入原始HTML执行代码
    # 当图像组件被渲染时,此代码会立即执行
    img.content = (
        '<foreignObject>'
        '<body xmlns="http://www.w3.org/1999/xhtml">'
        '<img src=x onerror=alert("XSS-SVG")>'
        '</body>'
        '</foreignObject>'
    )

ui.run()

影响

  • 类型: 反射型 / 存储型 XSS(取决于数据来源)
  • 严重性: 中等
  • 影响: 攻击者可以注入恶意脚本,这些脚本会在图像组件被渲染或更新时执行。这对于显示用户生成内容或注释的仪表板或多用户应用程序尤其危险。

参考

  • GHSA-2m4f-cg75-76w2
  • zauberzeug/nicegui 提交记录:58ad0b3

安全评分与信息

CVSS 总体评分: 6.1(中等)

CVSS v3 基本指标向量: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N

  • 攻击向量(AV): 网络
  • 攻击复杂度(AC): 低
  • 所需权限(PR): 无
  • 用户交互(UI): 需要
  • 范围(S): 已改变
  • 保密性影响(C): 低
  • 完整性影响(I): 低
  • 可用性影响(A): 无

弱点(CWE):

  • CWE-79: 在网页生成过程中对输入的不当净化(跨站脚本)

标识符:

  • CVE ID: CVE-2025-66470
  • GHSA ID: GHSA-2m4f-cg75-76w2

源代码仓库: zauberzeug/nicegui

致谢:

  • 报告者: twmoon
  • 修复开发者: evnchn
  • 修复审核者: falkoschindler
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计