
Reproductor de prueba de concepto ejecutable para CVE-2026-78165, que demuestra la deserialización del JDK sin filtrar de las cargas útiles de Redis PUBLISH en Apache Camel camel-spring-redis.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que camel-spring-redis, cuando no
se configura la opción serializer, construía un JdkSerializationRedisSerializer básico sin java.io.ObjectInputFilter
y lo usaba para cada lectura. RedisConsumer.setBody lo aplicaba a los bytes sin procesar de cada mensaje publicado en los
canales suscritos, antes de que se construyera el Exchange — por lo que un actor capaz de emitir PUBLISH en un canal
suscrito alcanzaba directamente el sumidero de deserialización y podía ejecutar el readObject de un grafo de objetos
serializados arbitrario (ejecución remota de código, CWE-502). El mismo serializador por defecto respaldaba los comandos de
lectura del productor (GET/HGET/HGETALL/HVALS) y SpringRedisIdempotentRepository.
| Entorno de ejecución | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-redis 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-spring-redis 3.29.0 (Camel 4.15.0, afectado) |
El defecto se remonta a la introducción del componente en 2.11.0, por lo que todas las versiones afectadas y el Camel 4.15.0 del Camel Quarkus más reciente son vulnerables. La corrección se incluye en Camel 4.18.5 / 4.22.1 / 4.23.0; el módulo de Spring Boot ejecuta tanto la compilación afectada (4.22.0) como la compilación corregida (4.22.1). Ningún Camel Quarkus publicado incluye todavía un Camel corregido.
La aplicación ejecuta una ruta de Camel que se SUBSCRIBE a cve-channel sin la opción serializer (por lo que se usa el
JdkSerializationRedisSerializer por defecto). El atacante es un cliente de Redis simple que solo puede hacer PUBLISH en ese
canal — no tiene acceso al proceso de Camel. Publica los bytes serializados sin procesar de un com.example.PwnMarker
deliberadamente benigno, cuyo readObject solo cambia un indicador global de la JVM (sin gadget, sin comando). En la compilación
afectada el consumidor lo deserializa y se ejecuta readObject; en la compilación corregida la lista de permitidos por defecto (tipos
estándar java./javax. y org.apache.camel.) rechaza com.example.PwnMarker con
InvalidClassException: filter status: REJECTED.
cd camel-spring-boot
mvn clean package
docker compose up -d --build # starts Redis + the reproducer
curl -s http://localhost:8080/exploit/attack
docker compose down
Salida esperada en la compilación afectada:
Attacker connects to Redis redis:6379 and PUBLISHes a serialized com.example.PwnMarker to channel 'cve-channel'.
PUBLISH delivered to 1 subscriber(s).
Result:
>>> PROVEN: the Redis consumer deserialized the attacker-published, non-allow-listed class
>>> (com.example.PwnMarker) with no ObjectInputFilter — its readObject executed.
| Propiedad | Valor |
|---|---|
| Componente | camel-spring-redis (camel-spring-redis-starter / camel-quarkus-spring-redis) |
| CWE | CWE-502 (Deserialización de datos no confiables) |
| Severidad | ALTA |
| Vector de ataque | PUBLISH a un canal al que se suscribe un consumidor spring-redis de Camel (o control de una clave de Redis que lee el productor); el serializador predeterminado deserializa la carga útil sin ningún filtro |
| Impacto | Ejecución remota de código dentro del proceso de Camel mediante una clase gadget, antes de que se ejecute cualquier lógica de la ruta |
| Versiones afectadas | Desde 2.11.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-24421 |
| Crédito | Leon Zlobecki |
Aviso: https://camel.apache.org/security/CVE-2026-78165.html
Una nueva opción de endpoint deserializationFilter controla el filtro aplicado mientras el serializador predeterminado lee
las cargas útiles. Cuando no se establece, se respeta el jdk.serialFilter de todo el JVM si está presente; de lo contrario, se aplica una lista de permitidos conservadora
(tipos estándar de Java y Apache Camel; java.net denegado), y en 4.23.0/4.22.1 se aplican además
los límites de forma del grafo de JEP-290. El serializador se construye a través de su constructor basado en Converter con un
conversor deserializador que establece el filtro en el flujo antes de que se lea el grafo. Establecer serializer en un
RedisSerializer personalizado sigue omitiendo el filtro, ya que entonces Camel deja de controlar cómo se lee la carga útil.
Establezca el -Djdk.serialFilter=... de todo el JVM (la ruta afectada lo respeta), o establezca la opción de endpoint serializer en
un serializador que no sea de Java, como StringRedisSerializer (como la opción serializer, no solo en un
redisTemplate personalizado). Exija autenticación en Redis y restrinja quién puede publicar en los canales suscritos.
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. La carga útil es un marcador benigno que no ejecuta ningún código. No utilice este material contra sistemas que no sean de su propiedad o que no opere.