SSRF via recursive sitemap fetch in `SitemapLoader` — `restrict_to_same_domain` is not enforced on nested ` ` entries

该报错发生在使用 LangChain 的 SitemapLoader 加载站点地图时,即使设置了 restrict_to_same_domain=True ,嵌套的 条目也会绕过同域限制,导致 SSRF(服务端请求伪造)漏洞。优先排查是否使用了嵌套 sitemap 索引,并检查所

快速结论:该报错发生在使用 LangChain 的 SitemapLoader 加载站点地图时,即使设置了 restrict_to_same_domain=True,嵌套的 <sitemap> 条目也会绕过同域限制,导致 SSRF(服务端请求伪造)漏洞。优先排查是否使用了嵌套 sitemap 索引,并检查所有子条目是否经过同域校验。

适用环境:langchain-community 包中的 SitemapLoader 组件;该漏洞在 langchain-community 仓库被归档(2026-05-22)后仍存在,不受 Python 版本或操作系统限制。

最快修复方案:暂无确认的一步修复方案。社区已准备好补丁(对嵌套 <sitemap> 条目在递归抓取前应用与叶子 <url> 相同的 scheme/netloc 校验),但由于仓库已归档,目前没有可合并的官方修复版本。

注意事项:该问题是安全漏洞,影响的是未维护的 langchain-community 包;在官方修复前,建议不要将 SitemapLoader 用于加载可被外部控制的 sitemap 索引,或自行应用社区补丁。

问题场景

用户在 Python 环境中使用 langchain_community.document_loaders.sitemap.SitemapLoader 加载站点地图时,发现设置 restrict_to_same_domain=True 后,攻击者仍可通过嵌套的 <sitemap> 条目让加载器请求内网地址(例如云元数据服务 http://127.0.0.1/latest/meta-data/),从而泄露敏感信息。

报错原文

SSRF via recursive sitemap fetch in `SitemapLoader` — `restrict_to_same_domain` is not enforced on nested `<sitemap>` entries

原因分析

可能原因:SitemapLoader.parse_sitemap() 方法在处理 sitemap 索引文件时,对叶子 <url> 条目会应用 restrict_to_same_domain 过滤跨域地址,但对嵌套的 <sitemap> 条目(约 L194-200)直接递归调用 self.scrape_all([loc.text], "xml"),没有进行任何域检查或内网 IP 防护,导致 aiohttp 客户端可以向任意主机发起 GET 请求。PoC 表明,即使设置了 restrict_to_same_domain=True,内部主机仍会被访问,确认同域限制被绕过。

环境排查

  • 确认使用的包:langchain-community(包含实际的 SitemapLoader 实现),而非 langchain 主包(仅含弃用转发 shim)。
  • 检查 langchain-community 版本是否已被归档(2026-05-22 后不再维护)。
  • 验证本地环境可复现:运行 PoC poc_sitemap_ssrf.py,预期输出 “SSRF CONFIRMED”。
  • 确认是否使用依赖 aiohttp 的异步抓取路径,以及是否配置了代理或自定义 DNS。

解决步骤

  1. 临时缓解(可优先尝试):避免使用 SitemapLoader 加载不可信的 sitemap 索引;如果必须使用,请将输入来源限制为完全可信的域名。
  2. 应用社区补丁(可优先尝试):参考 himanshu-commits 分支 或直接下载 17e5a21.patch,该补丁对嵌套 条目在 scrape_all() 前应用与叶子条目相同的 scheme/netloc 校验,并先去除 <loc> 的空白字符。
  3. 自行修复:修改 langchain_community/document_loaders/sitemap.pyparse_sitemap() 方法,对嵌套 <sitemap> 条目的 <loc> 执行与叶子条目相同的域检查逻辑(比较 scheme 和 netloc);注意保留 restrict_to_same_domain=False 和本地 sitemap(is_local=True)的原有行为。
  4. 回归验证:对补丁添加两个离线测试:跨域嵌套 sitemap 应被跳过且不进入 scrape_all();同域嵌套 sitemap 应正常被抓取和解析。

验证方法

运行 PoC 脚本,确认输出不再是 “SSRF CONFIRMED”;攻击者提供的嵌套 <loc> 指向内网地址时不再被请求。对于补丁验证,检查日志中是否出现对内部主机的请求,并运行上述两个回归测试以确认行为正确。

参考来源

langchain-ai/langchain #38814

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18409

发表回复

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