
Prova de conceito executável que reproduz a CVE-2026-78165, demonstrando a desserialização JDK sem filtragem de payloads PUBLISH do Redis no Apache Camel camel-spring-redis.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o camel-spring-redis, quando nenhuma
opção serializer está configurada, construía um JdkSerializationRedisSerializer puro com nenhum java.io.ObjectInputFilter
e o utilizava em todas as leituras. RedisConsumer.setBody aplicava-o aos bytes brutos de cada mensagem publicada nos
canais subscritos, antes de o Exchange ser construído — pelo que um ator capaz de emitir PUBLISH num canal subscrito
alcançava diretamente o sink de desserialização e podia executar o readObject de um grafo de objetos serializados arbitrário
(execução remota de código, CWE-502). O mesmo serializador predefinido suportava os comandos de leitura do produtor
(GET/HGET/HGETALL/HVALS) e o SpringRedisIdempotentRepository.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-redis 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-spring-redis 3.29.0 (Camel 4.15.0, afetado) |
O defeito remonta à introdução do componente na versão 2.11.0, pelo que todas as versões afetadas e o Camel 4.15.0 no Camel Quarkus mais recente são vulneráveis. A correção é disponibilizada no Camel 4.18.5 / 4.22.1 / 4.23.0; o módulo Spring Boot executa tanto a build afetada (4.22.0) como a build corrigida (4.22.1). Nenhuma versão lançada do Camel Quarkus inclui ainda um Camel corrigido.
A aplicação executa uma rota Camel que faz SUBSCRIBE ao cve-channel sem qualquer opção serializer (pelo que é utilizado o
JdkSerializationRedisSerializer predefinido). O atacante é um cliente Redis simples que apenas consegue fazer PUBLISH para esse
canal — não tem acesso ao processo Camel. Publica os bytes serializados brutos de um com.example.PwnMarker deliberadamente benigno,
cujo readObject apenas altera um flag global da JVM (sem gadget, sem comando). Na build afetada
o consumidor desserializa-o e o readObject é executado; na build corrigida a allow-list predefinida (tipos padrão
java./javax. e org.apache.camel.) rejeita com.example.PwnMarker com
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
Saída esperada na build afetada:
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.
| Propriedade | Valor |
|---|---|
| Componente | camel-spring-redis (camel-spring-redis-starter / camel-quarkus-spring-redis) |
| CWE | CWE-502 (Desserialização de Dados Não Confiáveis) |
| Severidade | ALTA |
| Vetor de ataque | PUBLISH para um canal ao qual um consumidor Camel spring-redis está inscrito (ou controlo de uma chave Redis que o produtor lê); o serializador predefinido desserializa o payload sem qualquer filtro |
| Impacto | Execução remota de código dentro do processo Camel através de uma classe gadget, antes de qualquer lógica de rota ser executada |
| Versões Afetadas | Da 2.11.0 anterior à 4.18.5, da 4.19.0 anterior à 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24421 |
| Crédito | Leon Zlobecki |
Advisory: https://camel.apache.org/security/CVE-2026-78165.html
Uma nova opção de endpoint deserializationFilter controla o filtro aplicado enquanto o serializador predefinido lê
os payloads. Quando não definido, o jdk.serialFilter à escala da JVM é respeitado se estiver presente, caso contrário
é aplicada uma lista de permissões conservadora (tipos Java padrão e Apache Camel; java.net negado), e nas versões
4.23.0/4.22.1 os limites de forma de grafo da JEP-290 são adicionalmente impostos. O serializador é construído através
do seu construtor baseado em Converter com um conversor de desserialização que define o filtro no stream antes de o
grafo ser lido. Definir serializer para um RedisSerializer personalizado continua a contornar o filtro, uma vez que
o Camel deixa então de controlar a forma como o payload é lido.
Defina o -Djdk.serialFilter=... à escala da JVM (o caminho afetado respeita-o), ou defina a opção de endpoint
serializer para um serializador não-Java, como StringRedisSerializer (como opção serializer, não apenas num
redisTemplate personalizado). Exija autenticação no Redis e restrinja quem pode publicar nos canais subscritos.
Este repositório é publicado para fins educativos e defensivos: para ajudar os utilizadores do Apache Camel a compreender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. O payload é um marcador benigno que não executa qualquer código. Não utilize este material contra sistemas que não possui ou opera.