
Riproduttore proof-of-concept eseguibile per CVE-2026-85315, che dimostra la divulgazione dei messaggi di eccezione del consumer camel-grpc (CWE-209) in Camel Spring Boot e Quarkus.
PoC riproducibile ed eseguibile per la vulnerabilità di Apache Camel in cui, quando una route dietro un consumer gRPC
falliva, il messaggio dell'eccezione della route veniva copiato nella descrizione dello Status gRPC. A differenza della causa dello status
(withCause(...)), che rimane locale al server, la descrizione viene trasmessa al client chiamante, quindi un
chiamante esterno in grado di provocare un errore poteva leggere il messaggio di errore interno — in pratica nomi di classi e package,
percorsi di file, nomi host e dettagli di connessione contenuti nei messaggi delle eccezioni (CWE-209). Questo è il membro gRPC della
stessa famiglia di eccezioni del consumer non silenziate delle advisory knative, mina e CXF pubblicate insieme ad essa.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc (Camel 4.22.0, affetto; controllo corretto CQ 3.40.0 / Camel 4.22.1) |
Entrambi i moduli dimostrano il comportamento affetto e quello corretto nei confronti del vero consumer camel-grpc.
Ogni modulo esegue un consumer camel-grpc (il servizio PingPong dal proto di test di camel-grpc stesso) la cui route fallisce sempre
con un messaggio dall'aspetto interno:
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
L'endpoint del verificatore /exploit/attack interpreta un client gRPC esterno: chiama PingSyncSync, intercetta la
StatusRuntimeException e riporta il codice Status e la descrizione restituiti dal server.
muteException è impostata per impostazione predefinita su true, quindi la descrizione è la generica
"Exchange processing failed" e il messaggio reale non lascia mai il server (viene mantenuto solo nella causa dello
status locale).# 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"
Ogni modulo espone il verifier sulla porta 8080 ed esegue il consumer camel-grpc sulla porta 50051 all'interno dello stesso processo; solo
la 8080 è pubblicata.
| Proprietà | Valore |
|---|---|
| Componente | camel-grpc (GrpcMethodHandler, consumer) |
| CWE | CWE-209 (Generazione di messaggi di errore contenenti informazioni sensibili) |
| Gravità | MEDIA |
| Vettore di attacco | Un client gRPC esterno provoca un errore nella route e legge la descrizione Status trasmessa |
| Impatto | Dettagli interni dell'errore (nomi di classi/package, percorsi, nomi host, dettagli di connessione) vengono divulgati al chiamante |
| Versioni interessate | Dalla 4.0.0 precedente alla 4.18.5, dalla 4.19.0 precedente alla 4.22.1 |
| Versioni corrette | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24478 |
| Credito | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85315.html
Il modulo Quarkus interessato è basato su CQ 3.39.0 (Camel 4.22.0). Il controllo corretto è CQ 3.40.0 (Camel 4.22.1).
GrpcMethodHandler aggiunge un'opzione del consumer muteException (predefinita
true). Quando è abilitata, uno scambio fallito produce la descrizione generica "Exchange processing failed" nello
status trasmesso; l'eccezione della route viene comunque allegata localmente tramite withCause(...), che gRPC non invia
al client. Impostare muteException=false sull'endpoint per ripristinare il comportamento precedente.
Mappare i fallimenti su uno status esplicito in un handler onException in modo che il framework non copi mai il messaggio dell'eccezione
nella descrizione.
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la
vulnerabilità, verificare se sono interessati e confermare che l'aggiornamento la risolva. Il messaggio "internal" è un
segnaposto benigno (db.internal.local, svc_admin) e l'intera dimostrazione viene eseguita in un unico processo. Non utilizzare questo
materiale contro sistemi di cui non si è proprietari o gestori.