
Proof-of-concept eseguibile che riproduce CVE-2026-78162, dimostrando la deserializzazione Java non autenticata in Apache Camel camel-hazelcast su Spring Boot e Quarkus.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui camel-hazelcast creava istanze
Hazelcast senza un JavaSerializationFilterConfig su due percorsi di configurazione che l'hardening di
CVE-2026-43865 non aveva raggiunto. Su quei percorsi un member/client Hazelcast creato da Camel deserializza i valori
letti dal cluster senza alcuna restrizione di classe, quindi un attaccante in grado di pubblicare nel cluster può
far deserializzare un oggetto Java serializzato di sua scelta all'interno del livello di serializzazione di Hazelcast —
esecuzione di codice remoto (CWE-502). I cluster Hazelcast non hanno né autenticazione né TLS abilitati per impostazione
predefinita.
Questo reproduttore percorre il più chiaro dei due percorsi: ReplicatedHazelcastAggregationRepository, che
sovrascrive doStart() senza chiamare super.doStart() e, su una build affetta, avvia il proprio member locale senza
applicare il filtro predefinito. (Il percorso gemello, HazelcastDefaultComponent#getOrCreateHzClientInstance() per
hazelcastMode=client, è coperto dalla stessa correzione.)
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-hazelcast 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-hazelcast 3.29.0 (Camel 4.15.0, affetto) |
Controllo corretto-vs-affetto: la correzione è inclusa in Camel 4.18.5 / 4.22.1 / 4.23.0. Il modulo Spring Boot può eseguire sia la build affetta (4.22.0) sia quella corretta (4.22.1), quindi dimostra anche il comportamento corretto. Nessuna versione rilasciata di Camel Quarkus include ancora un Camel corretto (l'ultima, 3.29.0, è su Camel 4.15.0), quindi il modulo Quarkus dimostra solo il caso affetto.
L'app esegue una route Camel supportata da un ReplicatedHazelcastAggregationRepository senza alcuna
HazelcastInstance fornita dall'esterno, quindi il repository avvia il proprio member Hazelcast locale (cluster
predefinito dev, porta 5701). Sulla build affetta quel member non ha alcun JavaSerializationFilterConfig.
Un client attaccante si unisce quindi al cluster e pubblica un oggetto serializzato nella ReplicatedMap di
supporto. Un client Hazelcast invia solo byte — non memorizza né deserializza i valori della mappa — quindi qualsiasi
deserializzazione che si verifichi è attribuibile al member vittima. L'oggetto pubblicato è un marker
deliberatamente benigno, com.example.PwnMarker: non contiene alcuna gadget chain e non esegue alcun comando,
registra soltanto (tramite un flag globale della JVM) che il suo readObject è stato eseguito. Un vero attaccante
pubblicherebbe qui una classe gadget nota, per l'RCE — dimostrare che la classe è stata effettivamente deserializzata è
sufficiente.
Poiché il filtro predefinito della correzione è una whitelist di prefissi di nome classe java., javax. e
org.apache.camel., com.example.PwnMarker è l'oracolo perfetto:
PwnMarker viene deserializzato, readObject viene eseguito sul member vittima → PROVEN.com.example.PwnMarker prima di readObject → java.lang.SecurityException: Resolving class com.example.PwnMarker is not allowed → non sfruttato.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Output atteso su una build affetta:
=== 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
| Proprietà | Valore |
|---|---|
| Componente | camel-hazelcast (camel-hazelcast-starter / camel-quarkus-hazelcast) |
| CWE | CWE-502 (Deserializzazione di dati non attendibili) |
| Gravità | MEDIA |
| Vettore di attacco | Un attaccante in grado di pubblicare nel cluster Hazelcast a cui è connessa un'istanza interessata; il membro/client creato da Camel deserializza l'oggetto pubblicato senza alcuna restrizione di classe |
| Impatto | Esecuzione di codice remoto all'interno del processo Camel (tramite una classe gadget), prima che Camel elabori lo scambio |
| Versioni interessate | Dalla 4.0.0 precedente alla 4.18.5, dalla 4.19.0 precedente alla 4.22.1 |
| Versioni corrette | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24413, CAMEL-24420 |
| Riconoscimenti | cattier di TCBS; Leon Zlobecki |
Avviso: https://camel.apache.org/security/CVE-2026-78162.html
HazelcastSerializationFilterHelper.applyDefault(...) ha acquisito un overload ClientConfig ed è ora invocato su entrambi
i percorsi precedentemente non coperti — ReplicatedHazelcastAggregationRepository#doStart() e
HazelcastDefaultComponent#getOrCreateHzClientInstance() — così ogni configurazione Hazelcast costruita da Camel stesso
include il JavaSerializationFilterConfig predefinito (whitelist java. / javax. / org.apache.camel., blacklist
java.net.). Un Config, ClientConfig o HazelcastInstance fornito dall'utente rimane comunque inalterato. Questo avviso
è un seguito di correzione incompleta di CVE-2026-43865.
Fornire una configurazione Hazelcast esplicita che includa un JavaSerializationFilterConfig, oppure iniettare un
HazelcastInstance pre-costruito (una configurazione fornita dall'utente non viene mai sovrascritta da Camel); impostare
-Djdk.serialFilter=... a livello di JVM; e abilitare l'autenticazione e TLS del cluster Hazelcast.
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se sono interessati e confermare che l'aggiornamento la risolve. Il payload è un marker benigno che non esegue alcun codice. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.