Jak zrobić bombę Zip?

131

To pytanie dotyczące bomb zipowych w naturalny sposób doprowadziło mnie do strony Wikipedii na ten temat. W artykule wymieniono przykład pliku zip o rozmiarze 45,1 kb, który jest dekompresowany do 1,3 eksabajta.

Jakie są zasady / techniki, które zostałyby zastosowane do stworzenia takiego pliku w pierwszej kolejności? Właściwie nie chcę tego robić, bardziej interesuje mnie uproszczone wyjaśnienie „jak to działa”.

ps

W artykule wspomniano o 9 warstwach plików ZIP, więc nie jest to prosty przypadek spakowania kilku zer. Dlaczego 9, dlaczego po 10 plików w każdym?

rozdymka tygrysia
źródło
5
@Michael Twoja skarga jest nieprawidłowa. OP nie tylko zapytał, jak to działa, ale nic w opublikowanym artykule nie mówi, że ma to na celu wyraźne wyłączenie antywirusa. Wręcz przeciwnie, wydaje się, że głównym celem tego artykułu jest atak w stylu DOS z tylko przelotną wzmianką o wyłączeniu antywirusa.
San Jacinto
2
Chodzi o to, że OP odnosił się do konkretnego pliku, który składa się z zagnieżdżonych archiwów, a nie jednego dużego skompresowanego pliku.
Michael Borgwardt
1
Myślę, że Michael ma rację, wyjaśnia, jak stworzyć plik opisany w „PS”, a wszyscy inni nie. Jednak „PS” zostało dodane jako zmiana, więc te odpowiedzi mogły nie być rażąco błędne w momencie ich udzielania. Pomyśleli po prostu, że „taki plik” oznacza „dowolny plik, który dekompresuje się do 1,3 eksabajta”, kiedy okazuje się, że miał oznaczać „plik o strukturze podobnej do opisanej w artykule, do którego odsyłam”.
Steve Jessop
1
@onebyone Całkowicie się zgadzam. Po prostu uważam, że w takich okolicznościach głos przeciw nie jest odpowiedni.
San Jacinto
4
Myślę, że zależy to od tego, czy uznasz, że głos przeciw oznacza „to nie jest najlepsza odpowiedź na pytanie”, czy „jesteś głupcem i nie jesteś godzien życia”, czy też miejsce pomiędzy. Osobiście uważam, że powinienem ponownie przeczytać swoją odpowiedź i sprawdzić, czy jest w niej coś nie tak, co powinienem naprawić. Ale teraz jestem całkiem szczęśliwy, że się z tym nie zgadzam i nie zmieniam mojej odpowiedzi, jeśli uważam, że moja odpowiedź coś wnosi. I tak stałem się dość obojętny na cały proces głosowania, teraz, gdy jest jasne, że nigdy nie złapię Jona Skeeta ;-)
Steve Jessop

Odpowiedzi:

93

Cytując ze strony Wikipedii:

Jednym z przykładów bomby Zip jest plik 45.1.zip, który zawierał 45,1 kilobajtów skompresowanych danych, zawierający dziewięć warstw zagnieżdżonych plików ZIP w zestawach po 10, każde archiwum dolnej warstwy zawiera plik 1,30 gigabajta, co daje łącznie 1,30 eksabajta nieskompresowanych danych .

Wszystko, czego potrzebujesz, to jeden plik 1,3 GB pełen zer, skompresuj go do pliku ZIP, zrób 10 kopii, zapakuj je do pliku ZIP i powtórz ten proces 9 razy.

W ten sposób otrzymujesz plik, który po całkowitym zdekompresowaniu tworzy absurdalną ilość danych bez konieczności rozpoczynania od tej ilości.

Ponadto zagnieżdżone archiwa znacznie utrudniają programom takim jak skanery antywirusowe (główny cel tych „bomb”) sprytne działanie i odmawianie rozpakowywania archiwów, które są „zbyt duże”, ponieważ do ostatniego poziomu łączna ilość danych jest nie tak bardzo, nie „widzisz”, jak duże są pliki na najniższym poziomie, dopóki nie osiągniesz tego poziomu, a każdy pojedynczy plik nie jest „zbyt duży” - problem stanowi jedynie ogromna liczba.

Michael Borgwardt
źródło
3
Nie może być ... po spakowaniu pliku z zerami na dole, wynikowy spakowany plik nie będzie prawie tak kompresowalny dla następnej warstwy.
rozdymka
17
Ach, ale na każdym poziomie masz dziesięć identycznych plików - które ponownie ładnie się kompresują. Chociaż ZIP nie wykorzystuje nadmiarowości między plikami, archiwum zawierające dziesięć osobno skompresowanych identycznych plików prawdopodobnie ma dużą nadmiarowość, aby można było wykorzystać następną warstwę.
Michael Borgwardt,
11
Nie chodzi o to, jak wygenerować maksymalną ilość danych z najmniejszego możliwego pliku - chodzi o pokonanie prób skanerów antywirusowych chroniących przed zbyt dużymi archiwami.
Michael Borgwardt
2
Nie o to chodzi w artykule na Wikipedii. Wydaje się, że popycha atak w stylu DOS.
San Jacinto
2
Ale pliki nie są rozpakowywane rekurencyjnie… ofiara powinna nadal rozpakowywać sub-zip pliki, aby działało… Jakiekolwiek obejście tego problemu.
Manoj
47

Utwórz plik o wielkości 1,3 eksabajta z zerami.

Kliknij prawym przyciskiem myszy> Wyślij do folderu skompresowanego (spakowanego).

wefwfwefwe
źródło
22
Zapomniałeś o sarkazmie „buźkę”.
tvanfosson
1
Najprawdopodobniej byłoby to niemożliwe w przypadku większości systemów plików i algorytmów kompresji ze względu na ograniczenia rozmiaru plików. Jednak zagnieżdżanie plików w skompresowanym archiwum (i umieszczanie w archiwum większej liczby zagnieżdżonych archiwów, jeśli algorytm kompresji ma ograniczenie całkowitego rozmiaru) pozwala ominąć te ograniczenia.
Blixt
133
powinien utworzyć plik 1.3 eksabajta z 1. Są znacznie chudsze niż 0 :)
Quinn Wilson
33
@quinn - dlatego kompresja (początkowo grubszych) zer jest znacznie bardziej efektywna
wefwfwefwe
1
To daje plik zip> 1 GB, chyba że się mylę
Chris S
36

W systemie Linux można to łatwo zrobić za pomocą następującego polecenia:

dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -

Zastąp liczbę liczbą KB, które chcesz skompresować. Powyższy przykład tworzy bombę zipową 10 MiB (w ogóle nie jest to bomba, ale pokazuje proces).

NIE potrzebujesz miejsca na dysku twardym do przechowywania wszystkich nieskompresowanych danych.

Thomi
źródło
8
Ale potrzebujesz mocy obliczeniowej, aby skompresować nieskompresowane dane, nadal jest to O (n) rozmiaru nieskompresowanych danych.
tonfa
2
Tak, podobnie jak wszystkie inne odpowiedzi tutaj.
Thomi
6
Odpowiedź Michaela Borgwardta to O (log N) w rozmiarze nieskompresowanych danych.
Steve Jessop
1
W każdym razie mniej więcej. Każde powtórzenie procesu „usuwanie nagłówków archiwum, 10-krotne zduplikowanie wpisu skompresowanego pliku, zastąpienie nagłówków archiwum, kompresowanie” zwiększa poziom zagnieżdżenia zip o 1, zajmuje czas proporcjonalny do rozmiaru skompresowanych danych z poprzedniego kroku , mnoży rozmiar nieskompresowanych danych przez 10, a jeśli w ogóle zwiększa rozmiar skompresowanych danych, z pewnością nie robi tego przez coś w rodzaju współczynnika liniowego.
Steve Jessop
3
W ramach testu spakowałem -9 1,3 GB zer. Wynikiem jest plik o rozmiarze 1,3 MB. Powtórzyłem to 10 razy (nie mogłem zawracać sobie głowy grzebaniem w nagłówkach zip, więc wynik nie zadziała jak bomba zip, ale ilustruje zasadę), aby dać plik 13M, który kompresuje się z zip -9 do 34381 bajtów. Tak więc krok duplikacji faktycznie zmniejsza rozmiar pliku, ponieważ deflate obsługuje tylko tokeny o określonym maksymalnym rozmiarze. Kolejny krok to 18453, a następnie 19012, 19312, 19743, 20120, 20531, 20870.
Steve Jessop
10

Poniżej dotyczy systemu Windows:

Z dowodu koncepcji Security Focus (NSFW!), Jest to plik ZIP z 16 folderami, każdy z 16 folderami, który działa w ten sposób (42 to nazwa pliku zip):

\ 42 \ lib 0 \ book 0 \ rozdział 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ book F \ rozdział F \ doc F \ 0.dll

Prawdopodobnie mylę się z tą liczbą, ale daje ona 4 ^ 16 (4 294 967 296) katalogów. Ponieważ każdy katalog potrzebuje miejsca na alokację N bajtów, ostatecznie jest ogromny. Plik dll na końcu ma 0 bajtów.

Rozpakowanie samego pierwszego katalogu \42\lib 0\book 0\chapter 0\doc 0\0.dlldaje 4 GB miejsca alokacyjnego.

Chris S.
źródło
27
Po prostu założyłem, że to nagie kobiety prowadzące badania nad bezpieczeństwem.
James McMahon
3
Plik zip to nsfw. Włączy się wielki czerwony alarm paniki, a klatka spadnie z sufitu wokół twojego biurka
Chris S,
4
Jeśli każde trafienie w plik wirusa skutkuje rozmową kwalifikacyjną z HR, to albo nie potrzebujesz skanera antywirusowego, albo nie potrzebujesz działu HR. Jeden z nich nie wnosi wkładu w biznes ;-)
Steve Jessop
2
Może to być również NSFW, ponieważ skaner wirusów sieciowych może chcieć to sprawdzić - i wyodrębnić, aby to zrobić.
Michael Stum
5
Skaner antywirusowy powinien po prostu oznaczyć go jako podejrzany (co może spowodować jego bezpieczne zablokowanie lub może spowodować, że użytkownik zostanie zgłoszony jako niebezpieczny w przypadku próby zainstalowania wirusów). Jeśli bomba rzeczywiście wybuchnie, Twój dział IT nauczył się czegoś cennego - potrzebuje lepszego skanera antywirusowego.
Steve Jessop
8

Poważna odpowiedź:

(Zasadniczo) Kompresja polega na wykrywaniu powtarzających się wzorców, więc plik zip zawierałby dane reprezentujące coś podobnego

0x100000000000000000000000000000000000  
(Repeat this '0' ten trillion times)

Bardzo krótki plik zip, ale ogromny po rozwinięciu.

wefwfwefwe
źródło
1
To mogłoby być jeszcze bardziej skompresowane, naprawdę: 0x1 (0x35) (to znaczy drugie 0 jest powtarzane 35 razy, aby rozszerzyć się do twojego komentarza)
Michael
5

Aby utworzyć taki plik w praktycznym ustawieniu (tj. Bez tworzenia pliku 1,3 eksabajta na ogromnym dysku twardym), prawdopodobnie musiałbyś nauczyć się formatu pliku na poziomie binarnym i napisać coś, co przekłada się na to, jak wyglądałby żądany plik, po kompresja.

Andy_Vulhop
źródło
5

W artykule wspomniano o 9 warstwach plików ZIP, więc nie jest to prosty przypadek spakowania kilku zer. Dlaczego 9, dlaczego po 10 plików w każdym?

Po pierwsze, artykuł na Wikipedii mówi obecnie o 5 warstwach po 16 plików. Nie jestem pewien, skąd bierze się ta rozbieżność, ale nie jest to aż tak istotne. Prawdziwe pytanie brzmi: po co w ogóle używać zagnieżdżania.

DEFLATE, jedyna powszechnie obsługiwana metoda kompresji plików zip *, ma maksymalny współczynnik kompresji 1032. Można to osiągnąć asymptotycznie dla dowolnej powtarzającej się sekwencji 1-3 bajtów. Bez względu na to, co zrobisz z plikiem zip, o ile używa on tylko DEFLATE, rozmiar po rozpakowaniu będzie co najwyżej 1032 razy większy od oryginalnego pliku zip.

Dlatego konieczne jest użycie zagnieżdżonych plików ZIP, aby osiągnąć naprawdę skandaliczne współczynniki kompresji. Jeśli masz 2 warstwy kompresji, maksymalny współczynnik wynosi 1032 ^ 2 = 1065024. Dla 3 jest to 1099104768 i tak dalej. Dla 5 warstw użytych w pliku 42.zip teoretyczny maksymalny współczynnik kompresji wynosi 1170572956434432. Jak widać, rzeczywisty 42.zip jest daleki od tego poziomu. Po części jest to narzut związany z formatem zip, a po części po prostu ich to nie obchodzi.

Gdybym miał zgadywać, powiedziałbym, że plik 42.zip został utworzony po prostu przez utworzenie dużego pustego pliku i wielokrotne spakowanie go i skopiowanie. Nie ma próby przekroczenia granic formatu, maksymalizacji kompresji czy czegokolwiek - po prostu wybrali arbitralnie 16 kopii na warstwę. Chodziło o to, aby bez większego wysiłku stworzyć dużą ładowność.

Uwaga: inne formaty kompresji, takie jak bzip2, oferują znacznie, dużo, dużo większe maksymalne współczynniki kompresji. Jednak większość parserów zip ich nie akceptuje.

PS Możliwe jest utworzenie pliku zip, który rozpakuje się do własnej kopii (quine). Możesz także utworzyć taki, który rozpakuje się do wielu kopii samego siebie. Dlatego, jeśli rekurencyjnie rozpakujesz plik na zawsze, maksymalny możliwy rozmiar jest nieskończony. Jedynym ograniczeniem jest to, że może wzrosnąć maksymalnie o 1032 w każdej iteracji.

PPS Rysunek 1032 zakłada, że ​​dane pliku w pliku zip są rozłączne. Jedną z dziwactw formatu pliku zip jest to, że ma on katalog centralny, który zawiera listę plików w archiwum i przesunięcia do danych pliku. Jeśli utworzysz wiele pozycji pliku wskazujących na te same dane, możesz osiągnąć znacznie wyższe współczynniki kompresji nawet bez zagnieżdżania, ale taki plik zip zostanie prawdopodobnie odrzucony przez parsery.

Antymon
źródło
4

Dobrym sposobem na utworzenie bomby zip (lub gzbomb) jest znajomość docelowego formatu binarnego. W przeciwnym razie, nawet jeśli używasz pliku strumieniowego (na przykład używając /dev/zero), nadal będziesz ograniczony mocą obliczeniową potrzebną do skompresowania strumienia.

Ładny przykład bomby gzip: http://selenic.com/googolplex.gz57 (w pliku jest wiadomość osadzona po kilku poziomach kompresji, co powoduje powstanie ogromnych plików)

Baw się dobrze, znajdując tę ​​wiadomość :)

tonfa
źródło
2

Być może na Uniksie mógłbyś przelać pewną liczbę zer bezpośrednio do programu zip lub coś w tym stylu? Nie wiem jednak wystarczająco dużo o Uniksie, aby wyjaśnić, jak byś to zrobił. Poza tym potrzebowałbyś źródła zer i umieść je w suwaku, który czyta ze stdin lub coś takiego ...

Svish
źródło
Głos za odrzuceniem za zignorowanie rzeczywistego pytania, które wspomina o konkretnym pliku, który wyraźnie nie jest wynikiem skompresowania jednego dużego strumienia zer.
Michael Borgwardt
Nie, nadal będziesz ograniczony mocą obliczeniową. Najlepiej byłoby, gdybyś nie chciał uruchamiać gzip / zip, ponieważ będzie zużywał dużo procesora (lub przynajmniej O (n) n jest rozmiarem rozpakowanego pliku)
tonfa
@tonfa: Cóż, oczywiście będziesz ograniczony mocą obliczeniową. Mój rozum był taki, że możesz nie chcieć tworzyć exabajtów dużego pliku na swoim dysku, a następnie spakować go ...
Svish
2

Wszystkie algorytmy kompresji plików opierają się na entropii kompresowanych informacji. Teoretycznie możesz skompresować strumień zer lub jedynek i jeśli jest wystarczająco długi, kompresuje się bardzo dobrze.

To część teorii. Część praktyczna została już wskazana przez innych.

Calyth
źródło
2

Najnowsze (po 1995 r.) Algorytmy kompresji, takie jak bz2, lzma (7-zip) i rar, zapewniają spektakularną kompresję monotonnych plików, a pojedyncza warstwa kompresji wystarcza, aby zawinąć zbyt dużą zawartość do rozsądnego rozmiaru.

Innym podejściem mogłoby być utworzenie rzadkiego pliku o ekstremalnych rozmiarach (eksabajtach), a następnie skompresowanie go czymś przyziemnym, który rozumie rzadkie pliki (np. Tar), teraz, jeśli egzaminator przesyła plik strumieniowo, egzaminator będzie musiał odczytać wszystkie istniejące zera tylko w celu dopełnienia między rzeczywistą zawartością pliku, jeśli egzaminator zapisze go na dysku, jednak zajmie bardzo mało miejsca (przy założeniu dobrze zachowanego niezarchiwizowanego pliku i nowoczesnego systemu plików).

user340140
źródło
2

Spróbował tego. wyjściowy plik zip miał rozmiar 84 KB.

Kroki, które wykonałem do tej pory:

  1. utwórz plik .txt o rozmiarze 1,4 GB, pełen „0”
  2. skompresuj to.
  3. zmień nazwę .zip na .txt, a następnie zrób 16 kopii
  4. skompresuj to wszystko do pliku .zip,
  5. zmień nazwy plików .txt o zmienionych nazwach w pliku .zip ponownie na .zip
  6. powtórz kroki od 3 do 5 osiem razy.
  7. Cieszyć się :)

chociaż nie wiem, jak wyjaśnić część, w której kompresja pliku zip o zmienionej nazwie nadal kompresuje go do mniejszego rozmiaru, ale działa. Może po prostu brakuje mi terminów technicznych.

jaycroll
źródło
Nawiasem mówiąc, nie bój się, że będzie stale rozpakowywać wszystkie pliki zip w środku. Wyodrębnia tylko plik zip, który jest zagnieżdżony poniżej, a nie do samego dołu.
jaycroll
2

Sezon 3, odcinek 7 Doliny Krzemowej przywiódł mnie tutaj. Kroki do wygenerowania bomby zip byłyby.

  1. Utwórz fikcyjny plik z zerami (lub jedynkami, jeśli uważasz, że są małe) o rozmiarze (powiedzmy 1 GB).
  2. Skompresuj ten plik do pliku zip, powiedz 1.zip.
  3. Zrób n(powiedzmy 10) kopii tego pliku i dodaj te 10 plików do skompresowanego archiwum (powiedzmy 2.zip).
  4. Powtórz krok 3 kkilka razy.
  5. Dostaniesz bombę zip.

W przypadku implementacji Pythona sprawdź to .

Abdul Fatir
źródło
1

Nie wiem, czy ZIP używa kodowania Run Length Encoding, ale gdyby tak było, taki skompresowany plik zawierałby mały fragment danych i bardzo dużą wartość run-length. Wartość run-length określa, ile razy mały fragment danych jest powtarzany. Jeśli masz bardzo dużą wartość, wynikowe dane są proporcjonalnie duże.

Joe
źródło
2
ZIP używa kompresji Lempel-Ziv-Welch (lub zmodyfikowanej wersji), która skutecznie tokenizuje dane. Długie serie `` zestawów '' bajtów spowodują dobrą kompresję, dlatego GIF (który również wykorzystuje LZW) jest dobry dla grafiki, a JPEG (który wykorzystuje złożoną kompresję sinusoidalną) jest lepszy dla zdjęć, na których dane są znacznie bardziej losowe ”.
Lazarus