针对 Apache Camel 漏洞的可运行概念验证复现程序:当 gRPC 消费者 背后的路由失败时,路由异常的消息会被复制到 gRPC 的 Status 描述 中。与状态 cause(withCause(...))不同——后者仅保留在服务器本地——描述会被传输给调用方客户端,因此能够触发失败的外部调用方可以读取内部错误消息——实际上就是异常消息中携带的类名和包名、文件路径、主机名和连接详情(CWE-209)。这是与 knative、mina 和 CXF 公告一同发布的同一未静默消费者异常家族中的 gRPC 成员。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0(受影响;修复版本 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc(Camel 4.22.0,受影响;修复对照 CQ 3.40.0 / Camel 4.22.1) |
两个模块都针对真实的 camel-grpc 消费者演示了受影响 和 修复后的行为。
每个模块运行一个 camel-grpc 消费者(来自 camel-grpc 自身测试 proto 的 PingPong 服务),其路由总是以看似内部的错误消息失败:
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
验证器端点 /exploit/attack 扮演一个外部 gRPC 客户端:它调用 PingSyncSync,捕获
StatusRuntimeException,并报告服务器返回的 Status 代码和描述。
muteException 消费者选项默认值为 true,因此描述为通用的
"Exchange processing failed",真实消息永远不会离开服务器(它仅保留在仅本地的
状态原因中)。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: description leaks the internal message; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85315-grpc-exception-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"; >>> 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.22.0): description leaks the internal message
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: description is "Exchange processing failed"
每个模块在同一进程内于 8080 上为验证器提供服务,并在 50051 上运行 camel-grpc 消费者;仅
8080 对外发布。
| 属性 | 值 |
|---|---|
| 组件 | camel-grpc(GrpcMethodHandler,消费者) |
| CWE | CWE-209(生成包含敏感信息的错误消息) |
| 严重性 | 中危 |
| 攻击向量 | 外部 gRPC 客户端触发路由失败并读取传输的 Status 描述 |
| 影响 | 内部错误详情(类/包名、路径、主机名、连接详情)泄露给调用方 |
| 受影响版本 | 从 4.0.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24478 |
| 致谢 | Claude Security Scan Tool |
公告:https://camel.apache.org/security/CVE-2026-85315.html
Quarkus 受影响模块基于 CQ 3.39.0(Camel 4.22.0)构建。修复后的控制版本为 CQ 3.40.0(Camel 4.22.1)。
GrpcMethodHandler 新增了 muteException 消费者选项(默认
true)。启用后,失败的交换在传输的状态中会生成通用描述 "Exchange processing failed";路由异常仍会通过
withCause(...) 在本地附加,而 gRPC 不会将其发送给客户端。在端点上设置 muteException=false 可恢复之前的行为。
在 onException 处理器中将失败映射为显式状态,使框架永远不会将异常消息复制到描述中。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自身是否受影响,并确认升级可解决该问题。
“内部”消息是良性占位符(db.internal.local、svc_admin),整个演示在单一进程中运行。请勿将本材料用于您不拥有或
不运营的系统。