Relative Path Traversal
Beschreibung
Relative Path 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 Sequenzen wie ".." nicht ordnungsgemäß neutralisiert, die zu einem Speicherort außerhalb des eingeschränkten Verzeichnisses aufgelöst werden können. Anders als bei Absolute Path Traversal, das vollständige Dateisystempfade verwendet, nutzt Relative Path Traversal die Möglichkeit aus, mit relativen Referenzen durch die Verzeichnishierarchie zu navigieren. Angreifer manipulieren vom Benutzer bereitgestellte Eingaben, indem sie "../" (Punkt-Punkt-Schrägstrich)-Sequenzen einfügen, um in der Verzeichnisstruktur nach oben zu traversieren, die beabsichtigte Verzeichnisgrenze zu verlassen und auf sensible Dateien an anderer Stelle im System zuzugreifen.
Risiko
Relative-Path-Traversal-Schwachstellen ermöglichen es Angreifern, aus dem beabsichtigten Verzeichnisbereich einer Anwendung auszubrechen, indem sie die übergeordnete Verzeichnisreferenz ".." in Dateipfaden ausnutzen. Dies kann zu unbefugtem Lesen von Konfigurationsdateien führen, die Anmeldedaten, Datenbankverbindungszeichenfolgen, Verschlüsselungsschlüssel und andere sensible Daten enthalten. Systemdateien wie /etc/passwd unter Unix oder boot.ini unter Windows werden zugänglich und offenbaren potenziell Benutzerkonten und Systeminformationen. In schweren Fällen, in denen Schreiboperationen möglich sind, können Angreifer Webshells hochladen, Konfigurationsdateien modifizieren oder kritische Systemkomponenten überschreiben. Die weit verbreitete Natur von Dateioperationen in Webanwendungen macht diese Schwachstellenklasse extrem häufig und gefährlich.
Lösung
Implementieren Sie serverseitige Pfadvalidierung, die alle relativen Referenzen auflöst, bevor geprüft wird, ob der resultierende Pfad innerhalb der erlaubten Grenzen bleibt. Verwenden Sie kanonische Pfadfunktionen wie realpath() in PHP, os.path.realpath() in Python oder Path.GetFullPath() in C#, um relative Pfade in absolute Pfade umzuwandeln, und überprüfen Sie dann, ob der aufgelöste Pfad mit dem erwarteten Basisverzeichnis beginnt. Verwenden Sie einen Allowlist-Ansatz, der zugängliche Dateien auf bestimmte Namen oder Muster beschränkt, anstatt zu versuchen, bösartige Sequenzen zu blockieren. Entfernen oder codieren Sie gefährliche Zeichen und Sequenzen aus Benutzereingaben, einschließlich "../", "..\", und URL-codierter Varianten. Erwägen Sie die Verwendung indirekter Dateireferenzen, bei denen Benutzer einen Identifikator angeben, der serverseitig auf tatsächliche Dateipfade abgebildet wird.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Vertraulichkeit | Bereich: Vertraulichkeit Angreifer können Verzeichnisse traversieren, um sensible Dateien zu lesen, einschließlich Konfigurationsdateien, Quellcode, Anmeldedaten und privater Daten, die außerhalb des beabsichtigten Verzeichnisses gespeichert sind. |
| Integrität | Bereich: Integrität Wenn die Schwachstelle das Schreiben von Dateien mit relativen Pfaden ermöglicht, können Angreifer Konfigurationsdateien überschreiben, bösartigen Code einschleusen oder kritische Anwendungsdaten modifizieren. |
| Verfügbarkeit | Bereich: Verfügbarkeit Angreifer könnten kritische Dateien potenziell löschen oder beschädigen, indem sie zu Systemverzeichnissen traversieren, was zu Anwendungsausfällen oder Systeminstabilität führt. |
| Zugriffskontrolle | Bereich: Zugriffskontrolle Der Zugriff auf Authentifizierungsdateien oder Sitzungsdaten durch Path Traversal kann Privilegieneskalation und unbefugten Zugriff auf geschützte Funktionalität ermöglichen. |
Beispielcode + Lösungscode
Das folgende Beispiel zeigt eine anfällige Node.js-Anwendung, die statische Dateien mit relativen Pfadeingaben bereitstellt:
Anfälliger Code
const express = require('express');
const path = require('path');
const fs = require('fs');
const app = express();
const UPLOADS_DIR = './uploads';
app.get('/download', (req, res) => {
// ANFÄLLIG: Benutzereingabe wird direkt im Dateipfad verwendet
const filename = req.query.file;
const filepath = path.join(UPLOADS_DIR, filename);
// Angreifer kann verwenden: ?file=../../../etc/passwd
if (fs.existsSync(filepath)) {
res.download(filepath);
} else {
res.status(404).send('Datei nicht gefunden');
}
});
app.listen(3000);
Die Schwachstelle existiert, weil path.join() Directory Traversal nicht verhindert - es verkettet einfach Pfade. Ein Angreifer kann ../../../etc/passwd angeben, um das Upload-Verzeichnis zu verlassen und auf beliebige Dateien zuzugreifen.
Korrigierter Code
const express = require('express');
const path = require('path');
const fs = require('fs');
const app = express();
const UPLOADS_DIR = path.resolve('./uploads');
// Allowlist erlaubter Dateierweiterungen
const ALLOWED_EXTENSIONS = ['.pdf', '.jpg', '.png', '.txt'];
app.get('/download', (req, res) => {
const filename = req.query.file;
// Validieren, dass Dateiname angegeben und nicht leer ist
if (!filename || typeof filename !== 'string') {
return res.status(400).send('Ungültiger Dateiname');
}
// Auf offensichtliche Traversal-Versuche prüfen (Defense in Depth)
if (filename.includes('..') || filename.includes('\0')) {
console.warn(`Path-Traversal-Versuch erkannt: ${filename}`);
return res.status(403).send('Zugriff verweigert');
}
// Zu absolutem Pfad auflösen
const requestedPath = path.resolve(UPLOADS_DIR, filename);
// Kritisch: Überprüfen, dass der aufgelöste Pfad im Upload-Verzeichnis liegt
if (!requestedPath.startsWith(UPLOADS_DIR + path.sep)) {
console.warn(`Path Traversal blockiert: ${filename} -> ${requestedPath}`);
return res.status(403).send('Zugriff verweigert');
}
// Dateierweiterung validieren
const ext = path.extname(requestedPath).toLowerCase();
if (!ALLOWED_EXTENSIONS.includes(ext)) {
return res.status(403).send('Dateityp nicht erlaubt');
}
// Prüfen, ob Datei existiert und eine reguläre Datei ist (kein Verzeichnis oder Symlink)
try {
const stats = fs.lstatSync(requestedPath);
if (!stats.isFile()) {
return res.status(404).send('Datei nicht gefunden');
}
} catch (err) {
return res.status(404).send('Datei nicht gefunden');
}
res.download(requestedPath);
});
app.listen(3000);
Der korrigierte Code verwendet path.resolve(), um den kanonischen absoluten Pfad zu erhalten, und überprüft, ob er mit dem Upload-Verzeichnispfad beginnt (einschließlich des Pfadtrennzeichens, um partielle Übereinstimmungen zu verhindern). Zusätzliche Verteidigungsmaßnahmen umfassen die Prüfung auf ".."-Sequenzen, Null-Bytes, die Validierung von Dateierweiterungen gegen eine Allowlist und die Überprüfung, ob das Ziel eine reguläre Datei ist.
Ausgenutzt in der Praxis
Fortinet FortiOS SSL VPN Anmeldedatendiebstahl (Mehrere Organisationen, 2019-2021)
CVE-2018-13379 in Fortinet FortiOS ermöglichte es Angreifern, Relative-Path-Traversal-Sequenzen zu verwenden, um die Datei sslvpn_websessions zu lesen, die Klartext-VPN-Anmeldedaten enthielt. Die Schwachstelle wurde umfangreich ausgenutzt, wobei Anmeldedaten für etwa 50.000 anfällige Geräte im November 2020 online veröffentlicht wurden. APT-Akteure nutzten diese Schwachstelle, um ersten Zugang zu Regierungsbehörden, kritischer Infrastruktur und Organisationen des privaten Sektors weltweit zu erlangen.
Pulse Secure VPN-Kampagne (Global, 2019-2021)
CVE-2019-11510 nutzte eine Relative-Path-Traversal-Schwachstelle in Pulse Secure VPN-Appliances aus, die es nicht authentifizierten Angreifern ermöglichte, beliebige Dateien zu lesen, indem sie mit "../"-Sequenzen fest codierte Verzeichnis-Allowlists umgingen. Travelex, das Devisenunternehmen, erlitt einen schweren Ransomware-Angriff, nachdem Kriminelle diese Schwachstelle ausgenutzt hatten. CISA berichtete von Kompromittierungen bei mehreren US-Regierungsbehörden und kritischen Infrastruktureinrichtungen, wobei gestohlene Active-Directory-Anmeldedaten noch Monate nach der Anwendung von Patches für dauerhaften Zugriff verwendet wurden.
Kubernetes kubectl Copy-Schwachstelle (Cloud-Umgebungen, 2019)
Eine Relative-Path-Traversal-Schwachstelle wurde in kubectl entdeckt, der Befehlszeilenschnittstelle für Kubernetes-Cluster. Die Schwachstelle im cp-Befehl ermöglichte es bösartigen Container-Images, Dateien auf der Workstation eines Benutzers zu überschreiben, wenn Dateien von einem Pod kopiert wurden. Da kubectl von Administratoren verwendet wird, die Cloud-Infrastruktur verwalten, könnte die Ausnutzung zu Code-Ausführung auf privilegierten Systemen oder zur Kompromittierung ganzer Cluster-Management-Umgebungen führen.
Tools zum Testen/Ausnutzen
-
Burp Suite — Web-Sicherheitstestplattform mit Intruder-Payloads für Relative Path Traversal, einschließlich verschiedener Codierungsschemata wie URL-Codierung, Doppelcodierung und Unicode-Normalisierung.
-
dotdotpwn — dedizierter Directory-Traversal-Fuzzer, der automatisch zahlreiche "../"-Payload-Variationen über mehrere Protokolle und Codierungsformate generiert und testet.
-
Wfuzz — Web-Fuzzer, der mit Path-Traversal-Wortlisten verwendet werden kann, um anfällige Parameter zu entdecken und verschiedene Traversal-Sequenzen systematisch zu testen.
CVE-Beispiele
-
CVE-2018-13379 — Fortinet FortiOS SSL VPN Relative Path Traversal ermöglicht nicht authentifiziertes Lesen von Dateien über "../"-Sequenzen.
-
CVE-2019-11510 — Pulse Secure Connect Relative Path Traversal umgeht Pfadeinschränkungen durch codierte Traversal-Sequenzen.
-
CVE-2023-39139 — Archive npm-Paket Relative Path Traversal über bösartig erstellte Archiveinträge ermöglicht beliebiges Schreiben von Dateien.
-
CVE-2021-41773 — Apache HTTP Server Path Traversal durch codierte "../"-Sequenzen ermöglicht Zugriff außerhalb des Document Root.
Referenzen
-
MITRE. "CWE-23: Relative Path Traversal." Common Weakness Enumeration. https://cwe.mitre.org/data/definitions/23.html
-
OWASP. "Path Traversal." OWASP Foundation. https://owasp.org/www-community/attacks/Path_Traversal
-
Snyk. "What is directory traversal?" Snyk Learn. https://learn.snyk.io/lesson/directory-traversal/
-
Invicti. "Directory Traversal (Path Traversal)." https://www.invicti.com/learn/directory-traversal-path-traversal