针对 Apache Camel 漏洞的可运行概念验证复现程序:当 CXF SOAP 消费者背后的路由因抛出服务契约未声明的异常而失败时,该异常会被回传给 SOAP 客户端并写入故障信息:CXF 会将消息复制到 SOAP 的 faultstring 中(并且可以配置为将堆栈跟踪放入故障详情中)。因此,能够引发故障的外部调用者可以读取有关部署的内部细节——类名和包名,以及异常消息所携带的任何内容。已声明的故障(标注了 @WebFault)则另当别论:它们属于客户端所依据的已发布契约的一部分,因此仍会完整报告。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-cxf-soap 4.22.0(受影响;修复版本 4.22.1),Tomcat 上的 CXFServlet |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-cxf-soap(Camel 4.15.0,受影响;修复对照 CQ 3.40.0 / Camel 4.22.1) |
两个模块均演示了受影响以及修复后的行为。
一个 CXF SOAP 消费者支撑着一条路由,该路由的处理器会抛出一个未声明的 IllegalStateException,其中携带模拟的内部细节(一个标记令牌和一个伪造的内部 JDBC URL)。驱动程序充当 SOAP 客户端:它调用服务并读取返回给它的 SOAP 故障。
Exchange processing failed——不携带路由异常的类名、消息或堆栈跟踪(新增的 muteException 消费者选项默认为 true)。契约声明的故障(@WebFault)仍会完整返回。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: fault leaks internal detail; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85257-cxf-fault-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic fault; >>> 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): fault leaks internal detail
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: generic fault
| 属性 | 值 |
|---|---|
| 组件 | camel-cxf(CxfConsumer,SOAP fault 构建) |
| CWE | CWE-209(生成包含敏感信息的错误消息) |
| 严重程度 | 中危 |
| 攻击向量 | SOAP 调用方触发未声明的路由失败,并从 fault 中读取异常详情 |
| 影响 | 信息泄露:异常类/消息(内部主机名、连接字符串、路由结构)到达外部 SOAP 调用方 |
| 受影响版本 | 从 4.0.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24477 |
| 致谢 | Claude Security Scan Tool |
公告:https://camel.apache.org/security/CVE-2026-85257.html
Spring Boot 模块将 CXFServlet 挂载到内嵌 Tomcat 上(独立的 CXF Jetty 传输会与 Spring Boot 管理的 Jetty 版本冲突),因此 SOAP 端点通过端口 8080 上的
/services/hello提供服务。
CxfConsumer 新增了 muteException 消费者选项(默认 true)。
对于未声明的路由失败,它现在使用一个带有空堆栈跟踪的替代 Exception("Exchange processing failed")
来构建 fault,而不是使用路由的异常——因此不会有类名、消息或堆栈跟踪到达
调用方。契约声明的异常(@WebFault)会被检测并完整报告,因为抑制它
会破坏服务。设置 muteException=false 可恢复之前的输出。
声明服务允许报告的异常,并在 onException 处理器中将所有其他失败映射到其中之一,
这样就不会有未声明的异常到达 fault。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该 漏洞、验证自己是否受影响,并确认升级可以解决该问题。失败路由中的标记令牌和 JDBC URL 是惰性的、虚构的本地测试数据。请勿将本材料用于您不拥有或 不运营的系统。