
Reproductor de prueba de concepto ejecutable para CVE-2026-78162, que demuestra la deserialización de Java no autenticada en Apache Camel camel-hazelcast tanto en Spring Boot como en Quarkus.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que camel-hazelcast creaba instancias de Hazelcast sin un JavaSerializationFilterConfig en dos rutas de configuración que el endurecimiento de CVE-2026-43865 nunca alcanzó. En esas rutas, un miembro/cliente de Hazelcast construido por Camel deserializa valores leídos del clúster sin ninguna restricción de clase, por lo que un atacante capaz de publicar en el clúster puede hacer que un objeto Java serializado de su elección sea deserializado dentro de la capa de serialización de Hazelcast — ejecución remota de código (CWE-502). Los clústeres de Hazelcast no tienen ni autenticación ni TLS habilitados por defecto.
Este reproductor ejercita la más clara de las dos rutas: ReplicatedHazelcastAggregationRepository, que sobrescribe doStart() sin llamar a super.doStart() y, en una compilación afectada, inicia su propio miembro local sin aplicar el filtro por defecto. (La ruta hermana, HazelcastDefaultComponent#getOrCreateHzClientInstance() para hazelcastMode=client, queda cubierta por la misma corrección.)
| Entorno de ejecución | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-hazelcast 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-hazelcast 3.29.0 (Camel 4.15.0, afectado) |
Control corregido-vs-afectado: la corrección se incluye en Camel 4.18.5 / 4.22.1 / 4.23.0. El módulo de Spring Boot puede ejecutar tanto la compilación afectada (4.22.0) como la compilación corregida (4.22.1), por lo que también demuestra el comportamiento parcheado. Ninguna versión publicada de Camel Quarkus incluye todavía un Camel corregido (la última, 3.29.0, está sobre Camel 4.15.0), por lo que el módulo de Quarkus demuestra únicamente el caso afectado.
La aplicación ejecuta una ruta de Camel respaldada por un ReplicatedHazelcastAggregationRepository sin ningún HazelcastInstance proporcionado externamente, por lo que el repositorio inicia su propio miembro local de Hazelcast (clúster por defecto dev, puerto 5701). En la compilación afectada, ese miembro no tiene ningún JavaSerializationFilterConfig.
Un cliente atacante se une entonces al clúster y publica un objeto serializado en el ReplicatedMap de respaldo. Un cliente de Hazelcast solo envía bytes — no almacena ni deserializa los valores del mapa — por lo que cualquier deserialización que se produzca es atribuible al miembro víctima. El objeto publicado es un marcador deliberadamente benigno, com.example.PwnMarker: no contiene ninguna cadena de gadgets ni ejecuta ningún comando, solo registra (mediante un flag global de la JVM) que su readObject se ejecutó. Un atacante real publicaría aquí una clase de gadget conocida en su lugar, para lograr RCE — demostrar que la clase fue deserializada es suficiente.
Dado que el filtro por defecto de la corrección es una lista blanca de prefijos de nombre de clase java., javax. y org.apache.camel., com.example.PwnMarker es el oráculo perfecto:
PwnMarker es deserializado, readObject se ejecuta en el miembro víctima → PROBADO.com.example.PwnMarker antes de readObject → java.lang.SecurityException: Resolving class com.example.PwnMarker is not allowed → no explotado.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Salida esperada en una compilación afectada:
=== 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
| Propiedad | Valor |
|---|---|
| Componente | camel-hazelcast (camel-hazelcast-starter / camel-quarkus-hazelcast) |
| CWE | CWE-502 (Deserialización de datos no confiables) |
| Gravedad | MEDIA |
| Vector de ataque | Un atacante que pueda publicar en el clúster de Hazelcast al que está conectada una instancia afectada; el miembro/cliente construido por Camel deserializa el objeto publicado sin restricción de clases |
| Impacto | Ejecución remota de código dentro del proceso de Camel (mediante una clase gadget), antes de que Camel procese el exchange |
| Versiones afectadas | Desde 4.0.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24413, CAMEL-24420 |
| Crédito | cattier de TCBS; Leon Zlobecki |
Aviso: https://camel.apache.org/security/CVE-2026-78162.html
HazelcastSerializationFilterHelper.applyDefault(...) incorporó una sobrecarga de ClientConfig y ahora se invoca en ambas
rutas anteriormente no cubiertas — ReplicatedHazelcastAggregationRepository#doStart() y
HazelcastDefaultComponent#getOrCreateHzClientInstance() — de modo que toda configuración de Hazelcast que Camel construye por sí mismo
incluye el JavaSerializationFilterConfig predeterminado (lista blanca java. / javax. / org.apache.camel., lista negra
java.net.). Un Config, ClientConfig o HazelcastInstance proporcionado por el usuario sigue sin modificarse. Este aviso
es una continuación de corrección incompleta de CVE-2026-43865.
Proporcione una configuración explícita de Hazelcast que incluya un JavaSerializationFilterConfig, o inyecte un
HazelcastInstance preconstruido (Camel nunca sobrescribe una configuración proporcionada por el usuario); establezca el
-Djdk.serialFilter=... a nivel de JVM; y habilite la autenticación de clúster de Hazelcast y TLS.
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si se ven afectados y confirmar que la actualización la resuelve. El payload es un marcador benigno que no ejecuta código. No utilice este material contra sistemas que no sean de su propiedad o que no opere.