针对 Apache Camel 漏洞的可运行概念验证复现程序,该漏洞中 Smooks 数据格式
(.unmarshal().smooks(...))和 Smooks 组件(smooks:)使用 Smooks 默认解析的读取器
(Woodstox SAX 解析器)解析传入的 XML 正文,该读取器会解析外部通用实体和参数实体并
加载外部 DTD——而 camel-smooks 未应用其他 Camel XML 组件所应用的任何解析器加固措施。
因此,XML 文档中声明的带有外部子集或外部通用实体的 DOCTYPE 会在正文被反序列化时被解析
并展开,解析后的内容会被绑定到结果中。外部发送者的 XML 若到达 camel-smooks 数据格式或端点,
便可读取 Camel 进程可读的文件,或使该进程向内部主机发起请求(CWE-611)。无需任何非默认选项——
解析外部实体本就是默认行为。
仅限 Spring Boot。 本复现程序仅包含一个 Camel Spring Boot 模块。
camel-smooks没有camel-quarkus-smooks扩展,因此没有可复现的 Quarkus 对应版本。Spring Boot 模块演示了 受影响以及修复后的行为。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smooks 4.22.0(受影响;修复版本 4.22.1) |
驱动程序复刻了修复本身的回归测试(SmooksDataFormatXmlSecurityTest)。一个无害的标记文件被
写入临时目录,并通过真实的 SmooksDataFormat 使用原版 smooks-config.xml(将文档绑定到 Customer bean)
对 XML <customer> 文档进行反序列化。该文档的 firstName 是一个指向标记文件的外部实体:
<!DOCTYPE customer [<!ENTITY xxe SYSTEM "file:///…/secret.txt">]>
<customer><firstName>&xxe;</firstName>…</customer>
Customer.firstName —— 该文件泄漏到了反序列化后的 bean 中。DocumentBuilder 进行预解析(禁用外部实体和外部 DTD 加载),因此实体不会被解析,标记也永远不会出现。cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: firstName = the marker file content; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-88901-smooks-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: firstName null, marker not leaked; >>> Not exploited
| 属性 | 值 |
|---|---|
| 组件 | camel-smooks(Smooks 数据格式与组件) |
| CWE | CWE-611(XML 外部实体引用限制不当) |
| 严重性 | 高 |
| 攻击向量 | 外部发送方提供 XML 消息体,该消息体由使用默认 XML 读取器的 camel-smooks 数据格式或端点进行反序列化 |
| 影响 | 读取 Camel 进程可读的本地文件;向文档指定的内部主机发起 SSRF |
| 受影响版本 | 从 4.7.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24677 |
| 报告者 | h1ei1 |
公告:https://camel.apache.org/security/CVE-2026-88901.html
camel-smooks 现在会使用配置了 FEATURE_SECURE_PROCESSING 并禁用了外部通用实体、外部参数实体和外部 DTD 加载的 javax.xml.parsers.DocumentBuilder 对不可信 XML 进行预解析,然后将生成的 DOM 交给 Smooks——这与 XmlConverter 及其他 Camel XML 组件所使用的安全配置一致。该加固仅在 Smooks 配置使用其默认读取器解析 XML 时生效(因此 EDI、CSV、JSON 和自定义读取器配置以及编组方向均不受影响)。新增的 allowExternalEntities 选项默认禁用,可为受信任的旧版配置恢复原有行为。
请勿将 camel-smooks 应用于从不可信发送方接收的 XML。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自身是否受影响,并确认升级可解决该问题。“secret”文件由复现程序自身在临时目录中创建,仅包含一个无害的标记字符串;检查完成后即被删除。请勿将本材料用于您不拥有或运营的系统。