针对 Apache Camel 漏洞的可运行概念验证复现程序。该漏洞中,Thrift 数据格式被反序列化到目标类型的共享 defaultInstance,而不是反序列化到一份全新的副本,并将该共享对象作为交换体返回。由于该实例在整个进程范围内共享,反序列化一条消息时写入的状态会保留在对象上,并对之后使用同一类型的每条消息可见。后续载荷中缺失的字段会保留上一条消息的值,因此在处理另一个发送者的消息时可能读取到属于某个发送者的内容,并且并发交换可能观察到彼此部分写入的状态。在通过同一路由为多个租户或用户提供服务的部署中,这会将一方的数据泄露给另一方。
仅限 Spring Boot。 不存在
camel-quarkus-thrift扩展,因此本复现程序只提供一个 Camel Spring Boot 模块。(该缺陷位于组件的ThriftDataFormat中,与运行时无关。)
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0(受影响;修复版本 4.22.1) |
一条路由定义了一个 ThriftDataFormat(由生成的 Thrift 类型 Work 支持),并像路由通常那样对每条消息复用它。两个租户通过它发送消息:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} —— 可选的 comment 字段携带敏感数据;Work{num1=3, op=SUBTRACT} —— 没有 comment 字段。该路由先反序列化租户 A 的消息,然后反序列化租户 B 的消息。
comment —— Thrift 只赋值传入字节中存在的字段,而两条消息都被反序列化到(并作为)同一个共享实例返回,因此 B 缺失的字段保留了 A 的值。两个交换体实际上是同一个对象。comment 为 null —— 每个交换都获得自己的一份已清空副本。cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| 属性 | 值 |
|---|---|
| 组件 | camel-thrift(ThriftDataFormat.unmarshal) |
| CWE | CWE-488(数据元素暴露给错误的会话) |
| 严重性 | 中 |
| 攻击向量 | 同一 Thrift 类型的两个消息通过同一条路由;后一条消息省略某个字段时会继承前一条消息的值 |
| 影响 | 跨交换/跨租户数据泄露;并发交换可能观察到彼此部分写入的状态 |
| 受影响版本 | 从 4.0.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24442 |
| 致谢 | Claude Security Scan Tool |
公告:https://camel.apache.org/security/CVE-2026-85245.html
生成的 Thrift 类型(Work、Operation)是 Apache Camel 自身 camel-thrift 测试中的公开测试夹具。
ThriftDataFormat.unmarshal 现在反序列化到每个交换的副本中:
TBase instance = defaultInstance.deepCopy(); instance.clear(); —— 然后将字节反序列化到 instance 中并
返回它。每个交换都获得自己已清空的对象,因此字段不会在消息之间传递,也没有两个交换共享同一个主体。
在数据格式运行后立即将反序列化后的主体复制到新实例中,并且不要保留对返回对象的引用。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自己是否受影响,并确认升级可以解决该问题。“secret”是一个无实际作用的虚构标记字符串。请勿将本材料用于您不拥有或运营的系统。