
Riproduzione CVE: cve-2026-34486-tomcat_encrypt_bypass_reproduction
| Campo | Valore |
|---|
| CVE | CVE-2026-34486 |
| CVSS | 7.5 HIGH |
| Tipo | Mancata cifratura di dati sensibili |
| Componente | Apache Tomcat Cluster EncryptInterceptor |
| Pubblicazione | 2026 |
CVE-2026-34486 è una regressione introdotta dalla correzione incompleta di CVE-2026-29146. Nella replica del cluster di Apache Tomcat, l'EncryptInterceptor è responsabile della cifratura e dell'autenticazione dei messaggi del cluster. Un refactoring nella correzione di CVE-2026-29146 ha involontariamente spostato la chiamata super.messageReceived(msg) fuori dal blocco try-catch che gestisce gli errori di decifratura. Di conseguenza, quando la decifratura di un messaggio fallisce (cioè, viene ricevuto in chiaro ma l'interceptor si aspetta dati cifrati), il messaggio non cifrato grezzo viene comunque passato lungo la catena di handler invece di essere scartato.
Il metodo EncryptInterceptor.messageReceived() viene invocato quando arriva un messaggio del cluster. Il flusso previsto è:
super.messageReceived(msg) per inoltrare il messaggio decifratoNelle versioni vulnerabili, la logica di decifratura/convalida rimane racchiusa in un try-catch, ma la catena di chiamate è stata ristrutturata in modo che super.messageReceived(msg) venga eseguito fuori dal blocco try-catch che protegge la decifratura. La variabile msg viene dichiarata prima del try-catch e assegnata al suo interno. Quando la decifratura lancia un'eccezione, msg mantiene il suo valore iniziale (non cifrato/grezzo), e il blocco catch registra solo l'errore — non esce anticipatamente. L'esecuzione prosegue fino a super.messageReceived(msg) con i dati grezzi non elaborati.
Ciò significa che un attaccante in grado di raggiungere la porta del cluster Tomcat può iniettare messaggi arbitrari non cifrati che l'interceptor accetterà ed elaborerà.
public void messageReceived(Message msg) {
// msg arrives raw
try {
// decrypt and populate msg fields
decrypt(msg);
} catch (Exception e) {
log.error("Decryption failed", e);
// BUG: no return statement here
}
// msg is still the original unencrypted object when catch is hit
super.messageReceived(msg); // outside try-catch → passes raw data
}
La correzione deve garantire che:
super.messageReceived(msg) venga chiamato solo all'interno del blocco try dopo una decifratura riuscita, oppure| Prodotto | Versioni |
|---|---|
| Apache Tomcat 11 | 11.0.20 |
| Apache Tomcat 10 | 10.1.53 |
| Apache Tomcat 9 | 9.0.116 |
EncryptInterceptor<Receiver>)EncryptInterceptor configurato in server.xml.Lo script exploit.py in questa directory dimostra il bypass. Costruisce un messaggio minimale del cluster Tomcat (basato sul formato di serializzazione ClusterMessage) e lo invia direttamente alla porta del receiver senza alcuna cifratura. Un interceptor vulnerabile accetterà e inoltrerà il messaggio nonostante la mancata cifratura.
Aggiornare a una versione corretta di Apache Tomcat:
| Prodotto | Versione corretta |
|---|---|
| Apache Tomcat 11 | 11.0.21+ |
| Apache Tomcat 10 | 10.1.54+ |
| Apache Tomcat 9 | 9.0.117+ |
Se non è possibile aggiornare immediatamente, limitare l'accesso di rete alla porta del cluster Tomcat solo agli host fidati (ad esempio tramite regole firewall o associando il receiver a un'interfaccia di loopback o privata).