Lobe Chat SSRF漏洞分析:原生Web Fetch模块的安全风险

本文详细分析了Lobe Chat中存在的服务器端请求伪造漏洞,攻击者可通过向tools.search.crawlPages端点发送特制请求访问内部网络资源,包括本地API和云元数据端点。

Lobe Chat SSRF漏洞分析:原生Web Fetch模块的安全风险

漏洞详情

漏洞概述

当客户端向tRPC端点tools.search.crawlPages发送任意URL数组和impl: ["naive"]参数时,服务器会直接向这些URL发出出站HTTP请求。该功能缺乏防御逻辑来限制或验证对内部网络(127.0.0.1、localhost、私有范围)或元数据端点(169.254.169.254)的请求。

攻击流程

攻击流程如下:客户端输入(urls、impls)→ tRPC路由器中的服务调用 → 服务将URL传递给Crawler.crawl → Crawler优先使用用户指定的impls(naive) → naive实现直接执行服务器端fetch(url)(SSRF) → 服务器收集来自内部资源的响应。

在开发环境中,可以使用lobe-auth-dev-backend-api: 1头绕过身份验证(生产环境需要有效的token)。在PoC中,攻击者成功利用此方法从服务器端检索到localhost:8889的内部API。

受影响的版本

  • 受影响版本:<= 1.136.1
  • 修复版本:1.136.2

漏洞验证

PoC描述

在开发模式下,我们使用身份验证绕过头lobe-auth-dev-backend-api: 1进行了单个tRPC调用。由于tRPC要求body采用{"json": { ... }}格式,我们将urlsimpls: ["naive"]放在json内部,诱导服务器请求内部URL(http://localhost:8889/internal-api)。

响应遵循tRPC的包装结构,因此内部API的实际body内容包含在result.data.json.results[0].data.content中作为字符串(JSON字符串)。我们使用jq进行后处理以提高可读性。

curl示例

1
2
3
4
curl -sS -X POST 'http://localhost:3010/trpc/tools/search.crawlPages' \
  -H 'Content-Type: application/json' \
  -H 'lobe-auth-dev-backend-api: 1' \
  --data '{"json":{"urls":["http://localhost:8889/internal-api"],"impls":["naive"]}}' | jq -r '.result.data.json.results[0].data.content' | jq .

影响分析

由于服务器执行对内部网络、localhost和元数据端点的出站请求,攻击者可以滥用服务器的网络位置访问内部资源(内部API、管理端口、云元数据等)。

这可能导致内部系统信息暴露、认证令牌/密钥泄露(如IMDSv1/v2)、内部管理界面被滥用,并为进一步的横向移动提供立足点。

通过利用用户指定的impls强制使用未经过滤的naive实现,可以绕过SSRF防御措施,例如阻止私有/元数据IP、DNS重新验证/重新解析和重定向限制。

技术细节

漏洞代码位置

https://github.com/lobehub/lobe-chat/blob/d942a635b36a231156c60d824afa573af8032572/packages/web-crawler/src/crawImpl/naive.ts#L39-L45

参考信息

安全指标

CVSS评分

  • 总体评分:3.0(低危)
  • 攻击向量:网络
  • 攻击复杂度:高
  • 所需权限:高
  • 用户交互:无
  • 范围:已更改
  • 机密性:低
  • 完整性:无
  • 可用性:无

弱点分类

  • CWE-918:服务器端请求伪造(SSRF)
  • Web服务器从上游组件接收URL或类似请求并检索此URL的内容,但未能充分确保请求被发送到预期目的地。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计