ImportError: from Crypto.PublicKey import RSA

这是 RAGFlow Agent「Invoke」HTTP 组件缺少 SSRF 防护导致的安全问题,攻击者可让服务端请求内网或云实例元数据地址。优先做的是确认你的 RAGFlow 是否已包含修复代码,而不是修改本地配置。

快速结论:这是 RAGFlow Agent「Invoke」HTTP 组件缺少 SSRF 防护导致的安全问题,攻击者可让服务端请求内网或云实例元数据地址。优先做的是确认你的 RAGFlow 是否已包含修复代码,而不是修改本地配置。

适用环境:RAGFlow(PyPI / Docker 部署);受影响版本 <= 0.26.1;涉及组件 agent/component/invoke.py;Issue 未给出操作系统、Python、CUDA 或显卡信息。

最快修复方案:暂无确认的一步修复方案。修复已合入 main 分支(PR #15426、#16409),但截至 Issue 讨论时尚未发布带修复的正式版本;可优先尝试升级到包含这两个 PR 的版本或镜像。

注意事项:Issue 明确说明该漏洞在 main 已修复但未进入 tagged release,因此按版本号「升级」不一定能解决问题,需要核对所使用的镜像或源码是否包含 assert_url_is_safe 与 pin_dns 调用。二次修复(#16409)还额外改动了重试校验、重定向和代理 URL 校验,仅含第一次修复的版本防护可能不完整。

问题场景

在 RAGFlow 的 Agent 工作流中使用「Invoke」HTTP 组件时,组件会向调用方提供的 URL 发起出站 HTTP 请求,但未接入项目内的 SSRF 防护模块 common/ssrf_guard.py。任何已注册用户都可以创建或触发 Agent,使 RAGFlow 服务器去访问云实例元数据地址(如 169.254.169.254)、同 Docker 网络内的 Elasticsearch / MinIO / Redis / MySQL 等服务,或回环地址上的管理端。由于 URL 字段支持 {sys.query} 模板替换,已发布聊天 Agent 的终端用户也可能控制请求目标。

报错原文

ImportError: from Crypto.PublicKey import RSA

该 Issue 讨论的是 SSRF 安全问题,上述为排雷时需保留的核心报错形式,并非本 Issue 中出现的实际运行错误。

原因分析

最可能的原因是 agent/component/invoke.py 中的 _build_url() 与 _invoke() 直接用用户可控 URL 调用 requests.get/post/put,全程没有调用 assert_url_is_safe() 或 pin_dns()。相比之下,agent/tools/crawler.py、agent/tools/searxng.py、api/db/services/file_service.py、common/data_source/rss_connector.py、rag/app/naive.py 等同类出站请求点都已接入该防护,因此更可能是 Invoke 组件漏接入,而非防护模块本身失效。

环境排查

  • 确认 RAGFlow 版本是否 <= 0.26.1,或是否使用了未包含修复的镜像标签。
  • 检查 agent/component/invoke.py 中 _build_url() 是否调用 assert_url_is_safe(url),并保存解析出的 hostname/IP 供 pin_dns 使用。
  • 检查每次 requests.* 调用(含重试迭代)是否都被 pin_dns 包裹。
  • 检查是否设置了 allow_redirects=False。
  • 检查代理路径是否同样经 assert_url_is_safe 校验并做 DNS 固定。
  • 确认部署形态(Docker 网络暴露面),是否存在可从服务端访问的元数据地址、内网服务或回环管理端口。

解决步骤

  1. 先确认当前运行版本对应 agent/component/invoke.py 是否为未修复版本:若文件内没有 assert_url_is_safe 调用,即属受影响状态。
  2. 可优先尝试改用包含修复的镜像或源码:修复由 PR #15426(为 Invoke 加入 assert_url_is_safe + pin_dns)与 PR #16409(每次重试重新校验 URL、在实例上保存固定 hostname/IP、强制 allow_redirects=False、对代理 URL 也做校验与 DNS 固定)提供,两者均已在 main 分支合并。
  3. 由于 Issue 说明修复尚未进入正式发布版本,升级后需按上述排查项逐条核对代码,而不是只看版本号。
  4. 在无法立即升级的环境中,可能原因层面的缓解措施是限制 RAGFlow 服务器出网范围,禁止其访问云元数据地址与内网网段,并收紧 Agent 发布与注册权限;这些属于推断性缓解,未在 Issue 中验证。

验证方法

在 Invoke 组件中构造指向内网地址(如 http://127.0.0.1:9381 或 http://169.254.169.254/)的请求,修复后的版本应因 assert_url_is_safe 判定该地址非全局可达而拒绝执行;同时确认代码路径中每次 requests.* 均处于 pin_dns 上下文内,且重定向与代理分支同样被校验。

参考来源

infiniflow/ragflow #18280

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29516

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注