
Reproducer for CVE-2026-40859 — Apache Camel camel-netty-http / camel-vertx-http producer-side unsafe deserialization of HTTP response bodies (RCE)
이 프로젝트는 Apache Camel의 camel-netty-http 및 camel-vertx-http 컴포넌트에서 Java 역직렬화 취약점을 시연하며, CVE-2026-40859로 추적됩니다. 프로듀서 엔드포인트가 transferException=true(또는 컴포넌트 레벨 allowJavaSerializedObject=true)로 구성된 경우, 백엔드 HTTP 응답이 실패 상태이고 Content-Type: application/x-java-serialized-object를 가질 때, 본문이 raw java.io.ObjectInputStream으로 역직렬화되며 ObjectInputFilter가 없습니다. Camel 프로듀서가 통신하는 백엔드를 제어하는 공격자(손상된 서비스 또는 일반 HTTP 연결에 대한 중간자 공격)는 조작된 직렬화 객체를 반환할 수 있으며, 가젯 체인이 클래스패스에 있으면 Camel 호스트에서 원격 코드 실행을 달성할 수 있습니다.
권고: https://camel.apache.org/security/CVE-2026-40859.html
기본 구성에서는 악용 불가능 —
transferException의 기본값은false입니다. PoC는 이를 활성화하며, 이는 원격 예외 전파를 원하는 애플리케이션이 할 수 있는 동작입니다.
비 2xx 응답에서 netty-http 프로듀서(throwExceptionOnFailure=true, 기본값)는 populateNettyHttpOperationFailedException을 통해 응답에서 예외를 생성합니다. transferException이 켜져 있고 응답이 직렬화된 객체 콘텐츠 유형을 전달하면 본문을 역직렬화합니다:
// NettyHttpHelper.populateNettyHttpOperationFailedException(...) - 영향받는 버전
if (transferException) {
String contentType = response.headers().get(NettyHttpConstants.CONTENT_TYPE);
if (NettyHttpConstants.CONTENT_TYPE_JAVA_SERIALIZED_OBJECT.equals(contentType)) { // application/x-java-serialized-object
InputStream is = exchange.getContext().getTypeConverter().convertTo(InputStream.class, response);
if (is != null) {
Object body = deserializeJavaObjectFromStream(is); // <-- 싱크
if (body instanceof Exception) {
return (Exception) body;
}
}
}
}
// NettyHttpHelper.deserializeJavaObjectFromStream(InputStream) - 영향받는 버전
ObjectInputStream ois = new ObjectInputStream(is); // ObjectInputFilter 없음
answer = ois.readObject(); // 여기서 가젯 실행
가젯은 readObject() 내부에서 실행되며, instanceof Exception 검사 이전에 실행되므로 페이로드가 반드시 예외일 필요는 없습니다. camel-vertx-http는 VertxHttpHelper.deserializeJavaObjectFromStream에 동일한 싱크가 있습니다.
from("direct:call")
.to("netty-http://backend-host:PORT/path?transferException=true");
// throwExceptionOnFailure의 기본값은 true
백엔드가 5xx + application/x-java-serialized-object로 응답하는 모든 프로듀서 호출은 싱크를 트리거합니다.
피해자는 Camel 프로듀서입니다(역직렬화를 수행). 공격자는 프로듀서가 호출하는 백엔드를 제어합니다. 이 자체 포함된 PoC에서는 두 역할이 동일한 JVM/컨테이너에서 실행됩니다: 임베디드 raw 소켓 HTTP 서버(MaliciousBackend)가 공격자가 제어하는 백엔드 역할을 하고, Camel 라우트(VictimRoute)가 피해자입니다.
CVE-2026-40859/
├── pom.xml # camel-netty-http 4.18.2 + commons-collections 3.2.1 (가젯)
├── Dockerfile # 앱 실행 (--add-opens 필요, 가젯 빌드에만 필요)
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # 피해자: netty-http 프로듀서, transferException=true
│ ├── MaliciousBackend.java # 공격자 백엔드: 500 + 직렬화 객체 본문 on :9999
│ ├── Gadget.java # CommonsCollections6 가젯, readObject() 중 실행
│ └── ExploitController.java # /exploit/attack이 프로듀서 호출 실행
└── resources/
└── application.properties
실제 공격에서는 직렬화된 바이트가 공격자에 의해 오프라인으로 생성됩니다(예: ysoserial 사용). 피해자만 가젯 체인을 클래스패스에 가지고 있으면 됩니다. 이 PoC는 편의를 위해 가젯을 프로세스 내에서 빌드하므로, JVM이
--add-opens java.base/java.util=ALL-UNNAMED플래그로 시작됩니다. 이 플래그는 가젯 구성 세부 사항이며 취약점과는 무관합니다.
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
# -> 프로듀서가 ...NettyHttpOperationFailedException을 던짐 (예상됨)
#
# >>> RCE 증명 — /tmp/pwned 존재: true
docker exec cve-2026-40859 ls -la /tmp/pwned
docker compose down
transferException=true(또는 allowJavaSerializedObject=true)로 구성되고 공격자가 제어하거나 가로챌 수 있는 백엔드와 통신하는 모든 camel-netty-http / camel-vertx-http 프로듀서:
http://) 프로듀서 연결에 대한 중간자 공격이 응답을 대체합니다.transferException=true(또는 컴포넌트 allowJavaSerializedObject=true)인 프로듀서.throwExceptionOnFailure=true (기본값).5xx + application/x-java-serialized-object를 반환하는 공격자가 제어/가로챌 수 있는 백엔드.commons-collections:3.2.1).4.14.8 / 4.18.3 / 4.20.0으로 업그레이드하세요. 수정 사항은 두 헬퍼에 기본 ObjectInputFilter 허용 목록(java.**;javax.**;org.apache.camel.**;!*)을 적용하고, 새로운 deserializationFilter 엔드포인트 옵션 또는 JVM 전체 -Djdk.serialFilter 시스템 속성을 통해 사용자 정의할 수 있습니다.
업그레이드 전까지:
transferException=true / allowJavaSerializedObject=true를 활성화하지 마십시오.https) 를 사용하여 프로듀서 연결을 암호화하여 전송 중 응답이 대체되지 않도록 하십시오.-Djdk.serialFilter=java.**;org.apache.camel.**;!*.이 재현기는 공개적으로 공개되고 수정된 취약점에 대한 보안 연구 및 승인된 테스트 목적으로 제공됩니다. 명시적 허가 없이 시스템에 사용하지 마십시오.
| 속성 | 값 |
|---|
| 컴포넌트 | camel-netty-http, camel-vertx-http (프로듀서 측) |
| 영향받는 클래스 | org.apache.camel.component.netty.http.NettyHttpHelper#deserializeJavaObjectFromStream (및 VertxHttpHelper#deserializeJavaObjectFromStream) |
| CWE | CWE-502: 신뢰할 수 없는 데이터의 역직렬화 |
| 영향 | 원격 코드 실행 (RCE) |
| 전제 조건 | transferException=true (또는 allowJavaSerializedObject=true) + throwExceptionOnFailure=true (기본값) + 공격자가 제어하는 백엔드 |
| 영향받는 버전 | 4.0.0부터 4.14.8 미만, 4.15.0부터 4.18.3 미만, 4.19.0부터 4.20.0 미만 |
| 수정된 버전 | 4.14.8, 4.18.3, 4.20.0 |
| JIRA | CAMEL-23324 |
| 보고자 | Venkatraman Kumar (Securin) |