
Lauffähiger Proof-of-Concept-Reproduzierer für CVE-2026-78162, der unauthentifizierte Java-Deserialisierung in Apache Camel camel-hazelcast über Spring Boot und Quarkus demonstriert.
Lauffähiger Proof-of-Concept-Reproduzierer für die Apache-Camel-Schwachstelle, bei der camel-hazelcast Hazelcast-Instanzen ohne JavaSerializationFilterConfig auf zwei Konfigurationspfaden erstellte, die von der Härtung aus CVE-2026-43865 nie erreicht wurden. Auf diesen Pfaden deserialisiert ein von Camel erstelltes Hazelcast-Member/Client Werte, die aus dem Cluster gelesen werden, ohne Klassenbeschränkung, sodass ein Angreifer, der in der Lage ist, in den Cluster zu publizieren, ein serialisiertes Java-Objekt seiner Wahl innerhalb der Serialisierungsschicht von Hazelcast deserialisieren lassen kann — Remote Code Execution (CWE-502). Hazelcast-Cluster haben standardmäßig weder Authentifizierung noch TLS aktiviert.
Dieser Reproduzierer nutzt den klarsten der beiden Pfade: ReplicatedHazelcastAggregationRepository, das doStart() überschreibt, ohne super.doStart() aufzurufen, und in einem betroffenen Build sein eigenes lokales Member startet, ohne den Standardfilter anzuwenden. (Der verwandte Pfad, HazelcastDefaultComponent#getOrCreateHzClientInstance() für hazelcastMode=client, wird durch denselben Fix abgedeckt.)
| Laufzeitumgebung | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-hazelcast 4.22.0 (betroffen; behoben in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-hazelcast 3.29.0 (Camel 4.15.0, betroffen) |
Kontrolle „behoben vs. betroffen“: Der Fix ist in Camel 4.18.5 / 4.22.1 / 4.23.0 enthalten. Das Spring-Boot-Modul kann sowohl den betroffenen Build (4.22.0) als auch den behobenen Build (4.22.1) ausführen, sodass es auch das gepatchte Verhalten demonstriert. Kein veröffentlichtes Camel Quarkus bündelt bisher ein behobenes Camel (das neueste, 3.29.0, basiert auf Camel 4.15.0), daher demonstriert das Quarkus-Modul nur den betroffenen Fall.
Die App führt eine Camel-Route aus, die von einem ReplicatedHazelcastAggregationRepository ohne von außen bereitgestellte HazelcastInstance gestützt wird, sodass das Repository sein eigenes lokales Hazelcast-Member startet (Standardcluster dev, Port 5701). In dem betroffenen Build hat dieses Member keine JavaSerializationFilterConfig.
Ein Angreifer-Client tritt dann dem Cluster bei und publiziert ein serialisiertes Objekt in die zugrunde liegende ReplicatedMap. Ein Hazelcast-Client sendet nur Bytes — er speichert oder deserialisiert keine Map-Werte —, sodass jede ausgelöste Deserialisierung dem Opfer-Member zuzuschreiben ist. Das publizierte Objekt ist ein bewusst harmloser Marker, com.example.PwnMarker: Er enthält keine Gadget-Chain und führt keinen Befehl aus, er zeichnet lediglich (über ein JVM-globales Flag) auf, dass sein readObject ausgeführt wurde. Ein echter Angreifer würde hier stattdessen eine bekannte Gadget-Klasse für RCE publizieren — der Nachweis, dass die Klasse überhaupt deserialisiert wurde, genügt.
Da der Standardfilter des Fixes eine Whitelist der Klassennamen-Präfixe java., javax. und org.apache.camel. ist, ist com.example.PwnMarker das perfekte Orakel:
PwnMarker wird deserialisiert, readObject läuft auf dem Opfer-Member → PROVEN.com.example.PwnMarker vor readObject ab → java.lang.SecurityException: Resolving class com.example.PwnMarker is not allowed → nicht ausgenutzt.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Erwartete Ausgabe bei einem betroffenen Build:
=== 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
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-hazelcast (camel-hazelcast-starter / camel-quarkus-hazelcast) |
| CWE | CWE-502 (Deserialisierung nicht vertrauenswürdiger Daten) |
| Schweregrad | MITTEL |
| Angriffsvektor | Ein Angreifer, der eine betroffene Instanz in den Hazelcast-Cluster veröffentlichen kann, mit dem sie verbunden ist; das von Camel erstellte Member/Client deserialisiert das veröffentlichte Objekt ohne Klassenbeschränkung |
| Auswirkung | Remote-Codeausführung innerhalb des Camel-Prozesses (über eine Gadget-Klasse), bevor Camel den Exchange verarbeitet |
| Betroffene Versionen | Ab 4.0.0 vor 4.18.5, ab 4.19.0 vor 4.22.1 |
| Behobene Versionen | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24413, CAMEL-24420 |
| Danksagung | cattier von TCBS; Leon Zlobecki |
Sicherheitshinweis: https://camel.apache.org/security/CVE-2026-78162.html
HazelcastSerializationFilterHelper.applyDefault(...) erhielt eine ClientConfig-Überladung und wird nun auf beiden
zuvor nicht abgedeckten Pfaden aufgerufen — ReplicatedHazelcastAggregationRepository#doStart() und
HazelcastDefaultComponent#getOrCreateHzClientInstance() — sodass jede Hazelcast-Konfiguration, die Camel selbst
erstellt, die standardmäßige JavaSerializationFilterConfig trägt (Whitelist java. / javax. / org.apache.camel., Blacklist
java.net.). Eine vom Benutzer bereitgestellte Config, ClientConfig oder HazelcastInstance bleibt weiterhin
unangetastet. Dieser Sicherheitshinweis ist eine Folgekorrektur zu einer unvollständigen Behebung von CVE-2026-43865.
Stellen Sie eine explizite Hazelcast-Konfiguration bereit, die eine JavaSerializationFilterConfig enthält, oder injizieren Sie eine vorgefertigte
HazelcastInstance (eine vom Benutzer bereitgestellte Konfiguration wird niemals von Camel überschrieben); setzen Sie den JVM-weiten
-Djdk.serialFilter=...; und aktivieren Sie die Hazelcast-Cluster-Authentifizierung und TLS.
Dieses Repository wird zu Bildungs- und Verteidigungszwecken veröffentlicht: um Apache Camel-Benutzern zu helfen, die Schwachstelle zu verstehen, zu überprüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Die Payload ist ein harmloser Marker, der keinen Code ausführt. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.