
Reprodutor de prova de conceito executável para CVE-2026-85315, demonstrando a divulgação de mensagens de exceção do consumidor camel-grpc (CWE-209) no Camel Spring Boot e Quarkus.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que, quando uma rota por trás de um consumidor gRPC
falhava, a mensagem da exceção da rota era copiada para a descrição do Status do gRPC. Diferentemente da causa do status
(withCause(...)), que permanece local ao servidor, a descrição é transmitida ao cliente que faz a chamada, de modo que um
chamador externo capaz de provocar uma falha poderia ler a mensagem de erro interna — na prática, nomes de classes e pacotes,
caminhos de arquivo, nomes de host e detalhes de conexão contidos nas mensagens de exceção (CWE-209). Este é o membro gRPC da
mesma família de exceções de consumidor não silenciadas que os avisos do knative, mina e CXF publicados junto a ele.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc (Camel 4.22.0, afetado; controle corrigido CQ 3.40.0 / Camel 4.22.1) |
Ambos os módulos demonstram o comportamento afetado e o corrigido contra o consumidor camel-grpc real.
Cada módulo executa um consumidor camel-grpc (o serviço PingPong do próprio proto de teste do camel-grpc) cuja rota sempre
falha com uma mensagem de aparência interna:
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
O endpoint verificador /exploit/attack atua como um cliente gRPC externo: ele chama PingSyncSync, captura a
StatusRuntimeException e reporta o código Status e a descrição que o servidor retornou.
muteException tem como padrão true, então a descrição é a genérica
"Exchange processing failed" e a mensagem real nunca sai do servidor (ela é mantida apenas na causa do status
local).# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: description leaks the internal message; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85315-grpc-exception-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): description leaks the internal message
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"
Cada módulo serve o verificador em 8080 e executa o consumidor camel-grpc em 50051 dentro do mesmo processo; apenas
8080 é publicado.
| Propriedade | Valor |
|---|---|
| Componente | camel-grpc (GrpcMethodHandler, consumidor) |
| CWE | CWE-209 (Geração de Mensagem de Erro Contendo Informações Sensíveis) |
| Severidade | MÉDIA |
| Vetor de ataque | Um cliente gRPC externo provoca uma falha na rota e lê a descrição do Status transmitida |
| Impacto | Detalhes internos do erro (nomes de classes/pacotes, caminhos, nomes de hosts, detalhes de conexão) são divulgados ao chamador |
| Versões Afetadas | A partir de 4.0.0 antes de 4.18.5, a partir de 4.19.0 antes de 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24478 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85315.html
O módulo afetado do Quarkus é construído sobre o CQ 3.39.0 (Camel 4.22.0). O controle corrigido é o CQ 3.40.0 (Camel 4.22.1).
GrpcMethodHandler adiciona uma opção de consumidor muteException (padrão
true). Quando habilitada, uma troca com falha produz a descrição genérica "Exchange processing failed" no
status transmitido; a exceção da rota ainda é anexada localmente por meio de withCause(...), que o gRPC não envia
ao cliente. Defina muteException=false no endpoint para restaurar o comportamento anterior.
Mapeie as falhas para um status explícito em um manipulador onException para que o framework nunca copie a mensagem da exceção
para a descrição.
Este repositório é publicado para fins educacionais e defensivos: para ajudar os usuários do Apache Camel a entender a
vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. A mensagem "interna" é um
placeholder benigno (db.internal.local, svc_admin) e toda a demonstração é executada em um único processo. Não use este
material contra sistemas que você não possui ou opera.