
Lauffähiger Proof-of-Concept-Reproduzierer für CVE-2026-78165, der die ungefilterte JDK-Deserialisierung von Redis-PUBLISH-Payloads in Apache Camel camel-spring-redis demonstriert.
Lauffähiger Proof-of-Concept-Reproduzierer für die Apache-Camel-Schwachstelle, bei der camel-spring-redis, wenn keine
serializer-Option konfiguriert war, einen reinen JdkSerializationRedisSerializer ohne java.io.ObjectInputFilter
erzeugte und ihn für jeden Lesevorgang verwendete. RedisConsumer.setBody wandte ihn auf die Rohbytes jeder Nachricht an, die auf den
abonnierten Kanälen veröffentlicht wurde, bevor der Exchange konstruiert wurde — ein Akteur, der PUBLISH auf einem abonnierten
Kanal ausführen konnte, erreichte somit direkt die Deserialisierungs-Senke und konnte readObject eines beliebigen serialisierten Objektgraphen
ausführen (Remote Code Execution, CWE-502). Derselbe Standard-Serializer lag auch den Lese-Befehlen des Producers
(GET/HGET/HGETALL/HVALS) und dem SpringRedisIdempotentRepository zugrunde.
| Laufzeitumgebung | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-redis 4.22.0 (betroffen; behoben in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-spring-redis 3.29.0 (Camel 4.15.0, betroffen) |
Der Defekt reicht bis zur Einführung der Komponente in 2.11.0 zurück, sodass jede betroffene Version und das Camel 4.15.0 im neuesten Camel Quarkus anfällig sind. Der Fix wird mit Camel 4.18.5 / 4.22.1 / 4.23.0 ausgeliefert; das Spring-Boot-Modul führt sowohl den betroffenen Build (4.22.0) als auch den behobenen Build (4.22.1) aus. Kein veröffentlichtes Camel Quarkus bündelt bisher ein behobenes Camel.
Die App führt eine Camel-Route aus, die cve-channel mit SUBSCRIBE abonniert, ohne serializer-Option (sodass der Standard-
JdkSerializationRedisSerializer verwendet wird). Der Angreifer ist ein einfacher Redis-Client, der nur PUBLISH auf diesen
Kanal ausführen kann — er hat keinen Zugriff auf den Camel-Prozess. Er veröffentlicht die rohen serialisierten Bytes eines bewusst harmlosen
com.example.PwnMarker, dessen readObject lediglich ein JVM-globales Flag umschaltet (kein Gadget, kein Befehl). Beim betroffenen
Build deserialisiert der Consumer ihn und readObject wird ausgeführt; beim behobenen Build lehnt die standardmäßige Allow-List (Standard-
java./javax.- und org.apache.camel.-Typen) com.example.PwnMarker mit
InvalidClassException: filter status: REJECTED ab.
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
Erwartete Ausgabe beim betroffenen Build:
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.
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-spring-redis (camel-spring-redis-starter / camel-quarkus-spring-redis) |
| CWE | CWE-502 (Deserialisierung nicht vertrauenswürdiger Daten) |
| Schweregrad | HOCH |
| Angriffsvektor | PUBLISH an einen Kanal, den ein Camel-spring-redis-Consumer abonniert (oder Kontrolle über einen Redis-Schlüssel, den der Producer liest); der Standard-Serializer deserialisiert die Nutzlast ohne Filter |
| Auswirkung | Remote-Code-Ausführung innerhalb des Camel-Prozesses über eine Gadget-Klasse, bevor jegliche Routenlogik ausgeführt wird |
| Betroffene Versionen | Ab 2.11.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-24421 |
| Danksagung | Leon Zlobecki |
Advisory: https://camel.apache.org/security/CVE-2026-78165.html
Eine neue Endpoint-Option deserializationFilter steuert den Filter, der angewendet wird, während der Standard-Serializer
Nutzlasten liest. Wenn sie nicht gesetzt ist, wird der JVM-weite jdk.serialFilter beachtet, sofern vorhanden, andernfalls wird eine konservative Allow-List
(Standard-Java- und Apache-Camel-Typen; java.net verweigert) angewendet, und in 4.23.0/4.22.1 werden zusätzlich die JEP-290-Graph-Shape-
Limits durchgesetzt. Der Serializer wird über seinen Converter-basierten Konstruktor mit einem
deserialisierenden Converter konstruiert, der den Filter auf dem Stream setzt, bevor der Graph gelesen wird. Das Setzen von serializer auf einen
benutzerdefinierten RedisSerializer umgeht den Filter weiterhin, da Camel dann nicht mehr kontrolliert, wie die Nutzlast gelesen wird.
Setzen Sie den JVM-weiten -Djdk.serialFilter=... (der betroffene Pfad beachtet ihn), oder setzen Sie die Endpoint-Option serializer auf
einen Nicht-Java-Serializer wie StringRedisSerializer (als serializer-Option, nicht nur auf einem benutzerdefinierten
redisTemplate). Erfordern Sie Authentifizierung auf Redis und beschränken Sie, wer auf die abonnierten Kanäle veröffentlichen darf.
Dieses Repository wird zu Bildungs- und Verteidigungszwecken veröffentlicht: um Apache-Camel-Nutzern zu helfen, die Schwachstelle zu verstehen, zu überprüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Die Nutzlast 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.