CVE-2025-6985CVE-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应用的知识库泄露、配置文件暴露、云凭证窃取等严重后果。