2009-09-22 6 views
47

Ich lese gerade über zip bombs, d. H. Zip-Dateien, die sehr große Menge stark komprimierbaren Daten enthalten (00000000000000000 ...).Wie kann ich mich vor einer Zip-Bombe schützen?

Beim Öffnen füllen sie die Festplatte des Servers.

Wie kann ich eine Zip-Datei finden ist eine Zip-Bombe vor Entpacken Sie es?

UPDATE Können Sie mir sagen, wie ist das in Python oder Java gemacht?

+1

Das Komprimierungsverhältnis kann wie 1000 zu 1 sein - es verbraucht nicht nur viel Speicherplatz, sondern benötigt auch viel Zeit, um die Ausgabe zu schreiben. – sharptooth

+1

[Verwandte Frage zu gzip und bzip2] (http://stackoverflow.com/questions/13622706/how-to-protect-myself-from-a-gzip-or-bzip2-bomb). –

Antwort

20

Versuchen Sie, dies in Python bieten:

import zipfile 
z = zipfile.ZipFile('c:/a_zip_file') 
print 'total files size=', sum(e.file_size for e in z.infolist()) 
z.close() 
+5

Zumindest mit gzip ich denke, die unkomprimierte Größe möglicherweise nicht in der Kopfzeile (so könnte es mit Zip arbeiten, aber nicht mit .tar.gz) – tonfa

+0

@tonfa, danke für die Erwähnung, dass Zipfile doesn handle nicht mit gnu zip format. –

+4

IIRC, Zip-Standard (und lassen Sie uns ehrlich sein, wenn Sie ein DoS verursachen wollen, werden Sie notwendigerweise folgen Standards) ermöglicht bestimmte Größen aus dem zentralen Verzeichnis und Eintrag Header entfernt werden. –

4

Wenn der ZIP-Dekompressor, den Sie verwenden, die Daten in Originalgröße und komprimierter Größe bereitstellen kann, können Sie diese Daten verwenden. Ansonsten entpacken Sie das Gerät und überwachen Sie die Ausgabegröße. Wenn es zu groß wird, schneiden Sie es locker.

5

prüfen eine Zip-Header zuerst :)

+2

Überprüfen Sie die Kommentare in Nick Dandoulakis Antwort – n611x007

1

Vergewissern Sie sich, Ihr Systemlaufwerk für temporäre Speicherung nicht verwendet wird. Ich bin mir nicht sicher, ob ein Virenscanner es überprüfen wird, wenn es darauf trifft.

Sie können auch die Informationen in der ZIP-Datei betrachten und eine Liste des Inhalts abrufen. Wie dies zu tun, hängt von dem Dienstprogramm verwendet, um die Datei zu extrahieren, so müssen Sie hier weitere Informationen

10

Lesung über die Beschreibung auf Wikipedia -

Deny alle komprimierten Dateien, die komprimierte Dateien enthalten.
        Verwenden Sie zum Abrufen einer Liste von Dateien, dann ZipEntry.getName(), um die Dateierweiterung zu finden.
Verweigern Sie alle komprimierten Dateien, die Dateien über eine festgelegte Größe enthalten, oder die Größe kann beim Start nicht bestimmt werden.
        Beim Iterieren über die Dateien verwenden Sie ZipEntry.getSize(), um die Dateigröße abzurufen.

4

Lassen Sie den Upload-Prozess nicht genügend Daten schreiben, um die Festplatte zu füllen, dh das Problem zu lösen, nicht nur eine mögliche Ursache des Problems.

19

Zip ist, äh, ein "interessantes" Format. Eine robuste Lösung besteht darin, die Daten zu streamen und zu beenden, wenn Sie genug haben. Verwenden Sie in Java ZipInputStream statt ZipFile. Letzteres erfordert auch, dass Sie die Daten in einer temporären Datei speichern, die auch nicht die beste Idee ist.