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攻击, 中间件安全, 域名枚举, 漏洞复现, 漏洞验证, 编程工具, 请求拦截, 远程代码执行