Wie macht man eine Zip-Bombe?

131

Diese Frage zu Zip-Bomben führte mich natürlich zur Wikipedia-Seite zum Thema. Der Artikel erwähnt ein Beispiel für eine 45,1-KB-Zip-Datei, die auf 1,3 Exabyte dekomprimiert wird.

Welche Prinzipien / Techniken würden verwendet, um eine solche Datei überhaupt zu erstellen? Ich möchte dies nicht wirklich tun, sondern mich mehr für eine vereinfachte Erklärung der Konzepte interessieren.

ps

Der Artikel erwähnt 9 Ebenen von Zip-Dateien, daher ist es nicht einfach, eine Reihe von Nullen zu komprimieren. Warum 9, warum 10 Dateien in jeder?

Kugelfisch
quelle
5
@ Michael Ihre Beschwerde ist nicht gültig. OP hat nicht nur gefragt, wie es funktioniert, nichts in dem veröffentlichten Artikel besagt, dass es ausdrücklich dazu dient, das Antivirenprogramm zu deaktivieren. Im Gegenteil, es scheint, dass der Kern des Artikels ein Angriff im DOS-Stil ist, bei dem nur vorübergehend erwähnt wird, dass Antiviren deaktiviert wurde.
San Jacinto
2
Der Punkt ist, dass sich das OP auf eine bestimmte Datei bezog, die aus verschachtelten Archiven besteht, nicht aus einer großen komprimierten Datei.
Michael Borgwardt
1
Ich denke, Michael hat Recht, er erklärt, wie man die in der "PS" beschriebene Datei erstellt, und alle anderen nicht. Das "PS" wurde jedoch als Bearbeitung hinzugefügt, sodass diese Antworten zum Zeitpunkt der Übergabe möglicherweise nicht offensichtlich falsch waren. Sie dachten nur, "eine solche Datei" bedeute "jede Datei, die auf 1,3 Exabyte dekomprimiert wird", wenn sich herausstellte, dass sie "eine Datei bedeuten sollte, die wie die in dem Artikel, auf den ich verlinke, beschriebene Struktur aufgebaut ist".
Steve Jessop
1
@onebyone Ich stimme vollkommen zu. Ich denke einfach nicht, dass eine Ablehnung unter solchen Umständen angemessen ist.
San Jacinto
4
Ich denke, es hängt davon ab, ob Sie eine Ablehnung als "dies ist nicht die beste Antwort auf die Frage" oder "Sie sind ein Dummkopf und nicht lebenswert" oder als Aufenthaltsort dazwischen betrachten. Persönlich nehme ich eine Ablehnung, um zu bedeuten, dass ich meine Antwort erneut lesen und prüfen sollte, ob offensichtlich etwas daran falsch ist, das ich beheben sollte. Aber dann bin ich jetzt ziemlich glücklich, nicht einverstanden zu sein und meine Antwort nicht zu ändern, wenn ich denke, dass meine Antwort etwas beiträgt. Und ich bin sowieso ziemlich unbesorgt über den gesamten Abstimmungsprozess, jetzt wo es klar ist, dass ich Jon Skeet nie fangen werde ;-)
Steve Jessop

Antworten:

92

Zitieren von der Wikipedia-Seite:

Ein Beispiel für eine Zip-Bombe ist die Datei 45.1.zip, die aus 45,1 Kilobyte komprimierten Daten besteht und neun Schichten verschachtelter Zip-Dateien in 10er-Sets enthält. Jedes Archiv der unteren Ebene enthält eine 1,30-Gigabyte-Datei für insgesamt 1,30 Exabyte unkomprimierter Daten .

Sie benötigen also nur eine einzige 1,3-GB-Datei voller Nullen, komprimieren diese in eine ZIP-Datei, erstellen 10 Kopien, packen diese in eine ZIP-Datei und wiederholen diesen Vorgang 9 Mal.

Auf diese Weise erhalten Sie eine Datei, die, wenn sie vollständig dekomprimiert ist, eine absurde Datenmenge erzeugt, ohne dass Sie mit dieser Menge beginnen müssen.

Darüber hinaus erschweren die verschachtelten Archive es Programmen wie Virenscannern (dem Hauptziel dieser "Bomben"), intelligent zu sein und sich zu weigern, "zu große" Archive zu entpacken, da bis zur letzten Ebene die Gesamtdatenmenge beträgt nicht so viel, Sie "sehen" nicht, wie groß die Dateien auf der niedrigsten Ebene sind, bis Sie diese Ebene erreicht haben, und jede einzelne Datei ist nicht "zu groß" - nur die große Anzahl ist problematisch.

Michael Borgwardt
quelle
2
Kann nicht sein ... Sobald Sie die Datei mit den Nullen unten komprimiert haben, wird die resultierende komprimierte Datei für die nächste Ebene nicht annähernd so komprimierbar sein.
Kugelfisch
16
Ah, aber auf jeder Ebene haben Sie zehn identische Dateien - die wiederum gut komprimiert werden. Obwohl ZIP die dateiübergreifende Redundanz nicht ausnutzt, weist ein Archiv mit zehn einzeln komprimierten identischen Dateien wahrscheinlich selbst eine Menge Redundanz auf, die von der nächsten Ebene ausgenutzt werden kann.
Michael Borgwardt
10
Es geht NICHT darum, die maximale Datenmenge aus der kleinstmöglichen Datei zu generieren. Es geht darum, die Versuche der Virenscanner zu verhindern, sich vor zu großen Archiven zu schützen.
Michael Borgwardt
2
Das ist nicht der Kern des Artikels auf Wikipedia. Es scheint einen Angriff im DOS-Stil voranzutreiben.
San Jacinto
2
Aber die Dateien werden nicht rekursiv extrahiert ... das Opfer sollte weiterhin die Sub-Zip-Dateien extrahieren, damit es funktioniert ... Jede Umgehung dafür.
Manoj
46

Erstellen Sie eine 1,3-Exabyte-Datei mit Nullen.

Klicken Sie mit der rechten Maustaste> An komprimierten (komprimierten) Ordner senden.

wefwfwefwe
quelle
22
Du hast den Sarkasmus "Smiley" vergessen.
Tvanfosson
1
Dies wäre bei den meisten Dateisystemen und Komprimierungsalgorithmen aufgrund von Dateigrößenbeschränkungen höchstwahrscheinlich nicht möglich. Wenn Sie jedoch Dateien im komprimierten Archiv verschachteln (und mehr verschachtelte Archive in das Archiv einfügen, wenn der Komprimierungsalgorithmus eine Gesamtgrößenbeschränkung aufweist), können Sie diese Grenzwerte umgehen.
Blixt
133
sollte eine 1,3-Exabyte-Datei von 1 machen. Sie sind viel dünner als 0er :)
Quinn Wilson
33
@quinn - deshalb ist das Komprimieren der (anfänglich dickeren) Nullen viel effektiver
wefwfwefwe
1
Dies gibt Ihnen eine> 1 GB Zip-Datei, es sei denn, ich irre mich
Chris S
36

Dies ist unter Linux mit dem folgenden Befehl einfach möglich:

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

Ersetzen Sie die Anzahl durch die Anzahl der KB, die Sie komprimieren möchten. Im obigen Beispiel wird eine 10-MB-Zip-Bombe erstellt (überhaupt keine große Bombe, aber sie zeigt den Vorgang).

Sie benötigen KEINEN Festplattenspeicher, um alle nicht komprimierten Daten zu speichern.

Thomi
quelle
8
Sie benötigen jedoch die Rechenleistung, um die unkomprimierten Daten zu komprimieren. Die Größe der unkomprimierten Daten beträgt immer noch O (n) .
Tonfa
2
Ja, wie alle anderen Antworten hier.
Thomi
6
Michael Borgwardts Antwort lautet O (log N) in der Größe der unkomprimierten Daten.
Steve Jessop
1
Jedenfalls ungefähr. Jede Wiederholung des Vorgangs "Entfernen Sie die Archivheader, duplizieren Sie den komprimierten Dateieintrag zehnmal, ersetzen Sie die Archivheader, komprimieren Sie" erhöht die Verschachtelung der Zip-Datei um 1, benötigt Zeit proportional zur Größe der komprimierten Daten aus dem vorherigen Schritt , multipliziert die Größe der unkomprimierten Daten mit 10, und wenn es die Größe der komprimierten Daten überhaupt erhöht, geschieht dies sicherlich nicht mit einem linearen Faktor.
Steve Jessop
3
Nur als Test zip ich -9 1,3 GB Nullen. Das Ergebnis ist eine 1,3 Millionen Datei. Ich habe dies 10 Mal dupliziert (ich konnte mich nicht mit den Zip-Headern herumschlagen, sodass das Ergebnis nicht als Zip-Bombe funktioniert, sondern das Prinzip veranschaulicht), um eine 13M-Datei zu erhalten, die mit Zip -9 auf 34381 Bytes komprimiert wird. Der Duplizierungsschritt verkleinert die Datei also tatsächlich, da deflate nur Token mit einer bestimmten maximalen Größe unterstützt. Der nächste Schritt führt zu 18453, dann 19012, 19312, 19743, 20120, 20531, 20870.
Steve Jessop
10

Unten ist für Windows:

Nach dem Security Focus Proof of Concept (NSFW!) Handelt es sich um eine ZIP-Datei mit 16 Ordnern mit jeweils 16 Ordnern, die so weitergeht (42 ist der Name der Zip-Datei):

\ 42 \ lib 0 \ Buch 0 \ Kapitel 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ Buch F \ Kapitel F \ doc F \ 0.dll

Ich bin wahrscheinlich falsch mit dieser Zahl, aber sie erzeugt 4 ^ 16 (4.294.967.296) Verzeichnisse. Da jedes Verzeichnis einen Zuordnungsraum von N Bytes benötigt, ist es sehr groß. Die DLL-Datei am Ende ist 0 Bytes.

Das Entpacken des ersten Verzeichnisses allein \42\lib 0\book 0\chapter 0\doc 0\0.dllführt zu 4 GB Zuordnungsspeicherplatz.

Chris S.
quelle
27
Ich habe nur angenommen, dass es sich um nackte Damen handelt, die Sicherheitsforschung betreiben.
James McMahon
3
Der Reißverschluss war nsfw. Ein großer panischer roter Alarm wird ausgelöst und ein Käfig wird von der Decke um Ihren Schreibtisch fallen
Chris S
4
Wenn jeder Treffer in einer Virendatei zu einem Interview mit der Personalabteilung führt, benötigen Sie entweder keinen Virenscanner oder Ihre Personalabteilung. Einer von ihnen trägt nicht zum Geschäft bei ;-)
Steve Jessop
2
Könnte auch NSFW sein, da ein Netzwerkvirusscanner dies möglicherweise überprüfen und extrahieren möchte.
Michael Stum
5
Der Virenscanner sollte ihn nur als verdächtig markieren (was dazu führen kann, dass er sicher blockiert wird oder dass Sie unsicher gemeldet werden, wenn Sie versuchen, Viren zu installieren). Wenn die Bombe tatsächlich explodiert, hat Ihre IT-Abteilung etwas Wertvolles gelernt - sie benötigt einen besseren Virenscanner.
Steve Jessop
8

Ernsthafte Antwort:

(Im Grunde genommen) Die Komprimierung basiert auf dem Erkennen sich wiederholender Muster, sodass die Zip-Datei Daten enthält, die so etwas wie darstellen

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

Sehr kurze Zip-Datei, aber riesig, wenn Sie sie erweitern.

wefwfwefwe
quelle
1
Das könnte wirklich noch weiter komprimiert werden: 0x1 (0x35) (das heißt, die zweite 0 wird 35 Mal wiederholt, damit sie zu Ihrem Kommentar erweitert wird)
Michael
5

Um eine in einer praktischen Umgebung zu erstellen (dh ohne eine 1,3-Exabyte-Datei auf Ihrer riesigen Festplatte zu erstellen), müssten Sie wahrscheinlich das Dateiformat auf Binärebene lernen und etwas schreiben, das übersetzt, wie Ihre gewünschte Datei aussehen würde, post- Kompression.

Andy_Vulhop
quelle
5

Der Artikel erwähnt 9 Ebenen von Zip-Dateien, daher ist es nicht einfach, eine Reihe von Nullen zu komprimieren. Warum 9, warum 10 Dateien in jeder?

Zunächst einmal sagt der Wikipedia-Artikel derzeit 5 Ebenen mit jeweils 16 Dateien. Ich bin mir nicht sicher, woher die Diskrepanz kommt, aber es ist nicht so relevant. Die eigentliche Frage ist, warum überhaupt die Verschachtelung verwendet wird.

DEFLATE, die einzige allgemein unterstützte Komprimierungsmethode für Zip-Dateien *, hat ein maximales Komprimierungsverhältnis von 1032. Dies kann asymptotisch für jede sich wiederholende Sequenz von 1-3 Bytes erreicht werden. Unabhängig davon, was Sie mit einer Zip-Datei tun, solange sie nur DEFLATE verwendet, beträgt die entpackte Größe höchstens das 1032-fache der Größe der ursprünglichen Zip-Datei.

Daher ist es notwendig, verschachtelte Zip-Dateien zu verwenden, um wirklich unverschämte Komprimierungsverhältnisse zu erzielen. Wenn Sie zwei Komprimierungsschichten haben, beträgt das maximale Verhältnis 1032 ^ 2 = 1065024. Für 3 ist es 1099104768 und so weiter. Für die 5 in 42.zip verwendeten Ebenen beträgt das theoretische maximale Komprimierungsverhältnis 1170572956434432. Wie Sie sehen können, ist das tatsächliche 42.zip weit von dieser Stufe entfernt. Ein Teil davon ist der Overhead des Zip-Formats, und ein Teil davon ist, dass es ihnen einfach egal war.

Wenn ich raten müsste, würde ich sagen, dass 42.zip gebildet wurde, indem einfach eine große leere Datei erstellt und wiederholt gezippt und kopiert wurde. Es wird nicht versucht, die Grenzen des Formats zu überschreiten oder die Komprimierung zu maximieren oder so - sie haben nur willkürlich 16 Kopien pro Ebene ausgewählt. Es ging darum, ohne großen Aufwand eine große Nutzlast zu erzeugen.

Hinweis: Andere Komprimierungsformate wie bzip2 bieten viel, viel, viel größere maximale Komprimierungsverhältnisse. Die meisten Zip-Parser akzeptieren sie jedoch nicht.

PS Es ist möglich, eine Zip-Datei zu erstellen, die in eine Kopie von sich selbst (eine Quine) entpackt wird. Sie können auch eine erstellen, die in mehrere Kopien von sich selbst entpackt wird. Wenn Sie eine Datei für immer rekursiv entpacken, ist die maximal mögliche Größe daher unendlich. Die einzige Einschränkung besteht darin, dass sie bei jeder Iteration um höchstens 1032 erhöht werden kann.

PPS In der Abbildung 1032 wird davon ausgegangen, dass die Dateidaten in der Zip-Datei nicht zusammenhängend sind. Eine Besonderheit des Zip-Dateiformats besteht darin, dass es ein zentrales Verzeichnis hat, in dem die Dateien im Archiv aufgelistet und zu den Dateidaten versetzt werden. Wenn Sie mehrere Dateieinträge erstellen, die auf dieselben Daten verweisen, können Sie auch ohne Verschachtelung viel höhere Komprimierungsraten erzielen. Eine solche Zip-Datei wird jedoch wahrscheinlich von Parsern abgelehnt.

Antimon
quelle
4

Eine gute Möglichkeit, eine Zipbomb (oder Gzbomb) zu erstellen, besteht darin, das Binärformat zu kennen, auf das Sie abzielen. Selbst wenn Sie eine Streaming-Datei verwenden (z. B. mit /dev/zero), sind Sie dennoch durch die zum Komprimieren des Streams erforderliche Rechenleistung eingeschränkt.

Ein schönes Beispiel für eine GZIP-Bombe: http://selenic.com/googolplex.gz57 (nach mehreren Komprimierungsstufen ist eine Nachricht in die Datei eingebettet, die zu riesigen Dateien führt.)

Viel Spaß beim Finden dieser Nachricht :)

Tonfa
quelle
2

Vielleicht könnten Sie unter Unix eine bestimmte Anzahl von Nullen direkt in ein Zip-Programm oder so weiterleiten? Ich weiß nicht genug über Unix, um zu erklären, wie du das machen würdest. Ansonsten würden Sie eine Quelle von Nullen benötigen und diese in einen Reißverschluss leiten, der von stdin oder so etwas liest ...

Svish
quelle
Abgestimmt wegen Missachtung der eigentlichen Frage, in der eine bestimmte Datei erwähnt wird, die explizit nicht das Ergebnis des Zippens eines großen Stroms von Nullen ist.
Michael Borgwardt
Nein, Sie werden immer noch durch die Rechenleistung eingeschränkt sein. Idealerweise möchten Sie gzip / zip nicht ausführen, da es viel CPU
verbraucht
@tonfa: Nun, natürlich werden Sie durch die Rechenleistung eingeschränkt. Meine Argumentation war, dass Sie möglicherweise keine exabyte große Datei auf Ihrer Disc erstellen und diese dann
komprimieren möchten
2

Alle Dateikomprimierungsalgorithmen basieren auf der Entropie der zu komprimierenden Informationen. Theoretisch können Sie einen Stream mit Nullen oder Einsen komprimieren, und wenn er lang genug ist, wird er sehr gut komprimiert.

Das ist der theoretische Teil. Auf den praktischen Teil wurde bereits von anderen hingewiesen.

Calyth
quelle
2

Neuere (nach 1995) Komprimierungsalgorithmen wie bz2, lzma (7-zip) und rar ermöglichen eine spektakuläre Komprimierung monotoner Dateien, und eine einzige Komprimierungsschicht reicht aus, um übergroße Inhalte auf eine überschaubare Größe zu bringen.

Ein anderer Ansatz könnte darin bestehen, eine spärliche Datei von extremer Größe (Exabyte) zu erstellen und sie dann mit etwas Alltäglichem zu komprimieren, das spärliche Dateien (z. B. Teer) versteht. Wenn der Prüfer die Datei jetzt streamt, muss der Prüfer alle vorhandenen Nullen überlesen Nur um zwischen dem eigentlichen Inhalt der Datei zu wechseln, wenn der Prüfer sie auf die Festplatte schreibt, wird jedoch nur sehr wenig Speicherplatz verwendet (vorausgesetzt, ein gut erzogener Unarchiver und ein modernes Dateisystem).

user340140
quelle
2

Ich habe es versucht. Die Größe der Ausgabe-Zip-Datei war eine kleine 84-KB-Datei.

Schritte, die ich bisher gemacht habe:

  1. Erstellen Sie eine 1,4-GB-TXT-Datei mit '0'
  2. komprimiere es.
  3. Benennen Sie die ZIP-Datei in TXT um und erstellen Sie 16 Kopien
  4. alles in eine ZIP-Datei komprimieren,
  5. Benennen Sie die umbenannten TXT-Dateien in der ZIP-Datei erneut in ZIP um
  6. Wiederholen Sie die Schritte 3 bis 5 achtmal.
  7. Genießen :)

Ich weiß zwar nicht, wie ich den Teil erklären soll, in dem die Komprimierung der umbenannten Zip-Datei sie immer noch auf eine kleinere Größe komprimiert, aber es funktioniert. Vielleicht fehlen mir nur die Fachbegriffe.

Jaycroll
quelle
Übrigens, haben Sie keine Angst, dass alle darin enthaltenen Zip-Dateien kontinuierlich extrahiert werden. Es wird nur die darunter verschachtelte Zip-Datei extrahiert und nicht ganz nach unten.
Jaycroll
2

Silicon Valley Staffel 3 Episode 7 hat mich hierher gebracht. Die Schritte zur Erzeugung einer Reißverschlussbombe wären.

  1. Erstellen Sie eine Dummy-Datei mit Nullen (oder Einsen, wenn Sie glauben, dass sie dünn sind) mit einer Größe (z. B. 1 GB).
  2. Komprimieren Sie diese Datei in eine Zip-Datei 1.zip.
  3. Erstellen Sie n(sagen wir 10) Kopien dieser Datei und fügen Sie diese 10 Dateien einem komprimierten Archiv hinzu (sagen wir 2.zip).
  4. Wiederholen Sie Schritt 3 kmehrmals.
  5. Du bekommst eine Reißverschlussbombe.

Überprüfen Sie dies für eine Python-Implementierung .

Abdul Fatir
quelle
1

Ich weiß nicht, ob ZIP Run Length Encoding verwendet, aber wenn dies der Fall wäre, würde eine solche komprimierte Datei ein kleines Datenelement und einen sehr großen Wert für die Lauflänge enthalten. Der Lauflängenwert würde angeben, wie oft das kleine Datenelement wiederholt wird. Wenn Sie einen sehr großen Wert haben, sind die resultierenden Daten proportional groß.

Joe
quelle
2
ZIP verwendet die Lempel-Ziv-Welch-Komprimierung (oder eine modifizierte Version von), mit der die Daten effektiv tokenisiert werden. Lange Durchläufe von Bytesätzen führen zu einer guten Komprimierung. Daher ist GIF (das auch LZW verwendet) gut für Grafiken und JPEG (das eine komplexe Sinuswellenkomprimierung verwendet) besser für Fotos, bei denen die Daten viel zufälliger sind '.
Lazarus