
CVE-2026-78162에 대한 실행 가능한 개념 증명 재현기로, Spring Boot와 Quarkus 전반에 걸쳐 Apache Camel camel-hazelcast에서 발생하는 인증되지 않은 Java 역직렬화를 시연합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 도구로, camel-hazelcast가 CVE-2026-43865 하드닝이
도달하지 못한 두 가지 구성 경로에서 JavaSerializationFilterConfig 없이 Hazelcast 인스턴스를 생성하는 문제를 다룹니다.
해당 경로에서는 Camel이 생성한 Hazelcast 멤버/클라이언트가 클러스터에서 읽은 값을 클래스 제한 없이 역직렬화하므로,
클러스터에 게시할 수 있는 공격자가 선택한 직렬화된 Java 객체를 Hazelcast의 직렬화 계층 내부에서 역직렬화되게 할 수 있습니다 —
즉 원격 코드 실행(CWE-502)입니다. Hazelcast 클러스터는 기본적으로 인증도 TLS도 활성화되어 있지 않습니다.
이 재현 도구는 두 경로 중 가장 명확한 경로를 구동합니다: ReplicatedHazelcastAggregationRepository 로,
이는 super.doStart()를 호출하지 않고 doStart()를 오버라이드하며, 영향을 받는 빌드에서는 기본 필터를 적용하지 않고
자체 로컬 멤버를 시작합니다. (형제 경로인 hazelcastMode=client용
HazelcastDefaultComponent#getOrCreateHzClientInstance()도 동일한 수정으로 커버됩니다.)
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-hazelcast 4.22.0 (영향받음; 4.22.1에서 수정됨) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-hazelcast 3.29.0 (Camel 4.15.0, 영향받음) |
수정 버전 대 영향받는 버전 대조: 수정 사항은 Camel 4.18.5 / 4.22.1 / 4.23.0에 포함됩니다. Spring Boot 모듈은 영향받는 빌드(4.22.0)와 수정된 빌드(4.22.1)를 모두 실행할 수 있으므로 패치된 동작도 보여줍니다. 아직 수정된 Camel을 번들로 포함한 Camel Quarkus 릴리스는 없으므로(최신 3.29.0은 Camel 4.15.0 기반), Quarkus 모듈은 영향받는 사례만 보여줍니다.
이 앱은 외부에서 제공된 HazelcastInstance가 없는 ReplicatedHazelcastAggregationRepository를 기반으로 하는
Camel 라우트를 실행하므로, 리포지토리가 자체 로컬 Hazelcast 멤버(기본 클러스터 dev, 포트 5701)를 시작합니다.
영향받는 빌드에서 해당 멤버에는 JavaSerializationFilterConfig가 없습니다.
그런 다음 공격자 클라이언트가 클러스터에 참여하여 백킹 ReplicatedMap에 직렬화된 객체를 게시합니다. Hazelcast
클라이언트는 바이트만 전송할 뿐 — 맵 값을 저장하거나 역직렬화하지 않으므로 — 발생하는 모든 역직렬화는
피해자 멤버에 귀속됩니다. 게시되는 객체는 의도적으로 무해한 마커인
com.example.PwnMarker로, 가젯 체인도 없고 명령도 실행하지 않으며, 단지 (JVM 전역 플래그를 통해) 자신의 readObject가
실행되었음을 기록할 뿐입니다. 실제 공격자는 RCE를 위해 여기에 알려진 가젯 클래스를 게시할 것이며 — 클래스가
역직렬화되었다는 사실만 입증해도 충분합니다.
수정 사항의 기본 필터는 java., javax., org.apache.camel. 클래스 이름 접두사의 화이트리스트이므로,
com.example.PwnMarker는 완벽한 오라클입니다:
PwnMarker가 역직렬화되고, 피해자 멤버에서 readObject가 실행됨 → 입증됨.readObject 전에 com.example.PwnMarker를 거부함 → java.lang.SecurityException: Resolving class com.example.PwnMarker is not allowed → 악용되지 않음.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
영향을 받는 빌드에서 예상되는 출력:
=== CVE-2026-78162 — camel-hazelcast ReplicatedHazelcastAggregationRepository ===
=== missing JavaSerializationFilterConfig on the Camel-built member ===
Attacker client joined the victim cluster 'dev' at 127.0.0.1:5701.
Attacker published a com.example.PwnMarker into ReplicatedMap 'aggregation'.
Result:
>>> PROVEN: the Camel-built Hazelcast member deserialized an attacker-supplied, non-whitelisted
>>> class (com.example.PwnMarker) with no JavaSerializationFilterConfig in effect — its readObject
>>> executed inside the victim. A real attacker would publish a gadget class here instead, for RCE.
>>> PwnMarker.readObject executed inside the victim member; tag=attacker-rce-marker; thread=hz.*.partition-operation.thread-1
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-hazelcast (camel-hazelcast-starter / camel-quarkus-hazelcast) |
| CWE | CWE-502 (신뢰할 수 없는 데이터의 역직렬화) |
| 심각도 | MEDIUM |
| 공격 벡터 | 영향을 받는 인스턴스가 연결된 Hazelcast 클러스터에 게시할 수 있는 공격자; Camel이 구축한 멤버/클라이언트가 게시된 객체를 클래스 제한 없이 역직렬화함 |
| 영향 | Camel이 exchange를 처리하기 전에 Camel 프로세스 내부에서 원격 코드 실행 (gadget 클래스 경유) |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24413, CAMEL-24420 |
| 크레딧 | TCBS의 cattier; Leon Zlobecki |
권고문: https://camel.apache.org/security/CVE-2026-78162.html
HazelcastSerializationFilterHelper.applyDefault(...)에 ClientConfig 오버로드가 추가되었고, 이제 이전에
다루지 않았던 두 경로 — ReplicatedHazelcastAggregationRepository#doStart()와
HazelcastDefaultComponent#getOrCreateHzClientInstance() — 에서 모두 호출되므로, Camel이 직접 구축하는 모든
Hazelcast 구성이 기본 JavaSerializationFilterConfig(화이트리스트 java. / javax. / org.apache.camel., 블랙리스트
java.net.)를 갖추게 됩니다. 사용자가 제공한 Config, ClientConfig 또는 HazelcastInstance는 여전히 그대로
유지됩니다. 이 권고문은 CVE-2026-43865에 대한
불완전한 수정의 후속 조치입니다.
JavaSerializationFilterConfig를 포함하는 명시적 Hazelcast 구성을 제공하거나, 미리 구축된
HazelcastInstance를 주입하십시오(사용자가 제공한 구성은 Camel이 절대 덮어쓰지 않음). JVM 전역
-Djdk.serialFilter=...를 설정하고, Hazelcast 클러스터 인증과 TLS를 활성화하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 검증할 수 있도록 돕기 위함입니다. 페이로드는 코드를 실행하지 않는 무해한 마커입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.