flawopen.com/Path Traversal/Zip Slip
Was ist eine Zip-Slip-Schwachstelle?
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.
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
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.
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.