FlawOpen

flawopen.com/Path Traversal/Zip Slip

Was ist eine Zip-Slip-Schwachstelle?

Reference page
ELI5

Ein ZIP-Archiv kann Namen wie ../../outside.txt enthalten. Vertraut der Entpacker diesen Namen, kann er außerhalb des Zielordners schreiben — begrenzt nur durch die Rechte des Prozesses.

Warum das leicht übersehen wird

Das Entpacken wirkt alltäglich, doch bei einem nicht vertrauenswürdigen ZIP- oder TAR-Archiv kontrolliert dessen Ersteller die Eintragsnamen. outputDir + entry.name ohne Pfadprüfung ermöglicht einen Verzeichnis-Ausbruch über den Archivinhalt.

VULNERABLE (conceptual)
for entry in zip_file:
    dest = os.path.join(output_dir, entry.name)
    write_file(dest, entry.read())
# entry.name könnte "../../outside.txt" sein
LEXIKALISCHE PFADPRÜFUNG — allein nicht rennsicher
root = os.path.realpath(output_dir)
os.makedirs(root, exist_ok=True)
for entry in zip_file:
    dest = os.path.realpath(
      os.path.join(root, entry.name)
    )
    try:
        inside_root = os.path.commonpath([root, dest]) == root
    except ValueError:
        inside_root = False
    if not inside_root:
        raise ValueError("Unsafe entry path")
    write_file(dest, entry.read())

Diese Prüfung verhindert Pfadausbrüche, auch bei benachbarten Namen mit gemeinsamem Textpräfix. Entpacken Sie in ein neu angelegtes, privates Verzeichnis, weisen Sie Symlink-Einträge zurück und berücksichtigen Sie vorhandene Symlinks sowie parallele Änderungen am Dateisystem; dagegen helfen race-sichere APIs oder eine gepflegte Extraktionsbibliothek.

Häufige Fragen

Python-Archiv-APIs bieten unterschiedliche Pfadschutzmaßnahmen

Das obige Codepaar zeigt konzeptionell eine eigene Extraktionsschleife; es ist nicht Pythons eingebaute Methode ZipFile.extractall(). Laut Python-Dokumentation versuchen ZipFile.extract() und extractall(), Ausbrüche über absolute Pfade und .. zu verhindern. Dennoch sollen nicht vertrauenswürdige Archive vorher geprüft werden. zipfile.Path bereinigt Mitgliedsnamen nicht; aufrufender Code muss sie selbst validieren. TAR-Extraktionsfilter kamen mit Python 3.12; Python 3.14 änderte den Standard auf filter="data". Setzen Sie den Filter bei unterstützten Laufzeiten explizit, wenn deren Standard weniger restriktiv sein kann. Auch der data-Filter verhindert weder jedes unsichere Verhalten noch Ressourcenerschöpfung. Extrahieren Sie in ein neues privates temporäres Verzeichnis und begrenzen Sie Archivgröße, Anzahl der Einträge, entpackte Gesamtgröße und Verarbeitungszeit.

Schützen aktuelle Archivbibliotheken automatisch davor?

Einige Bibliotheksversionen ergänzten Schutzmaßnahmen, nachdem das Muster 2018 bekannt wurde; andere prüfen Pfade standardmäßig nicht. Prüfen Sie die Dokumentation Ihrer Version und validieren Sie jeden Eintrag ausdrücklich.

Quellen

Siehe auch Path-Traversal (CWE-22): Funktionsweise und Schutz in jeder Sprache — flawopen.com Node.js path.join() verhindert Path Traversal nicht PHP include() und benutzergesteuerte Pfade Path Traversal mit Python os.path.join() beheben