Unsachgemäße Beschränkung eines Pfadnamens auf ein eingeschränktes Verzeichnis ('Path Traversal')
Beschreibung
Path Traversal (auch bekannt als Directory Traversal) ist eine Schwachstelle, die auftritt, wenn Software externe Eingaben verwendet, um einen Pfadnamen zu konstruieren, der eine Datei oder ein Verzeichnis innerhalb eines eingeschränkten übergeordneten Verzeichnisses identifizieren soll, aber spezielle Elemente wie ".." und "/" nicht ordnungsgemäß neutralisiert, die dazu führen können, dass der Pfadname zu einem Speicherort außerhalb des eingeschränkten Verzeichnisses aufgelöst wird. Angreifer nutzen diese Schwachstelle aus, indem sie Dateipfadreferenzen mit Sequenzen wie "../" manipulieren, um das beabsichtigte Verzeichnis zu verlassen und auf beliebige Dateien im System zuzugreifen. Dies kann zu unbefugtem Lesen sensibler Konfigurationsdateien, Quellcode, Anmeldedaten oder sogar zum Schreiben bösartiger Dateien auf den Server führen.
Risiko
Path-Traversal-Schwachstellen stellen schwerwiegende Risiken für die Anwendungssicherheit dar, da sie Angreifern ermöglichen, aus der beabsichtigten Verzeichnisstruktur auszubrechen und auf Dateien überall im für die Anwendung zugänglichen Dateisystem zuzugreifen. Eine erfolgreiche Ausnutzung kann zur Offenlegung sensibler Systemdateien wie /etc/passwd, Anwendungskonfigurationen mit Datenbankanmeldedaten, Session-Tokens, API-Schlüsseln und proprietärem Quellcode führen. In Fällen, in denen die Schwachstelle das Schreiben von Dateien ermöglicht, können Angreifer Webshells hochladen oder kritische Konfigurationsdateien überschreiben, was potenziell zu einer vollständigen Systemkompromittierung führt. Diese Schwachstellen sind besonders gefährlich bei VPN-Appliances und Netzwerksicherheitsgeräten, wo sie Anmeldedaten für ganze Unternehmensnetzwerke offenlegen können.
Lösung
Implementieren Sie eine strikte Eingabevalidierung mit einem Allowlist-Ansatz für erlaubte Dateinamen oder Pfadkomponenten, anstatt zu versuchen, bösartige Sequenzen zu blockieren. Verwenden Sie kanonische Pfadfunktionen, um Pfade aufzulösen, und überprüfen Sie, ob der resultierende absolute Pfad innerhalb des beabsichtigten Verzeichnisses liegt, bevor Sie Dateioperationen durchführen. Vermeiden Sie es, vom Benutzer bereitgestellte Eingaben direkt an Dateisystem-APIs zu übergeben; verwenden Sie stattdessen indirekte Referenzen wie Datenbank-IDs, die serverseitig auf Dateispeicherorte abgebildet werden. Konfigurieren Sie die Anwendung so, dass sie mit minimalen Dateisystemberechtigungen läuft, und verwenden Sie Chroot-Jails oder Containerisierung, um den zugänglichen Dateisystembereich als Defense-in-Depth zu begrenzen. Implementieren Sie ordnungsgemäße Zugriffskontrollen auf Dateisystemebene als zusätzliche Verteidigungsschicht.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Vertraulichkeit | Bereich: Vertraulichkeit Angreifer können beliebige Dateien vom Server lesen, einschließlich Konfigurationsdateien, Quellcode, Anmeldedaten, Verschlüsselungsschlüssel und sensible Benutzerdaten, was zur Informationsoffenlegung führt. |
| Integrität | Bereich: Integrität Wenn die Schwachstelle das Schreiben von Dateien ermöglicht, können Angreifer Anwendungsdateien modifizieren, bösartigen Code einschleusen, Konfigurationseinstellungen ändern oder Hintertüren auf dem System platzieren. |
| Verfügbarkeit | Bereich: Verfügbarkeit Angreifer könnten kritische Dateien löschen oder Konfigurationsdateien überschreiben, was zu Anwendungsabstürzen oder Denial-of-Service-Zuständen führt. |
| Zugriffskontrolle | Bereich: Zugriffskontrolle Durch den Zugriff auf Anmeldedatendateien oder Sitzungsdaten können Angreifer Privilegien eskalieren, Benutzer imitieren oder administrativen Zugriff auf Systeme und Netzwerke erlangen. |
Beispielcode + Lösungscode
Das folgende Beispiel zeigt eine anfällige PHP-Anwendung, die Dateien basierend auf Benutzereingaben ohne ordnungsgemäße Pfadvalidierung bereitstellt:
Anfälliger Code
<?php
// ANFÄLLIG: Benutzereingabe wird direkt im Dateipfad verwendet
$filename = $_GET['file'];
$basePath = '/var/www/uploads/';
// Angreifer kann verwenden: ?file=../../../etc/passwd
$filepath = $basePath . $filename;
if (file_exists($filepath)) {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
readfile($filepath);
} else {
echo "Datei nicht gefunden.";
}
?>
Dieser Code ist anfällig, weil er Benutzereingaben direkt mit dem Basispfad verkettet. Ein Angreifer kann ../../../etc/passwd angeben, um den Verzeichnisbaum nach oben zu traversieren und auf Systemdateien außerhalb des beabsichtigten Upload-Verzeichnisses zuzugreifen.
Korrigierter Code
<?php
$userInput = $_GET['file'] ?? '';
$basePath = '/var/www/uploads/';
// Null-Bytes entfernen (Schutz vor Poison-Null-Byte-Angriffen)
$userInput = str_replace("\0", '', $userInput);
// Den kanonischen absoluten Pfad ermitteln
$realBase = realpath($basePath);
$requestedPath = realpath($basePath . $userInput);
// Validieren, dass der aufgelöste Pfad innerhalb des erlaubten Verzeichnisses liegt
if ($requestedPath === false) {
http_response_code(404);
die("Datei nicht gefunden.");
}
if (strpos($requestedPath, $realBase) !== 0) {
// Pfad verlässt das Basisverzeichnis - Anfrage ablehnen
http_response_code(403);
error_log("Path-Traversal-Versuch erkannt: " . $userInput);
die("Zugriff verweigert.");
}
// Zusätzliche Validierung: nur bestimmte Dateierweiterungen zulassen
$allowedExtensions = ['pdf', 'jpg', 'png', 'txt'];
$extension = strtolower(pathinfo($requestedPath, PATHINFO_EXTENSION));
if (!in_array($extension, $allowedExtensions)) {
http_response_code(403);
die("Dateityp nicht erlaubt.");
}
// Datei kann sicher ausgeliefert werden
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($requestedPath) . '"');
header('X-Content-Type-Options: nosniff');
readfile($requestedPath);
?>
Der korrigierte Code verwendet realpath(), um den kanonischen absoluten Pfad sowohl des Basisverzeichnisses als auch der angeforderten Datei aufzulösen. Er überprüft dann, ob der aufgelöste Pfad mit dem Basispfad beginnt, um sicherzustellen, dass keine Traversierung über das erlaubte Verzeichnis hinaus erfolgt ist. Zusätzliche Schutzmaßnahmen umfassen das Entfernen von Null-Bytes, Erweiterungs-Whitelisting und Sicherheits-Header.
Ausgenutzt in der Praxis
Fortinet FortiOS SSL VPN-Angriff (Mehrere Organisationen, 2019-2021)
CVE-2018-13379, eine kritische Path-Traversal-Schwachstelle im Fortinet FortiOS SSL VPN-Webportal, wurde ab 2019 massiv ausgenutzt. Die Schwachstelle ermöglichte es nicht authentifizierten Angreifern, die Datei sslvpn_websessions herunterzuladen, die Benutzernamen und Klartext-Passwörter enthielt. Im November 2020 wurden Anmeldedaten für etwa 50.000 anfällige Fortinet VPN-Geräte online veröffentlicht. CISA und FBI gaben im April 2021 eine gemeinsame Warnung heraus, in der sie vor der anhaltenden APT-Ausnutzung gegen Regierungsbehörden und kritische Infrastrukturen warnten.
Pulse Secure VPN Massenausnutzung (Regierung & Unternehmen, 2019-2021)
CVE-2019-11510, eine Pre-Authentication-Path-Traversal-Schwachstelle in Pulse Secure VPN-Appliances, wurde umfangreich gegen US-Regierungsbehörden, kritische Infrastrukturen und Organisationen des privaten Sektors ausgenutzt. Die Schwachstelle ermöglichte Angreifern das Lesen beliebiger Dateien, einschließlich Authentifizierungsanmeldedaten. Travelex, das Devisenunternehmen, erlitt einen verheerenden Ransomware-Angriff, nachdem Kriminelle diese Schwachstelle ausgenutzt hatten, um REvil-Ransomware einzusetzen. Auch iranische staatlich gesponserte Hacker wurden beobachtet, wie sie diese Schwachstelle nutzten, um in IT- und Telekommunikationsunternehmen weltweit einzudringen.
Atlassian Jira Service Desk Datenexposition (Atlassian-Kunden, 2019)
Im September 2019 entdeckten Forscher eine kritische Path-Traversal-Schwachstelle in Atlassians Jira Service Desk Server- und Data Center-Produkten. Die Schwachstelle ermöglichte Angreifern den Zugriff auf sensible Kundeninformationen, die in Jira-Installationen gespeichert waren, indem sie Verzeichnisse traversierten, um geschützte Dateien zu erreichen. Angesichts der weit verbreiteten Nutzung von Jira in Unternehmensumgebungen für Projektmanagement und Issue-Tracking hat diese Schwachstelle potenziell vertrauliche Geschäftsdaten in zahlreichen Organisationen offengelegt.
Tools zum Testen/Ausnutzen
-
Burp Suite — professionelle Plattform für Web-Sicherheitstests mit integrierten Path-Traversal-Payload-Listen in Burp Intruder zum Fuzzing von Dateiparametern mit verschiedenen Codierungstechniken.
-
dotdotpwn — der Directory-Traversal-Fuzzer, der das Testen von Path-Traversal-Schwachstellen über HTTP, FTP, TFTP und andere Protokolle mit mehreren Codierungsschemata automatisiert.
-
OWASP ZAP — Open-Source-Sicherheitsscanner mit aktiven Scan-Regeln zur Erkennung von Path-Traversal-Schwachstellen und automatisierten Fuzzing-Funktionen.
CVE-Beispiele
-
CVE-2019-11510 — Pulse Secure VPN beliebiges Lesen von Dateien über Path Traversal ermöglicht nicht authentifizierten Zugriff auf sensible Dateien einschließlich zwischengespeicherter Anmeldedaten.
-
CVE-2018-13379 — Fortinet FortiOS SSL VPN Path Traversal ermöglicht nicht authentifizierten Download von Systemdateien mit VPN-Sitzungsanmeldedaten.
-
CVE-2024-23334 — aiohttp Python-Bibliothek Directory-Traversal-Schwachstelle, die aktiv von Ransomware-Akteuren ausgenutzt wird.
-
CVE-2023-32315 — Openfire XMPP-Server Path Traversal ermöglicht nicht authentifizierte Admin-Kontoerstellung.
Referenzen
-
MITRE. "CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')." Common Weakness Enumeration. https://cwe.mitre.org/data/definitions/22.html
-
OWASP. "Path Traversal." OWASP Foundation. https://owasp.org/www-community/attacks/Path_Traversal
-
PortSwigger. "What is path traversal, and how to prevent it?" Web Security Academy. https://portswigger.net/web-security/file-path-traversal
-
CISA. "Exploitation of Pulse Connect Secure Vulnerabilities." Cybersecurity Advisory. https://www.cisa.gov/news-events/cybersecurity-advisories/aa21-110a