
Lauffähiger Proof-of-Concept-Reproduzierer für CVE-2026-95628, eine Lücke bei der Validierung absoluter Pfade in Apache Camel camel-docling, mit Spring Boot- und Quarkus-Harnesses und Fix-Verifizierung.
validatePathSafety hat absolute Pfade nicht abgelehnt (unvollständiger Fix von CVE-2026-40047)Lauffähiger Proof-of-Concept-Reproducer für die Apache-Camel-Schwachstelle, bei der die Prüfung des Pfads für benutzerdefinierte Argumente, die der Fix von CVE-2026-40047 eingeführt hatte, nur nach relativer Traversierung suchte. Sie lehnte einen Wert ab, der ../ enthielt, sowie einen Wert, dessen normalisierte Form noch ein ..-Element aufwies – aber sie prüfte nie, ob ein Wert ein absoluter Pfad war, und ein absoluter Pfad ohne Traversierungssegmente enthält weder das eine noch das andere.
| Laufzeitumgebung | Verzeichnis | 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
Auf einem betroffenen Build (identisch auf beiden 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: ...
Die Probes 1 und 2 zeigen, dass der Fix für CVE-2026-40047 seinen Zweck erfüllt. Die Probes 3 und 4 zeigen die Lücke: Das Flag steht auf der Allowlist dieses Fixes (--artifacts-path teilt docling mit, wo es seine Modellartefakte findet), und der Wert gelangt in beiden Argumentformen durch — als separates Listenelement nach dem Flag und angehängt nach einem =. Eine Partei, die die benutzerdefinierten Argumente wählen kann, könnte den docling-Prozess daher auf ein beliebiges Verzeichnis verweisen, auf das der Camel-Prozess zugreifen kann, außerhalb des Arbeitsverzeichnisses, in dem die Prüfung Pfadwerte eigentlich halten sollte — genau das Ergebnis, das der frühere Fix verhindern sollte.
Keine docling-Installation erforderlich. Der Fehler liegt in der Kommandozeile, die Camel erzeugt, daher verweist die Option doclingCommand des Endpoints auf einen aufzeichnenden Stellvertreter für die CLI, der den ihm übergebenen Argumentvektor in eine Datei schreibt. Der echte DoclingProducer, die echte validateCustomArguments() und die echte validatePathSafety() laufen; nur das externe Tool ist ersetzt.
Nur der CLI-Modus, der Standard ist, übergibt benutzerdefinierte Argumente an docling.
CamelDoclingCustomArguments gehört zum Camel-Header-Namespace, den Consumer, die Camels Standard-Header-Filterung anwenden — etwa die JMS- und Kafka-Consumer —, aus eingehenden Nachrichten entfernen. Das Problem wird daher dort erreicht, wo eine Route extern beeinflusste Werte in den Header weiterleitet oder wo ein Consumer eingehende Header ohne diese Filterung abbildet.
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-docling (DoclingProducer.validatePathSafety()) |
| CWE | CWE-22 (Improper Limitation of a Pathname to a Restricted Directory) |
| Schweregrad | Mittel |
| Angriffsvektor | Ein absoluter Pfad als Wert eines pfadähnlichen Flags auf der Allowlist in CamelDoclingCustomArguments |
| Auswirkung | Den docling-Prozess auf ein beliebiges Verzeichnis verweisen, auf das der Camel-Prozess zugreifen kann |
| Betroffene Versionen | Ab 4.15.0 vor 4.18.5, ab 4.19.0 vor 4.22.2 |
| Behobene Versionen | 4.18.5, 4.22.2, 4.23.0 |
| JIRA | CAMEL-24893 |
| Danksagung | Zhixi "Jace" Sun, unabhängiger Sicherheitsforscher |
Advisory: https://camel.apache.org/security/CVE-2026-95628.html
Verwandt: Dies ist ein unvollständiger Fix von CVE-2026-40047, und der Output-Path-Header derselben Komponente ist CVE-2026-95629.
validatePathSafety lehnt nun auch einen pfadähnlichen benutzerdefinierten Argumentwert ab, der ein absoluter Pfad ist, und lässt den Exchange mit einer IllegalArgumentException fehlschlagen, die besagt, dass das Argument kein absoluter Pfad sein darf. Da die Prüfung im gemeinsamen Helper sitzt, der jeden pfadähnlichen Wert validiert, sind beide Argumentformen abgedeckt.
Behoben auf main in apache/camel#26738 (fd3bc8e7), zurückportiert auf camel-4.22.x in #26743 (e9233c37) und auf camel-4.18.x in #26744 (59d30af1).
Setzen Sie camel.version auf 4.22.2 und führen Sie es erneut aus. Verifiziert gegen 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.
Erzeugen Sie CamelDoclingCustomArguments nicht aus Werten, die von außerhalb der Bereitstellung stammen; entfernen Sie diesen
Header aus Nachrichten, die von außen eintreffen, bevor sie einen docling-Endpunkt erreichen; und stellen Sie sicher, dass Consumer,
die eingehende Header abbilden, den Camel-Header-Namespace verwerfen, sodass nur die Route die benutzerdefinierten Argumente wählt.
Dieses Repository wird zu Bildungs- und Verteidigungszwecken veröffentlicht: um Apache Camel-Nutzern zu helfen, die Schwachstelle zu verstehen, zu prüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.