
Proof-of-concept eseguibile in Spring Boot che riproduce CVE-2026-88901, una vulnerabilità XXE (CWE-611) in Apache Camel camel-smooks, con esecuzioni di controllo vulnerabili e corrette.
PoC riproducibile ed eseguibile per la vulnerabilità di Apache Camel in cui il formato dati Smooks
(.unmarshal().smooks(...)) e il componente Smooks (smooks:) analizzavano il corpo XML in ingresso con il reader
che Smooks risolve per impostazione predefinita (il parser SAX Woodstox), che risolve entità esterne generali e di parametro e
carica DTD esterni — e camel-smooks non applicava nessuno dei rafforzamenti del parser applicati dagli altri componenti XML di Camel.
Un DOCTYPE con un sottoinsieme esterno, o un'entità generale esterna, dichiarato nel documento XML viene quindi risolto
ed espanso durante l'unmarshal del corpo, e il contenuto risolto viene associato al risultato. Un mittente esterno
il cui XML raggiunge un formato dati o un endpoint camel-smooks potrebbe leggere file leggibili dal processo Camel, o far sì che il
processo effettui richieste verso host interni (CWE-611). Non è richiesta alcuna opzione non predefinita — la risoluzione delle entità esterne era
il comportamento predefinito.
Solo Spring Boot. Questo reproducer include un singolo modulo Camel Spring Boot.
camel-smooksnon ha un'estensionecamel-quarkus-smooks, quindi non esiste una controparte Quarkus da riprodurre. Il modulo Spring Boot dimostra il comportamento affetto e quello corretto.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smooks 4.22.0 (affetto; corretto in 4.22.1) |
Il driver rispecchia il test di regressione della correzione stessa (SmooksDataFormatXmlSecurityTest). Un file marcatore benigno viene
scritto in una directory temporanea, e un documento XML <customer> viene sottoposto a unmarshal tramite il vero SmooksDataFormat con
lo smooks-config.xml standard (che associa il documento a un bean Customer). Il firstName del documento è un'entità esterna
che punta al file marcatore:
<!DOCTYPE customer [<!ENTITY xxe SYSTEM "file:///…/secret.txt">]>
<customer><firstName>&xxe;</firstName>…</customer>
Customer.firstName — il file
è trapelato nel bean deserializzato.DocumentBuilder rafforzato (entità esterne e caricamento DTD esterno
disabilitati), quindi l'entità non viene risolta e il marcatore non appare mai.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: firstName = the marker file content; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-88901-smooks-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: firstName null, marker not leaked; >>> Not exploited
| Proprietà | Valore |
|---|---|
| Componente | camel-smooks (formato dati e componente Smooks) |
| CWE | CWE-611 (Restrizione impropria del riferimento a entità esterne XML) |
| Gravità | ALTA |
| Vettore di attacco | Un mittente esterno fornisce il corpo del messaggio XML deserializzato da un formato dati o endpoint camel-smooks che utilizza il lettore XML predefinito |
| Impatto | Lettura di file locali leggibili dal processo Camel; SSRF verso host interni indicati nel documento |
| Versioni interessate | Dalla 4.7.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-24677 |
| Segnalato da | h1ei1 |
Avviso: https://camel.apache.org/security/CVE-2026-88901.html
camel-smooks ora pre-analizza l'XML non attendibile con un
javax.xml.parsers.DocumentBuilder configurato con FEATURE_SECURE_PROCESSING e con le entità generali esterne,
le entità parametro esterne e il caricamento di DTD esterni disabilitati, e consegna a Smooks il DOM risultante —
in linea con la configurazione sicura utilizzata da XmlConverter e dagli altri componenti XML di Camel. Il
rafforzamento si applica solo quando la configurazione di Smooks analizza l'XML con il lettore predefinito (quindi le
configurazioni EDI, CSV, JSON e con lettore personalizzato, e la direzione di marshalling, restano invariate). Una nuova
opzione allowExternalEntities, disabilitata per impostazione predefinita, ripristina il comportamento precedente
per configurazioni legacy attendibili.
Non applicare camel-smooks a XML ricevuto da mittenti non attendibili.
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 file "secret" viene creato dal riproduttore stesso in una directory temporanea e contiene solo una stringa marcatore benigna; viene eliminato dopo il controllo. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.