
Lauffähiger Proof-of-Concept-Reproduzierer für CVE-2026-79983, einen Path Traversal in Apache Camel camel-ftp-Consumern, mit Fixtures für einen bösartigen FTP-Server sowie betroffenen und behobenen Builds.
Lauffähiger Proof-of-Concept-Reproduzierer für die Apache-Camel-Schwachstelle, bei der die Remote-File-Consumer ein
Verzeichnis auf einem Remote-Server abfragen und den absoluten Remote-Pfad jeder Datei bilden, indem sie das konfigurierte
Verzeichnis mit dem im Verzeichnislisting des Servers gemeldeten Dateinamen verketten, ohne lexikalische Normalisierung und ohne
Prüfung, ob das Ergebnis innerhalb des abgefragten Verzeichnisses bleibt. Dieser Pfad wird dann zum Operanden für den Abruf (immer)
sowie für Löschen oder Umbenennen, wenn delete=true, move, preMove, moveFailed oder readLock=rename konfiguriert ist.
Ein Listing-Name ist kein durch die Route kontrolliertes Datum — er wird vom Remote-Server geliefert, und der FTP-Kontrollkanal
besitzt keinen Integritätsschutz, sodass ein On-Path-Angreifer eine LIST-Antwort umschreiben kann und ein kompromittierter oder
Multi-Tenant-Server einen solchen Namen direkt ausgeben kann. Die dokumentierte, standardmäßig aktive Option jailStartingDirectory
hat diesen Remote-Operanden nicht eingeschränkt.
| Laufzeitumgebung | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-ftp 4.22.0 (betroffen; behoben in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-ftp 3.29.0 (Camel 4.15.0, betroffen) |
Der Fix wird in Camel 4.18.5 / 4.22.1 / 4.23.0 ausgeliefert; das Spring-Boot-Modul führt sowohl den betroffenen Build (4.22.0) als auch den behobenen Build (4.22.1) aus. Kein veröffentlichtes Camel Quarkus bündelt bisher ein behobenes Camel.
Die App bettet einen absichtlich bösartigen FTP-Server ein (Apache MINA FtpServer mit einem In-Memory-VFS), der im
abgefragten Verzeichnis /upload Folgendes listet:
normal.txt — eine legitime Datei innerhalb des Verzeichnisses, undd/../../outside.txt — einen manipulierten Eintrag, dessen Name kein einzelnes Pfadsegment ist. Er beginnt nicht mit einem Punkt
(sodass die Regel für versteckte Dateien von Camel ihn nicht erfasst), und /upload + d/../../outside.txt wird zu /outside.txt,
eine Ebene oberhalb des abgefragten Verzeichnisses aufgelöst.Ein einfacher Camel-FTP-Consumer fragt /upload ab. Beim betroffenen Build ruft er beide Einträge ab — einschließlich
/outside.txt, einer Datei, die er niemals erreichen sollte. Beim behobenen Build behält er normal.txt und überspringt den ausbrechenden
Eintrag, wobei er Skipping file as it resolves outside the starting directory: upload/d/../../outside.txt protokolliert.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Erwartete Ausgabe beim betroffenen Build:
What the Camel consumer retrieved:
name=[normal.txt] (inside)
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
Paths the server was asked to read:
upload/normal.txt -> /upload/normal.txt
upload/d/../../outside.txt -> /outside.txt
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-ftp (Schemata ftp, ftps, sftp) |
| CWE | CWE-22 (Improper Limitation of a Pathname to a Restricted Directory) |
| Schweregrad | HOCH |
| Angriffsvektor | Ein LIST-Eintrag (vom Server geliefert, auf einem nicht authentifizierten FTP-Kontrollkanal umschreibbar), der kein einzelnes Pfadsegment ist |
| Auswirkung | Lesen – und, mit delete/move/readLock=rename, Löschen oder Umbenennen – von Dateien außerhalb des abgefragten Verzeichnisses unter Verwendung der Anmeldedaten des Endpunkts |
| Betroffene Versionen | Ab 4.0.0 vor 4.18.5, ab 4.19.0 vor 4.22.1 |
| Behobene Versionen | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24487 |
| Danksagung | Dilrevx von NSSL, SJTU |
Advisory: https://camel.apache.org/security/CVE-2026-79983.html
Eine separatorbewusste Überladung von GenericFileHelper.isWithinDirectory und eine Strategie
GenericFileConsumer.isWithinStartingDirectory (konsultiert aus isValidFile, wenn jailStartingDirectory aktiviert ist)
komprimieren den aufgelösten Pfad und prüfen an Pfadsegmentgrenzen, dass er weiterhin innerhalb des abgefragten
Verzeichnisses aufgelöst wird. Eine Datei, die sich außerhalb auflöst, wird mit einer Warnung übersprungen
(so dass andere legitime Einträge in derselben Auflistung weiterhin verarbeitet werden). RemoteFileConsumer und
SmbConsumer überschreiben die Prüfung; die lokale Basisimplementierung ist ein No-op, da lokale Auflistungsnamen stets
einzelne Segmente sind.
Bevorzugen Sie sftp/ftps gegenüber ftp, damit die Auflistung nicht während der Übertragung umgeschrieben werden kann, und verifizieren Sie den Hostschlüssel bzw. das Zertifikat.
Beschränken Sie den Consumer mit filter, antInclude oder include darauf, nur einsegmentige Namen zu akzeptieren, und vermeiden Sie
delete=true/move/preMove/moveFailed/readLock=rename gegenüber Servern, deren Auflistungen nicht vollständig vertrauenswürdig sind.
Beschränken Sie das Serverkonto nach Möglichkeit auf das abgefragte Verzeichnis.
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. Der bösartige Server und das „Geheimnis“ sind inerte lokale Fixtures. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.