
Proof-of-concept eseguibile in Spring Boot che riproduce CVE-2026-85245, una divulgazione di dati cross-exchange in camel-thrift, con confronto tra versione affetta e corretta e note di mitigazione.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui il formato dati Thrift effettuava l'unmarshalling
nell'defaultInstance condiviso del tipo di destinazione anziché in una copia nuova, e restituiva quell'oggetto condiviso
come corpo dell'exchange. Poiché l'istanza è condivisa a livello di processo, lo stato scritto durante l'unmarshalling di un messaggio
rimaneva sull'oggetto ed era visibile a ogni messaggio successivo che utilizzava lo stesso tipo. I campi assenti da un
payload successivo conservavano i valori del messaggio precedente, quindi il contenuto appartenente a un mittente poteva essere letto durante l'elaborazione
del messaggio di un altro mittente, e exchange concorrenti potevano osservare lo stato parzialmente scritto l'uno dell'altro. In un
deployment che serve più di un tenant o utente attraverso la stessa route, ciò costituisce divulgazione dei dati di una parte
a un'altra.
Solo Spring Boot. Non esiste un'estensione
camel-quarkus-thrift, quindi questo reproduttore include un singolo modulo Camel Spring Boot. (Il difetto è nelThriftDataFormatdel componente, che è indipendente dal runtime.)
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0 (affetto; corretto in 4.22.1) |
Una route definisce un ThriftDataFormat (basato sul tipo Thrift generato Work) e lo riutilizza per ogni messaggio,
come fanno normalmente le route. Due tenant inviano un messaggio attraverso di essa:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — il campo opzionale comment trasporta dati
sensibili;Work{num1=3, op=SUBTRACT} — nessun campo comment.La route effettua l'unmarshalling del messaggio del tenant A, poi di quello del tenant B.
comment del tenant A — Thrift assegna solo i
campi presenti nei byte in ingresso, ed entrambi i messaggi sono stati deserializzati nella (e restituiti come) stessa istanza
condivisa, quindi il campo mancante di B manteneva il valore di A. I due corpi sono letteralmente lo stesso oggetto.comment del tenant B è null — ogni exchange riceve la propria copia ripulita.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| Proprietà | Valore |
|---|---|
| Componente | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (Esposizione di un elemento dati alla sessione errata) |
| Gravità | MEDIA |
| Vettore di attacco | Due messaggi dello stesso tipo Thrift attraverso una singola route; un messaggio successivo che omette un campo eredita il valore del precedente |
| Impatto | Divulgazione di dati tra scambi / tra tenant; scambi concorrenti possono osservare lo stato parzialmente scritto l'uno dell'altro |
| 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-24442 |
| Credito | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85245.html
I tipi Thrift generati (Work, Operation) sono i fixture di test pubblici dai test camel-thrift di Apache Camel stesso.
ThriftDataFormat.unmarshal ora deserializza in una copia per-scambio:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — quindi deserializza i byte in instance e
lo restituisce. Ogni scambio ottiene il proprio oggetto ripulito, così nessun campo passa tra i messaggi e nessuno
scambio condivide un corpo.
Copia il corpo deserializzato in una nuova istanza immediatamente dopo l'esecuzione del data format, e non conservare riferimenti all'oggetto restituito.
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 "secret" è una stringa marcatore inerte e inventata. Non utilizzare questo materiale contro sistemi di cui non sei proprietario o che non gestisci.