
Reproduttore Spring Boot eseguibile per CVE-2026-85246, che dimostra la divulgazione delle eccezioni del consumer camel-mina tramite socket e verifica la correzione muteException.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui il consumer Mina scriveva
exchange.getException() direttamente sul socket verso il peer remoto quando l'elaborazione di un exchange falliva.
Attraverso un codec textline il peer riceve il nome della classe e il messaggio dell'eccezione; attraverso il codec object riceve
l'eccezione serializzata, catena delle cause inclusa. Un peer remoto in grado di provocare un errore poteva leggere dettagli interni
sul deployment — nomi di classi e package, e qualunque cosa trasportino un messaggio o una causa annidata, che in
pratica include percorsi, nomi host e dettagli di connessione. Il consumer non aveva alcuna opzione per sopprimere questo comportamento, a differenza dei
consumer della famiglia HTTP allineati da CAMEL-23651.
Solo Spring Boot. Non esiste un'estensione
camel-quarkus-mina, quindi questo reproducer include un unico modulo Camel Spring Boot. (Il difetto è nelMinaConsumerdel componente, che è indipendente dal runtime.)
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina 4.22.0 (affetto; corretto in 4.22.1) |
Un consumer TCP Mina (sync=true, textline=true) elabora ogni riga in ingresso e fallisce — rappresentando qualsiasi route
che incontra un errore interno. La route lancia un'IllegalStateException il cui messaggio trasporta dettagli interni simulati
(un finto percorso di configurazione /etc/camel/secret.properties, un finto host e un token marcatore). Il driver di exploit è un
semplice peer TCP remoto: apre un socket, invia una riga e legge la risposta che il consumer scrive in risposta.
java.lang.IllegalStateException: INTERNAL-DETAIL-MARKER-7F3A2B config=/etc/camel/secret.properties db=internal-db.prod.svc.java.lang.Exception: Exchange processing failed — nessuna classe, messaggio o stack
trace dell'eccezione della route — pur rispondendo comunque, così che un peer sincrono non resti in attesa fino al timeout.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: exception leaks over the socket; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85246-mina-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic reply; >>> Not exploited
| Proprietà | Valore |
|---|---|
| Componente | camel-mina (MinaConsumer.messageReceived) |
| CWE | CWE-209 (Generazione di messaggi di errore contenenti informazioni sensibili) |
| Gravità | MEDIA |
| Vettore di attacco | Un peer TCP/UDP remoto provoca un errore di instradamento e legge l'eccezione dalla risposta riscritta sul socket |
| Impatto | Divulgazione di informazioni: classe/messaggio dell'eccezione tramite il codec textline, oppure l'eccezione serializzata + catena delle cause tramite il codec object (nomi host interni, percorsi, dettagli di connessione) |
| 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-24476 |
| Riconoscimento | Claude Security Scan Tool |
Avviso: https://camel.apache.org/security/CVE-2026-85246.html
MinaConsumer aggiunge un'opzione consumer muteException (predefinita true).
Quando è abilitata, un exchange fallito non riscrive più exchange.getException(); al suo posto scrive un
Exception("Exchange processing failed") sostitutivo con uno stack trace vuoto — sempre un'Exception (così un peer
con codec object ne riceve comunque una) ma priva di classe, messaggio o frame dell'eccezione della route. Viene comunque scritta una risposta, così un
peer sincrono non resta in attesa fino al timeout. Impostare muteException=false per ripristinare il comportamento precedente.
Aggiungere un handler onException che imposta esplicitamente il corpo della risposta, così il framework non riscrive mai l'eccezione
al peer.
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 percorso di configurazione, l'host e il token marcatore nella route che fallisce sono fixture locali inerti e inventate. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.