
Reproducer eseguibile per Spring Boot e Quarkus relativo a CVE-2026-85257, che dimostra la divulgazione di informazioni nei SOAP fault di camel-cxf e verifica la correzione muteException.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui, quando una route dietro un consumer SOAP CXF falliva con un'eccezione non dichiarata nel contratto del servizio, l'eccezione veniva descritta al client SOAP nel fault: CXF copia il messaggio nel faultstring SOAP (e può essere configurato per inserire lo stack trace nel dettaglio del fault). Un chiamante esterno in grado di provocare un errore poteva quindi leggere dettagli interni sul deployment — nomi di classi e package, e qualunque informazione trasportata dal messaggio dell'eccezione. I fault dichiarati (annotati con @WebFault) sono un caso diverso: fanno parte del contratto pubblicato rispetto al quale i client sono scritti, quindi vengono comunque riportati per intero.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-cxf-soap 4.22.0 (affetto; corretto in 4.22.1), CXFServlet su Tomcat |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-cxf-soap (Camel 4.15.0, affetto; controllo corretto CQ 3.40.0 / Camel 4.22.1) |
Entrambi i moduli dimostrano il comportamento affetto e quello corretto.
Un consumer SOAP CXF è alla base di una route il cui processor lancia un'IllegalStateException non dichiarata che trasporta dettagli interni simulati (un token marcatore e un finto URL JDBC interno). Il driver agisce come client SOAP: invoca il servizio e legge il SOAP fault restituito.
Exchange processing failed — e non trasporta classe, messaggio o stack trace dell'eccezione della route (la nuova opzione del consumer muteException è impostata per default a true). Un fault dichiarato dal contratto (@WebFault) verrebbe comunque restituito per intero.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: fault leaks internal detail; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85257-cxf-fault-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic fault; >>> 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.15.0): fault leaks internal detail
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: generic fault
| Proprietà | Valore |
|---|---|
| Componente | camel-cxf (CxfConsumer, costruzione del fault SOAP) |
| CWE | CWE-209 (Generazione di messaggi di errore contenenti informazioni sensibili) |
| Gravità | MEDIA |
| Vettore di attacco | Un chiamante SOAP provoca un errore di route non dichiarato e legge il dettaglio dell'eccezione dal fault |
| Impatto | Divulgazione di informazioni: la classe/messaggio dell'eccezione (hostname interni, stringhe di connessione, struttura della route) raggiunge un chiamante SOAP esterno |
| 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-24477 |
| Credito | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85257.html
Il modulo Spring Boot monta il CXFServlet sul Tomcat embedded (un transport CXF Jetty standalone entra in conflitto con la versione di Jetty gestita da Spring Boot), quindi l'endpoint SOAP è servito su
/services/hellosulla porta 8080.
CxfConsumer aggiunge un'opzione consumer muteException (predefinita true).
Per un errore di route non dichiarato ora costruisce il fault a partire da un Exception("Exchange processing failed")
sostitutivo con stack trace vuoto, invece che dall'eccezione della route — così nessun nome di classe, messaggio o stack trace raggiunge il
chiamante. Un'eccezione dichiarata dal contratto (@WebFault) viene rilevata e riportata per intero, poiché sopprimerla
romperebbe il servizio. Impostare muteException=false per ripristinare l'output precedente.
Dichiarare le eccezioni che il servizio è autorizzato a riportare e mappare ogni altro errore su una di esse in un
handler onException, così che nessuna eccezione non dichiarata raggiunga il fault.
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 risolve. Il token marker e l'URL JDBC nella route che genera l'errore sono fixture locali inerti e inventate. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o che non si gestiscono.