
Lauffähiger Proof-of-Concept-Reproduzierer für CVE-2026-79984, einen Path Traversal in Apache Camel camel-mina-sftp, mit Fixtures für einen bösartigen SFTP-Server sowie betroffenen und korrigierten Builds.
Lauffähiger Proof-of-Concept-Reproducer für die Apache-Camel-Schwachstelle, bei der der mina-sftp-Consumer — der von
derselben RemoteFileConsumer-Basisklasse wie die anderen Remote-File-Consumer abgeleitet ist — den absoluten
Remote-Pfad jeder abgefragten Datei durch Verkettung des konfigurierten Verzeichnisses mit dem im
Verzeichnislisting des Servers gemeldeten Namen bildet, ohne lexikalische Normalisierung und ohne Containment-Prüfung.
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 SFTP-Verzeichniseintragsname ist ein roher Protokoll-String, der vom Server geliefert wird, sodass ein kompromittierter, bösartiger oder mandantenfähiger Server einen Namen melden kann, der kein einzelnes Pfadsegment ist.
Dies ist das
mina-sftp-Gegenstück zu CVE-2026-79983 (camel-ftp); beide teilen dieselbe Ursache und denselben Fix.
| Laufzeitumgebung | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina-sftp 4.22.0 (betroffen; behoben in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-mina-sftp 3.39.0 (Camel 4.22.0, betroffen; behobene Kontrolle 3.40.0 / Camel 4.22.1) |
camel-mina-sftpwurde in Camel 4.18.0 eingeführt, daher existiert die Komponente nicht in dem Camel 4.15.0, das vom Camel Quarkus mit der höchsten Versionsnummer mitgeliefert wird; dieser Reproducer verwendet Camel Quarkus 3.39.0 (Camel 4.22.0, betroffen), mit 3.40.0 (Camel 4.22.1) als gepatchte Kontrolle. Beide Module demonstrieren daher sowohl das betroffene als auch das behobene Verhalten.
Die App bettet einen absichtlich bösartigen SFTP-Server (Apache MINA SSHD) ein. Er bedient einen echten temporären Verzeichnis-
baum, schreibt aber in seiner SSH_FXP_READDIR-Antwort den Namen einer Datei im abgefragten Verzeichnis /upload in den
Traversal-String d/../../outside.txt um (über eine getShortName-Überschreibung). Der Name beginnt nicht mit einem Punkt, sodass
Camels Regel für versteckte Dateien ihn nicht erfasst, und /upload + d/../../outside.txt wird zu /outside.txt aufgelöst, eine
Ebene über dem abgefragten Verzeichnis. Ein einfacher mina-sftp-Consumer fragt /upload ab.
normal.txt als auch die ausbrechende /outside.txt ab.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:
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
name=[normal.txt] (inside)
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-mina-sftp (Schema mina-sftp) |
| CWE | CWE-22 (Unzureichende Einschränkung eines Pfadnamens auf ein eingeschränktes Verzeichnis) |
| Schweregrad | HOCH |
| Angriffsvektor | Ein READDIR-Eintragsname (vom Server geliefert), 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 Anmeldeinformationen des Endpunkts |
| Betroffene Versionen | Ab 4.18.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 |
Sicherheitshinweis: https://camel.apache.org/security/CVE-2026-79984.html
GenericFileConsumer.isWithinStartingDirectory (überschrieben von RemoteFileConsumer, von dem der mina-sftp-Consumer abgeleitet ist) komprimiert den aufgelösten Pfad und überprüft an Pfadsegmentgrenzen, dass er innerhalb des abgefragten Verzeichnisses bleibt; ein Eintrag, der außerhalb aufgelöst wird, wird mit einer Warnung übersprungen, während die legitimen Einträge weiterhin verarbeitet werden.
Überprüfen Sie den Hostschlüssel des Servers, beschränken Sie den Consumer mit filter/antInclude/include darauf, nur einsegmentige Namen zu akzeptieren, und vermeiden Sie delete/move/preMove/moveFailed/readLock=rename gegenüber Servern, deren Verzeichnisauflistungen 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-Benutzern zu helfen, die Schwachstelle zu verstehen, zu überprüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Der bösartige Server und das „Geheimnis“ sind inerte lokale Testartefakte. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.