OpenWebui 富文本提示词 远程命令注入漏洞 | CVE-2025-64495 复现&研究

0x0 背景介绍

Open WebUI 是一个自托管的人工智能平台,设计为完全离线运行。当启用以富文本形式插入提示功能时,将自定义提示插入聊天窗口的功能存在 DOM XSS 漏洞,任何拥有创建提示权限的用户都可以利用此漏洞植入有效载荷最终导致远程命令注入漏洞。

0x1 环境搭建(Ubuntu24+docker)

1.前置条件

  • 配置AI模型(模拟真实场景),有很多办法,我这里使用内置阿里云的KEY进行
  • 访问阿里云百炼进行密钥创建即可阿里云百炼-key

2.项目搭建

  • 创建docker-compose.yml文件
  • 注意OPENAI_API_KEYS更新为申请的key
yml 复制代码
version: "3"
services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:v0.6.34
    container_name: open-webui-vuln
    restart: always
    ports:
      - "3000:8080"
    environment:
      - WEBUI_AUTH=False
      - OPENAI_API_BASE_URLS=https://dashscope.aliyuncs.com/compatible-mode/v1
      - OPENAI_API_KEYS=sk-xxx-你的key
    volumes:
      - open-webui-vuln:/app/backend/data

volumes:
  open-webui-vuln:
  • 启动环境
bash 复制代码
docker compose up -d

3.环境配置

  • 搭建完成后,大约2分钟就可以访问了,创建登录的账密即可
  • 登录后开启 以富文本的形式回填提示词

0x2 漏洞复现

手动复现步骤

  • 创建提示词

  • 创建新对话,输入/ 引用刚刚的提示词就直接弹窗了

Python检测

bash 复制代码
https://github.com/Kai-One001/cve-/blob/main/openui-shell-CVE-2025-64495.py
  • 特定反弹shell,因为 fetch('...') 含引号,被 marked 转义,导致语法错误。

PCAP检测

  • 示例是更新接口,其实响应都一样,可以看到恶意语句

  • 反弹也是同样的,通用检测都可以识别

0x3 漏洞原理分析

漏洞定位

  • 通过比对官方补丁变更记录(见下图),可快速锁定漏洞文件:
  • 漏洞文件:RichTextInput.svelte
  • 文件位置:src/lib/components/common/RichTextInput.svelte
js 复制代码
if (insertPromptAsRichText) {
    const htmlContent = marked
        .parse(text, {
            breaks: true,
            gfm: true
        })
        .trim();

    // Create a temporary div to parse HTML
    const tempDiv = document.createElement('div');
    tempDiv.innerHTML = htmlContent;
}
  • 简要说明:当用户启用了"以富文本形式插入提示时,将提示内容 text 渲染为 HTML 并插入编辑器。具体流程如下:

  • 使用 marked.parse() 将用户输入的 text(Markdown 格式)转换为 HTML 字符串;

  • 创建一个临时<div>元素,并通过 innerHTML 将生成的 HTML 注入其中,以便后续转换为 ProseMirror 节点;

  • Marked 库默认允许在 Markdown 中嵌入原始 HTML,这意味着攻击者可以在自定义提示的 content 字段中直接插入 HTML 标签这些标签会被 marked.parse() 原样保留,并通过 innerHTML 注入 DOM,从而触发 XSS 攻击。

修复对比

  • 在官方修复提交中,开发者移除了原有的直接使用 marked.parse() 生成HTML的方式,并引入了 DOMPurify 库对 HTML 内容进行安全净化:
js 复制代码
import DOMPurify from 'dompurify';

// ...

const htmlContent = DOMPurify.sanitize(
    marked.parse(text, {
        breaks: true,
        gfm: true
    }).trim()
);
  • 引入dompurify库,用于清理HTML中恶意数据,防止XSS
  • 保留了marked.parse()Markdown 渲染能力,确保富文本格式正常显示;
  • 外层包裹 DOMPurify.sanitize(),对生成的 HTML 字符串进行深度清理;
  • DOMPurify.sanitize(htmlString) 返回安全的 HTML。

0x4 修复建议

修复方案

  1. 升级到安全版本:公告链接github-open-webui-0.6.36
  2. 临时缓解措施:
    临时禁用富文本: 临时禁用以富文本形式插入提示功能,避免输入未过滤的HTML内容
    安全监控:WAF配置规则,检测针对 /prompt、/rich-text 等接口的异常HTML/JS注入行为

免责声明:本文仅用于安全研究目的,未经授权不得用于非法渗透测试活动。

相关推荐
海边夕阳20061 天前
【每天一个AI小知识】:什么是图神经网络?
人工智能·经验分享·深度学习·神经网络·机器学习
芯有所享1 天前
【芯片设计中的内存管理单元(MMU):虚拟与物理世界的“地址翻译官”】
经验分享
美洽技术1 天前
AI客服vs人工客服:80%成本降低的完整对比分析
经验分享
十二测试录1 天前
Android和iOS测试区别
android·经验分享·ios·职场发展·ab测试
Nwiliuyw1 天前
Isaac Gym的WARNING: Forcing cpu pipeline. GPU pipeline disabled无法启用问题可能是个幌子骗了你
人工智能·经验分享·学习
水力魔方1 天前
武理排水管网模拟分析系统应用专题1:开发环境设置(Windows操作系统)
windows·经验分享·swmm
TM1Club1 天前
Zoey的TM1聊天室|#3 合并报表提速:业财一体如何实现关联方对账自动化
大数据·开发语言·人工智能·经验分享·数据分析·自动化·数据库系统
金海境科技1 天前
【服务器数据恢复】影视传媒公司非编系统存储故障数据恢复案例
经验分享
夏幻灵1 天前
如何理解编译?
经验分享·笔记
李子琪。1 天前
基于大语言模型的设计创新方法研究
人工智能·经验分享