Absolute Path Traversal
Beschreibung
Absolute Path Traversal ist eine Schwachstelle, die auftritt, wenn Software Benutzereingaben akzeptiert, die absolute Dateipfade enthalten (Pfade, die vom Dateisystem-Root beginnen), ohne ordnungsgemäß zu validieren, dass der angegebene Pfad innerhalb eines autorisierten Verzeichnisses liegt. Anders als Relative Path Traversal, das Sequenzen wie "../" zur Navigation nach oben verwendet, ermöglicht Absolute Path Traversal Angreifern, vollständige Pfade wie "/etc/passwd" auf Unix-Systemen oder "C:\Windows\system32\config\SAM" auf Windows direkt anzugeben. Diese Schwachstelle umgeht Verzeichniseinschränkungen, indem sie jedes Basisverzeichnis ignoriert, das die Anwendung verwenden soll, und gibt Angreifern direkten Zugriff auf jede Datei, die vom Anwendungsprozess lesbar ist.
Risiko
Absolute-Path-Traversal-Schwachstellen ermöglichen es Angreifern, Verzeichniseinschränkungen vollständig zu umgehen, indem sie vollständige Dateisystempfade angeben. Dies gewährt sofortigen Zugriff auf sensible Systemdateien einschließlich /etc/passwd (Benutzerkonten), /etc/shadow (Passwort-Hashes bei falsch konfigurierten Systemen), Anwendungskonfigurationsdateien, Datenbankanmeldedaten, private Schlüssel und Quellcode. Der Angriff ist besonders gefährlich, weil er keine Directory-Traversal-Sequenzen erfordert, die Sicherheitsfilter erkennen könnten, was es einfacher macht, naive Sicherheitskontrollen zu umgehen. Anwendungen, die mit erhöhten Privilegien laufen, legen einen größeren Teil des Dateisystems für potenzielle Kompromittierung offen. Erfolgreiche Ausnutzung kann zu Anmeldedatendiebstahl, Privilegieneskalation und vollständiger Systemkompromittierung führen.
Lösung
Validieren Sie alle vom Benutzer bereitgestellten Pfade gegen eine Allowlist erlaubter Dateinamen oder Identifikatoren, anstatt beliebige Pfade zu akzeptieren. Wenn Dateipfade akzeptiert werden müssen, entfernen oder lehnen Sie alle absoluten Pfadindikatoren ab (führende "/" auf Unix oder Laufwerksbuchstaben wie "C:" auf Windows) und stellen Sie sicher, dass alle Pfade relativ zu einem festgelegten Basisverzeichnis behandelt werden. Nach der Konstruktion des vollständigen Pfads verwenden Sie kanonische Pfadauflösung, um die absolute Form zu erhalten, und überprüfen Sie, ob er innerhalb der erlaubten Grenzen liegt, bevor Sie Dateioperationen durchführen. Implementieren Sie Pfadvalidierung auf der Serverseite, da clientseitige Prüfungen leicht umgangen werden können. Stellen Sie Anwendungen mit minimalen Dateisystem-Leseberechtigung bereit, um die Exposition bei Ausnutzung der Schwachstelle zu begrenzen.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Vertraulichkeit | Bereich: Vertraulichkeit Angreifer können direkt absolute Pfade zu sensiblen Dateien angeben und so Konfigurationsdaten, Anmeldedaten, Verschlüsselungsschlüssel und proprietären Quellcode offenlegen, ohne Directory-Traversal-Sequenzen zu benötigen. |
| Integrität | Bereich: Integrität Wenn die Schwachstelle das Schreiben von Dateien über absolute Pfade ermöglicht, können Angreifer kritische Systemkonfigurationen überschreiben, bösartigen Code einschleusen oder Authentifizierungsdaten modifizieren. |
| Verfügbarkeit | Bereich: Verfügbarkeit Kritische Systemdateien könnten durch Manipulation absoluter Pfade gelöscht oder beschädigt werden, was zu Systeminstabilität oder vollständigem Denial-of-Service führt. |
| Zugriffskontrolle | Bereich: Zugriffskontrolle Direkter Zugriff auf Anmeldedatenspeicher, Sitzungsdateien oder Authentifizierungskonfiguration kann Privilegieneskalation und unbefugten Zugriff auf geschützte Ressourcen ermöglichen. |
Beispielcode + Lösungscode
Das folgende Beispiel zeigt eine anfällige Python-Flask-Anwendung, die Datei-Downloads mit vom Benutzer bereitgestellten Pfaden verarbeitet:
Anfälliger Code
from flask import Flask, request, send_file
import os
app = Flask(__name__)
DOCUMENTS_DIR = "/var/www/app/documents"
@app.route('/download')
def download_file():
# ANFÄLLIG: Akzeptiert absolute Pfade aus Benutzereingaben
filepath = request.args.get('path')
# Angreifer kann verwenden: ?path=/etc/passwd
# Der absolute Pfad ignoriert DOCUMENTS_DIR vollständig
if os.path.exists(filepath):
return send_file(filepath)
else:
return "Datei nicht gefunden", 404
@app.route('/read')
def read_file():
# ANFÄLLIG: Keine Validierung des vom Benutzer bereitgestellten Pfads
filename = request.args.get('file')
# Wenn der Benutzer "/etc/passwd" angibt, wird die Systemdatei gelesen
with open(filename, 'r') as f:
return f.read()
if __name__ == '__main__':
app.run()
Beide Endpunkte sind anfällig, weil sie Benutzereingaben direkt als Dateipfade akzeptieren. Ein Angreifer kann "/etc/passwd" oder jeden anderen absoluten Pfad angeben, um beliebige für die Anwendung zugängliche Dateien zu lesen.
Korrigierter Code
from flask import Flask, request, send_file, abort
import os
import re
app = Flask(__name__)
DOCUMENTS_DIR = os.path.realpath("/var/www/app/documents")
ALLOWED_EXTENSIONS = {'.pdf', '.txt', '.jpg', '.png'}
def is_safe_path(base_dir, user_path):
"""Überprüft, ob der aufgelöste Pfad im Basisverzeichnis liegt."""
# Absolute Pfade sofort ablehnen
if os.path.isabs(user_path):
return False, "Absolute Pfade nicht erlaubt"
# Offensichtliche Traversal-Versuche ablehnen
if '..' in user_path or user_path.startswith('/'):
return False, "Ungültige Pfadzeichen"
# Vollständigen Pfad relativ zur Basis konstruieren
full_path = os.path.join(base_dir, user_path)
# Zu kanonischem absolutem Pfad auflösen
try:
real_path = os.path.realpath(full_path)
except (OSError, ValueError):
return False, "Ungültiger Pfad"
# Überprüfen, dass aufgelöster Pfad im Basisverzeichnis liegt
if not real_path.startswith(base_dir + os.sep):
return False, "Pfad außerhalb des erlaubten Verzeichnisses"
# Überprüfen, ob Datei existiert und eine reguläre Datei ist
if not os.path.isfile(real_path):
return False, "Datei nicht gefunden"
return True, real_path
def validate_extension(filepath):
"""Prüft, ob Dateierweiterung erlaubt ist."""
ext = os.path.splitext(filepath)[1].lower()
return ext in ALLOWED_EXTENSIONS
@app.route('/download')
def download_file():
filename = request.args.get('path', '')
# Dateinamenformat validieren (nur alphanumerisch, Punkte, Unterstriche, Bindestriche)
if not re.match(r'^[\w\-. ]+$', filename):
abort(400, 'Ungültiges Dateinamenformat')
# Pfad auf Sicherheit validieren
is_safe, result = is_safe_path(DOCUMENTS_DIR, filename)
if not is_safe:
app.logger.warning(f"Path-Traversal-Versuch: {filename} - {result}")
abort(403, 'Zugriff verweigert')
safe_path = result
# Dateierweiterung validieren
if not validate_extension(safe_path):
abort(403, 'Dateityp nicht erlaubt')
return send_file(safe_path)
@app.route('/read')
def read_file():
filename = request.args.get('file', '')
# Pfad validieren und sicheren Pfad erhalten
is_safe, result = is_safe_path(DOCUMENTS_DIR, filename)
if not is_safe:
app.logger.warning(f"Path-Traversal-Versuch: {filename} - {result}")
abort(403, 'Zugriff verweigert')
safe_path = result
# Nur Textdateien zum Lesen erlauben
if not safe_path.endswith('.txt'):
abort(403, 'Nur Textdateien können gelesen werden')
with open(safe_path, 'r') as f:
return f.read()
if __name__ == '__main__':
app.run()
Der korrigierte Code lehnt explizit absolute Pfade mit os.path.isabs() ab, validiert, dass Dateinamen nur erlaubte Zeichen enthalten, verwendet os.path.realpath(), um Pfade in kanonische Form aufzulösen, und überprüft, dass der aufgelöste Pfad mit dem Basisverzeichnis beginnt. Mehrere Verteidigungsschichten stellen Schutz sicher, selbst wenn eine Prüfung umgangen wird.
Ausgenutzt in der Praxis
F5 BIG-IP Konfigurationsdateizugriff (Unternehmensnetzwerke, 2020-2021)
CVE-2020-5902 im F5 BIG-IP Traffic Management User Interface ermöglichte nicht authentifizierten Angreifern den Zugriff auf beliebige Dateien durch Absolute Path Traversal. Angreifer könnten sensible Dateien wie /etc/passwd oder BIG-IP-Konfigurationsdateien mit Anmeldedaten direkt anfordern, indem sie absolute Pfade angaben. Die Schwachstelle wurde aktiv von Ransomware-Betreibern und nationalstaatlichen Akteuren ausgenutzt, um Unternehmensnetzwerkinfrastruktur zu kompromittieren, die kritischen Internetverkehr verwaltet.
Spring Cloud Config Arbitrary File Read (Cloud-Deployments, 2020)
CVE-2020-5410 im Spring Cloud Config Server ermöglichte Angreifern das Lesen beliebiger Dateien durch Directory Traversal. Während die Schwachstelle Traversal-Sequenzen beinhaltete, akzeptierte sie auch absolute Pfade, wenn die Anwendung die Pfadauflösung nicht ordnungsgemäß einschränkte. Angreifer zielten auf Cloud-Deployments, um auf application.properties-Dateien zuzugreifen, die Datenbankanmeldedaten, API-Schlüssel und andere sensible Konfigurationsdaten auf Spring Cloud Config-Servern enthielten.
SolarWinds Serv-U Arbitrary File Read (Regierung & Unternehmen, 2021)
CVE-2021-35211 in SolarWinds Serv-U ermöglichte authentifizierten Angreifern das Lesen beliebiger Dateien durch Angabe absoluter Pfade und wurde zusammen mit CVE-2021-35215 für Remote-Code-Ausführung ausgenutzt. Die Bedrohungsgruppe DEV-0322 (mit China verknüpft) nutzte diese Schwachstellenkette, um US-Verteidigungsunternehmen und Regierungsbehörden anzugreifen und auf sensible Dateien mit Anmeldedaten und Konfigurationsdaten zuzugreifen, die eine weitere Netzwerkpenetration ermöglichten.
Tools zum Testen/Ausnutzen
-
Burp Suite — Web-Sicherheitstestplattform mit Fähigkeiten zum Testen von Absolute Path Traversal durch Manipulation von Dateiparametern mit Pfaden wie /etc/passwd und Beobachtung der Anwendungsantworten.
-
wfuzz — Webanwendungs-Fuzzer, der absolute Pfad-Payloads mit Wortlisten testen kann, die häufige sensible Dateipfade für Unix- und Windows-Systeme enthalten.
-
PayloadsAllTheThings — umfassendes Repository von Path-Traversal-Payloads einschließlich absoluter Pfade für verschiedene Betriebssysteme und häufige Zieldateien.
CVE-Beispiele
-
CVE-2020-5902 — F5 BIG-IP TMUI Arbitrary File Read und RCE über Path Traversal einschließlich absolutem Pfadzugriff.
-
CVE-2020-5410 — Spring Cloud Config Server Directory Traversal ermöglicht beliebigen Dateizugriff durch Pfadmanipulation.
-
CVE-2021-35211 — SolarWinds Serv-U Arbitrary File Read-Schwachstelle, die von nationalstaatlichen Akteuren ausgenutzt wurde.
-
CVE-2019-16759 — vBulletin Arbitrary File Inclusion über absoluten Pfad ermöglicht Remote-Code-Ausführung.
Referenzen
-
MITRE. "CWE-36: Absolute Path Traversal." Common Weakness Enumeration. https://cwe.mitre.org/data/definitions/36.html
-
PortSwigger. "What is path traversal, and how to prevent it?" Web Security Academy. https://portswigger.net/web-security/file-path-traversal
-
OWASP. "Testing Directory Traversal File Include." Web Security Testing Guide. https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/05-Authorization_Testing/01-Testing_Directory_Traversal_File_Include
-
YesWeHack. "Beyond dot dot slash: a practical guide to path traversal and arbitrary file read attacks." https://www.yeswehack.com/learn-bug-bounty/practical-guide-path-traversal-attacks