2009-09-22 14 views
47

Właśnie przeczytałem o zip bombs, tj. Plikach zip, które zawierają bardzo dużą ilość bardzo ściśliwych danych (00000000000000000 ...).Jak mogę zabezpieczyć się przed bombą zip?

Po otwarciu wypełniają dysk serwera.

Jak wykryć plik zip to bomba zip przed rozpakowaniem?

UPDATE Czy możesz mi powiedzieć, jak to zrobić w Pythonie lub Javie?

+1

Współczynnik kompresji może być mniejszy niż 1000 do 1 - nie tylko zużywa dużo miejsca na dysku, ale także zajmuje dużo czasu na zapisanie wyniku. – sharptooth

+1

[Powiązane pytanie dotyczące gzip i bzip2] (http://stackoverflow.com/questions/13622706/how-to-protect-myself-from-a-gzip-or-bzip2-bomb). –

Odpowiedz

20

Spróbuj to w Pythonie:

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

Przynajmniej z gzipem Myślę, że rozmiar nieskompresowany może nie być w nagłówku (więc może działać z suwakiem, ale nie z .tar.gz) – tonfa

+0

@tonfa, dziękuję za wzmiankę o tym, że zipfile doesn Obsługuje format gnu zip. –

+4

IIRC, standard Zip (i spójrzmy prawdzie w oczy, jeśli chcesz spowodować DoS, musisz koniecznie przestrzegać standardów) pozwala na usunięcie pewnych rozmiarów z katalogu centralnego i nagłówków wpisu. –

4

Jeśli używany dekompresor ZIP może dostarczyć dane o oryginalnym i skompresowanym rozmiarze, możesz użyć tych danych. W przeciwnym razie rozpocznij rozpakowywanie i monitoruj rozmiar wyjściowy - jeśli zbyt mocno go obetniesz.

5

Sprawdź nagłówek zip pierwszy :)

+2

sprawdź komentarze w odpowiedzi Nicka Dandoulakisa – n611x007

1

Upewnij się, że nie używasz dysku systemowego do przechowywania temp. Nie jestem pewien, czy wirus wirusowy sprawdzi to, jeśli go napotka.

Możesz również przejrzeć informacje znajdujące się w pliku zip i pobrać listę treści. Jak to zrobić zależy od narzędzia używane, aby wyodrębnić plik, więc trzeba dostarczyć więcej informacji tutaj

10

czytając opis na Wikipedii -

Deny wszelkie skompresowane pliki zawierające skompresowane pliki.
        Użyj ZipFile.entries(), aby pobrać listę plików, a następnie ZipEntry.getName(), aby znaleźć rozszerzenie pliku.
Odmawiaj wszelkich skompresowanych plików zawierających pliki powyżej określonego rozmiaru lub nie można określić rozmiaru przy uruchomieniu.
        Podczas iteracji plików użyj ZipEntry.getSize(), aby pobrać rozmiar pliku.

4

Nie zezwalaj procesowi na zapisywanie wystarczającej ilości danych, aby wypełnić dysk, tj. Rozwiązać problem, a nie tylko jedną z możliwych przyczyn problemu.

19

Zip jest, erm, "ciekawy" format. Solidnym rozwiązaniem jest przesyłanie strumieniowe danych i zatrzymywanie, gdy masz już dość. W Javie używaj raczej ZipInputStream niż ZipFile. Ten ostatni wymaga również, aby przechowywać dane w pliku tymczasowym, który również nie jest największym z pomysłów.

Powiązane problemy