blueredix logo
info vuln-class-path-traversal

Path Traversal, verständlich erklärt

Path Traversal erlaubt das Lesen oder Schreiben außerhalb des freigegebenen Verzeichnisses und ist oft der zweite Schritt zur kompletten Server-Übernahme.

Worum es geht

Path Traversal (auch Directory Traversal, “Dot-Dot-Slash” oder LFI für “Local File Inclusion”) ist eine Bug-Kategorie, bei der die Anwendung einen Dateinamen aus Benutzereingabe nimmt, ihn mit einem Basis-Verzeichnis zusammenfügt und die Datei zurückgibt, ohne zu verhindern, dass die Person mit .. aus dem Verzeichnis ausbricht.

Ein Mini-Beispiel: Die Anwendung führt aus:

fs.readFile('./uploads/' + filename)

Ein Angreifer übergibt filename=../../etc/passwd. Der zusammengesetzte Pfad löst zu /etc/passwd auf. Das Betriebssystem liefert die Datei zurück, weil keine Schutzschicht prüft, dass der Pfad noch im Upload-Verzeichnis liegt.

Warum es noch immer passiert

Moderne Frameworks haben sichere Wege, Dateien auszuliefern (sendFile(), Static-Asset-Middleware), aber an vielen Stellen greift Code direkt auf die Datei-Funktionen des Betriebssystems zu:

  • Download-Endpoints. “Anhang herunterladen”, “Bericht exportieren”, die den Pfad aus einem Dateinamen in der URL bauen.
  • Bild- und Template-Auswahl. “diese Vorlage benutzen”, “dieses Hintergrundbild verwenden”, die einen nutzerseitigen Namen auflösen.
  • Unzip- / Entpack-Code. “Zip Slip” ist die Variante, bei der ein Archiv mit ..-Einträgen Dateien außerhalb des Extraktions-Verzeichnisses überschreibt. Sie hat Spring, Kubernetes und mehrere Apache-Projekte mehrfach getroffen.
  • Log-Viewer. “Log-Datei X anzeigen”, die einen vom Nutzer kontrollierten Pfad lesen.

Was ein Angreifer gewinnt

Standard-Resultat: beliebiger Dateilesezugriff im Kontext des Service-Users:

  • /etc/passwd und /etc/shadow, um Nutzer aufzuzählen und (falls als root laufend) Hashes offline zu cracken.
  • ~/.aws/credentials, ~/.ssh/id_rsa, ~/.docker/config.json für Cloud- und Remote-Server-Zugriff.
  • Anwendungs-Konfigurationsdateien mit DB-Passwörtern, API-Keys, Signing-Secrets.
  • Quellcode der Anwendung, auf der Suche nach weiteren Bugs.

Erlaubt der Bug auch Schreiben beliebiger Dateien (selten, aber real, vor allem in Upload-Handlern und Unzip-Code), eskaliert die Folge stark. Webshell ins Document-Root → vollständige Remote-Code-Execution. ~/.ssh/authorized_keys überschreiben, wenn der Dienst ein Heimverzeichnis hat → SSH-Zugriff. Startup-Skript überschreiben → Persistenz über Reboot.

Wie das behoben wird

Für Datei-Lese-Endpoints:

  • Möglichst gar keine Dateinamen aus Benutzereingaben akzeptieren. Stattdessen opaque IDs verwenden, die serverseitig auf bekannte Dateien gemappt werden.
  • Wenn nutzerseitige Dateinamen unvermeidbar sind: auflösen und prüfen. Nach Join mit dem Basis-Verzeichnis das Betriebssystem nach dem kanonischen Pfad fragen (realpath(), os.path.realpath(), Path.GetFullPath()) und sicherstellen, dass er weiterhin mit dem kanonischen Basis-Pfad beginnt. Alles andere ablehnen.
  • Verzeichnis-Inhalt allowlisten: safeFile = base + path.basename(input) wirft jeden Verzeichnis-Anteil weg, den der Angreifer einschleusen will.

Für Zip-/Tar-Entpackung:

  • Eine Bibliothek nutzen, die bereits gegen Zip Slip schützt (aktuelle Versionen von commons-compress, node-tar, unzipper tun das).
  • Oder dieselbe Kanonisierungs-Regel auf jeden Eintragsnamen anwenden, bevor entpackt wird.

Für URL-zu-Datei-Resolver:

  • Erst Percent-Decoding und Unicode-Normalisierung, dann Validierung. Angreifer verstecken .. gerne als %2e%2e, %252e%252e (doppelt encoded) oder als Unicode-Equivalente.

Wie blueredix Path Traversal meldet

Path-Traversal-CVEs tauchen in CMSs (Drupal, Joomla, WordPress-Plugins), Admin-Panels, Datei-Managern und Archiv-Viewern auf. Der Scanner meldet sie wie jede CVE: mit Schwere, Ausnutzungs-Wahrscheinlichkeit und einem Link zurück auf Wie man eine CVE liest.

Zusätzlich laufen kuratierte Templates, die bekannte verwundbare Produkte an bekannten URLs prüfen. Solche Befunde enthalten die konkrete URL und die im Proof zurückgegebene Datei.

Mehr dazu