
Reproducer eseguibile per Spring Boot e Quarkus relativo a CVE-2026-85249, che dimostra l'iniezione dell'header dei metadati di camel-tika in CamelFileName con controlli vulnerabili e corretti.
CamelFileName)Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui il producer Tika mappava ogni
chiave di metadati estratta dal documento inviato sull'Exchange come header, senza applicare alcun filtro. I metadati
di un documento sono contenuto controllato dall'attaccante: chi fornisce il file sceglie le chiavi di metadati che esso
trasporta. Un documento appositamente costruito poteva quindi impostare header dell'Exchange da cui dipende il resto
della route, inclusi header del namespace Camel come CamelFileName, che i componenti a valle usano per decidere
dove viene scritto il contenuto. È la stessa classe di iniezione di header degli advisory sui consumer, raggiunta qui
attraverso il contenuto del file analizzato anziché tramite un header di protocollo.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-tika 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-tika (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.
L'attaccante invia un documento HTML — un attributo HTML <meta name="..."> raggiunge i metadati di Tika in modo
verbatim, quindi è il documento a scegliere i nomi degli header:
<meta name="CamelFileName" content="ATTACKER-SET-../../pwned.txt"/>
<meta name="author" content="legitimate-metadata"/>
La route è semplicemente from(...).to("tika:parse"). Dopo l'analisi, vengono ispezionati gli header dell'Exchange.
CamelFileName (Exchange.FILE_NAME) viene impostato al valore dell'attaccante proveniente dal documento. Un producer di file a valle utilizzerebbe quel valore scelto dall'attaccante per decidere dove viene scritto il contenuto.CamelFileName viene filtrato (non impostato dal documento), mentre i metadati ordinari come author vengono comunque mappati — il filtro blocca solo il namespace interno di Camel.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: document sets CamelFileName; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85249-tika-header-injection-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelFileName filtered; >>> 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): document sets CamelFileName
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: CamelFileName filtered
| Proprietà | Valore |
|---|---|
| Componente | camel-tika (TikaProducer.convertMetadataToHeaders) |
| CWE | CWE-20 (Validazione dell'input non corretta) |
| Gravità | MEDIA |
| Vettore di attacco | Un documento inviato i cui metadati analizzati dichiarano nomi di header interni a Camel (ad es. tramite HTML <meta name="CamelFileName">) |
| Impatto | Iniezione di header: un documento imposta header dell'Exchange su cui la route fa affidamento, come CamelFileName, che determina dove i componenti a valle scrivono il contenuto |
| 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-24423 |
| Riconoscimento | Claude Security Scan Tool |
Avviso: https://camel.apache.org/security/CVE-2026-85249.html
TikaProducer.convertMetadataToHeaders ora filtra ogni nome di metadato
analizzato tramite un HeaderFilterStrategy (configurato con inFilterStartsWith("Camel", "camel", "org.apache.camel."),
senza distinzione tra maiuscole e minuscole) prima di mapparlo sull'Exchange — allo stesso modo in cui un consumer filtra i
nomi forniti da un mittente esterno — così un documento non può dichiarare un nome di metadato che finisca nel namespace
interno di Camel. I metadati al di fuori di tale namespace vengono comunque mappati.
Rimuovere il namespace Camel dopo il producer Tika con removeHeaders("Camel*") prima di qualsiasi componente che agisca
su tali header.
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 documento creato ad hoc e il nome file iniettato sono fixture locali inerti. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.