どのようにしてZip爆弾を作成しますか?


131

zip爆弾に関するこの質問は、当然、このトピックに関するウィキペディアのページへと私を導きました。この記事では、1.3エクサバイトに解凍される45.1 kbのzipファイルの例について述べています。

そもそもそのようなファイルを作成するために使用される原則/テクニックは何ですか?実際にこれを実行するのではなく、関連する概念の簡略化された「方法-動作」説明に興味があります。

PS

この記事では9層のzipファイルについて言及しているため、一連のゼロを圧縮するという単純なケースではありません。なぜ9、なぜそれぞれ10個のファイルなのか?


5
@マイケルあなたの苦情は有効ではありません。OPはそれがどのように機能するかを尋ねただけでなく、投稿された記事には、ウイルス対策を無効にする明確な目的のためであるとは書かれていません。まったく反対に、この記事の主旨はDOSスタイルの攻撃であり、ウイルス対策の無効化についての言及だけです。
サンジャシント

2
ポイントは、OPが1つの巨大な圧縮ファイルではなく、ネストされたアーカイブで構成される特定のファイルを参照していたことです。
マイケルボルグワート

1
マイケルの言う通りだと思います。彼は「PS」で説明されているファイルの作成方法を説明していますが、他の人はそうではありません。ただし、「PS」は編集として追加されたので、それらの回答は、与えられた時点では明らかに間違っていなかった可能性があります。彼らは、「そのようなファイル」が「1.3エクサバイトに解凍されるすべてのファイル」を意味すると思っただけで、「リンク先の記事で説明されているような構造のファイル」を意味することがわかった。
スティーブジェソップ

1
@onebyone完全に同意します。そのような状況では、反対票は適切だとは思いません。
サンジャシント

4
反対票を「これは質問への最良の答えではない」、または「あなたはばかで生きる価値がない」という意味であると考えるか、その間の行方を考えるかによって異なります。個人的には、私は反対票を投じて、自分の回答を再読して、明らかに修正すべき問題があるかどうかを確認する必要があることを意味します。しかし、私の答えが何かに貢献していると思うなら、私の意見に同意せず、私の答えを変更しないことは今やかなり満足しています。とにかく、私はジョンスキートを絶対に捕まえられないことがはっきりしているので、投票プロセス全体についてかなり気になりませんでした;-)
スティーブジェソップ

回答:


92

ウィキペディアのページからの引用:

Zip爆弾の1つの例は、45.1キロバイトの圧縮データであるファイル45.1.zipで、10組のネストされたzipファイルの9つのレイヤーが含まれ、各最下層のアーカイブには1.30ギガバイトのファイルが含まれ、合計1.30エクサバイトの非圧縮データが含まれます。 。

したがって、必要なのは、ゼロが満載された単一の1.3GBファイル1つで、ZIPファイルに圧縮し、10コピーを作成し、ZIPファイルにパックして、このプロセスを9回繰り返します。

このようにして、完全に解凍すると不合理な量のデータを生成するファイルを取得できますが、その量で開始する必要はありません。

さらに、ネストされたアーカイブにより、ウイルススキャナー(これらの「爆弾」の主なターゲット)などのプログラムがスマートになり、「大きすぎる」アーカイブの解凍を拒否するようになります。これは、最終レベルまでのデータの総量がそれほどではありませんが、そのレベルに到達するまでは、最下位レベルのファイルの大きさを「確認」することはなく、個々のファイルが「大きすぎる」ことはありません。問題になるのは膨大な数だけです。


2
できません...ゼロのファイルを下部で圧縮すると、結果の圧縮ファイルは次のレイヤーでは圧縮率が低くなります。
フグ

16
ああ、でも各レベルで、同じファイルが10 個あります-これもまたうまく圧縮されます。ZIPはファイル間の冗長性を活用していませんが、個別に圧縮された10個の同一ファイルを含むアーカイブは、次のレイヤーが活用するために多くの冗長性を持っています。
マイケルボルグワート

10
重要なのは、可能な限り最小のファイルから最大量のデータを生成する方法ではありません。重要なのは、大きすぎるアーカイブから保護するウイルススキャナーの試みを無効にすることです。
マイケルボルグワート

2
それはウィキペディアの記事の主旨ではありません。DOS風の攻撃を仕掛けているようです。
サンジャシント

2
しかし、ファイルは再帰的に抽出されません...被害者はそれを機能させるためにサブzipファイルを抽出し続ける必要があります...
Manoj

46

ゼロの1.3エクサバイトのファイルを作成します。

右クリック> [圧縮(zip形式)フォルダーに送信]。


22
皮肉の「スマイリー」を忘れた。
tvanfosson 2009

1
ほとんどのファイルシステムと圧縮アルゴリズムでは、ファイルサイズの制限により、これは不可能である可能性が高いです。ただし、圧縮されたアーカイブにファイルをネストすると(圧縮アルゴリズムに合計サイズの制限がある場合は、アーカイブにネストされたアーカイブを追加すると)、これらの制限を回避できます。
Blixt 2009

133
1の1.3エクサバイトのファイルを作成する必要があります。彼らは0よりもはるかに細いです:)
Quinn Wilson

33
@quinn-そのため、(最初は太い)ゼロを圧縮する方がはるかに効果的です
wefwfwefwe

1
これにより、私が誤っていない限り、1 GBを超えるzipファイルが得られます
Chris S

36

これは、Linuxで次のコマンドを使用して簡単に実行できます。

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

countを、圧縮するKBの数に置き換えます。上記の例では、10MiBのzip爆弾を作成します(爆弾の多くはありませんが、プロセスを示しています)。

すべての非圧縮データを保存するためにハードディスク領域は必要ありません。


8
ただし、非圧縮データを圧縮するには計算能力が必要です。それでも、非圧縮データのサイズはO(n)です。
tonfa

2
はい、他のすべての答えもここにあります。
Thomi

6
Michael Borgwardtの答えは、非圧縮データのサイズがO(log N)です。
スティーブジェソップ

1
とにかく、だいたい。プロセスを繰り返すたびに、「アーカイブヘッダーを取り除き、圧縮ファイルエントリを10回複製し、アーカイブヘッダーを置き換え、圧縮する」と、zipネストのレベルが1ずつ増加し、前のステップの圧縮データのサイズに比例して時間がかかります。 、非圧縮データのサイズを10倍します。圧縮データのサイズが少しでも大きくなる場合は、線形係数のようなことはありません。
スティーブジェソップ

3
したがって、テストとして、-9の1.3 GBのゼロを圧縮します。結果は1.3Mファイルです。私はこれを10回複製し(zipヘッダーをいじるのに煩わされることはないので、結果はzip爆弾としては機能しませんが、原理を示しています)、zip -9から34381バイトで圧縮する13Mファイルを作成しました。したがって、deflateは特定の最大サイズのトークンしかサポートしないため、複製ステップでは実際にファイルが小さくなります。18453の次のステップの結果、その後、19012、19312、19743、20120、20531、20870.
スティーブ・ジェソップ

10

以下はWindows用です。

コンセプトのセキュリティフォーカス証明(!NSFW)、それは(42 zipファイル名である)ので、同じようになっており、16個のフォルダ、16個のフォルダとそれぞれのZIPファイルです:

\ 42 \ lib 0 \ book 0 \ chapter 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ book F \ chapter F \ doc F \ 0.dll

この図はおそらく間違っていますが、4 ^ 16(4,294,967,296)ディレクトリが生成されます。各ディレクトリにはNバイトの割り当てスペースが必要なので、巨大になります。末尾のdllファイルは0バイトです。

最初のディレクトリのみを解凍すると\42\lib 0\book 0\chapter 0\doc 0\0.dll、4GBの割り当てスペースが生じます。


27
私は彼らがセキュリティ研究をしている裸の女性であると思いました。
ジェームズマクマホン

3
zipはnsfwでした。大きなパニックの赤いアラームが鳴り、ケージがあなたの机の周りの天井から落ちる
Chris S

4
ウイルスファイルにヒットするたびに人事部へのインタビューが行われる場合は、ウイルススキャナーが不要か、人事部が不要です。そのうちの1人はビジネスに貢献していません;-)
スティーブジェソップ

2
ネットワークウイルススキャナーがそれをチェックし、それを抽出するために、NSFWである可能性もあります。
Michael Stum

5
ウイルススキャナーは、それを疑わしいとマークするだけです(安全にブロックされたり、ウイルスのインストールを試みたと報告されたりする可能性があります)。爆弾が実際に爆発した場合、IT部門は貴重なことを学びました。より優れたウイルススキャナーが必要です。
スティーブジェソップ

8

深刻な答え:

(基本的に)圧縮は繰り返しパターンのスポッティングに依存するため、zipファイルには次のようなデータが含まれます。

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

非常に短いzipファイルですが、展開すると巨大になります。


1
それをさらに圧縮することもできます:0x1(0x35)(つまり、2番目の0は35回繰り返されるため、コメントに展開されます)
Michael

5

実用的な設定でファイルを作成するには(つまり、巨大なハードドライブに1.3エクサバイトのファイルを作成せずに)、バイナリレベルでファイル形式を学習し、目的のファイルがどのように見えるかに変換するものをポストする必要があります。圧縮。


5

この記事では9層のzipファイルについて言及しているため、一連のゼロを圧縮するという単純なケースではありません。なぜ9、なぜそれぞれ10個のファイルなのか?

まず、ウィキペディアの記事では、現在5つのレイヤーにそれぞれ16個のファイルがあると述べています。不一致がどこから来ているのかはわかりませんが、それだけではありません。本当の問題は、そもそもなぜネストを使うのかということです。

DEFLATEは、zipファイル*で唯一サポートされている圧縮方法であり、最大圧縮率は1032です。これは、1〜3バイトの繰り返しシーケンスに対して漸近的に実現できます。zipファイルに対して何をしても、DEFLATEのみを使用している限り、解凍されたサイズは元のzipファイルのサイズの最大1032倍になります。

したがって、本当に法外な圧縮率を実現するには、ネストされたzipファイルを使用する必要があります。2層の圧縮がある場合、最大比率は1032 ^ 2 = 1065024になります。3の場合、1099104768となります。42.zipで使用される5つのレイヤーの場合、理論的な最大圧縮率は1170572956434432です。ご覧のとおり、実際の42.zipはそのレベルとはかけ離れています。その一部はzip形式のオーバーヘッドであり、一部は気にしなかっただけです。

推測しなければならないのですが、42.zipは、大きな空のファイルを作成し、それを繰り返し圧縮してコピーすることで作成されたと言えます。フォーマットの制限を押し上げたり、圧縮などを最大化したりする試みはありません。レイヤーごとに16個のコピーを任意に選択しただけです。ポイントは、大きな労力をかけずに大きなペイロードを作成することでした。

注:bzip2などの他の圧縮形式では、最大圧縮率がはるかに高くなります。ただし、ほとんどのzipパーサーはそれらを受け入れません。

PSそれ自体のコピーに解凍するzipファイルを作成することが可能です(クイン)。自分自身の複数のコピーに解凍するものを作成することもできます。したがって、ファイルを再帰的に永久に解凍すると、可能な最大サイズは無限になります。唯一の制限は、反復ごとに最大で1032増加できることです。

PPS 1032の図では、zip内のファイルデータがばらばらであると想定しています。zipファイル形式の特徴の1つは、アーカイブ内のファイルとファイルデータへのオフセットをリストする中央ディレクトリがあることです。同じデータを指す複数のファイルエントリを作成すると、ネストを行わなくてもはるかに高い圧縮率を実現できますが、そのようなzipファイルはパーサーによって拒否される可能性があります。


4

zipbomb(またはgzbomb)を作成する良い方法は、対象のバイナリ形式を知ることです。それ以外の場合は、ストリーミングファイルを使用しても(たとえばを使用して/dev/zero)、ストリームの圧縮に必要な計算能力に制限されます。

gzip爆弾の良い例:http : //selenic.com/googolplex.gz57(いくつかのレベルの圧縮の後にファイルに埋め込まれたメッセージがあり、結果として巨大なファイルになります)

そのメッセージを見つけて楽しんでください:)


2

おそらく、UNIXでは、特定の量のゼロを直接zipプログラムなどにパイプできますか?あなたがそれをどのように行うかを説明するほどUNIXについて十分に知りません。それ以外には、ゼロのソースが必要であり、それらを標準入力または何かから読み取るジッパーにパイプします...


ゼロの1つの大きなストリームを圧縮した結果ではない特定のファイルについて言及している実際の質問を無視したことに反対票を投じました。
マイケルボルグワート

いいえ、まだ計算能力に制限されます。CPUを大量に使用するため(または少なくともO(n)nは圧縮解除されたファイルのサイズです)、理想的にはgzip / zipを実行したくない
tonfa

@tonfa:ええ、もちろん、計算能力によって制限されます。私の考えは、ディスクにエクサバイトの大きなファイルを作成してからそれを圧縮したくないかもしれないということでした...
Svish

2

すべてのファイル圧縮アルゴリズムは、圧縮される情報のエントロピーに依存しています。理論的には、0または1のストリームを圧縮できます。十分に長い場合は、非常によく圧縮されます。

それが理論の部分です。実用的な部分はすでに他の人から指摘されています。


2

bz2、lzma(7-zip)、rarなどの最近(1995年以降)の圧縮アルゴリズムは、単調なファイルの壮大な圧縮を提供します。圧縮の単一層で、サイズが大きいコンテンツを管理可能なサイズにラップできます。

別のアプローチは、極端なサイズ(エクサバイト)のスパースファイルを作成し、スパースファイル(tarなど)を理解するありふれたファイルで圧縮することです。これにより、審査官がファイルをストリーミングする場合、審査官は存在するすべてのゼロを超えて読み取る必要があります。ファイルの実際のコンテンツの間を埋めるためだけに使用します。ただし、審査官がディスクに書き込んだ場合、使用されるスペースはごくわずかです(正常に動作するアンアーカイバと最新のファイルシステムを想定)。


2

それを試してみました。出力zipファイルのサイズは、84 KBの小さなファイルでした。

これまでに行った手順:

  1. 「0」でいっぱいの1.4 GBの.txtファイルを作成する
  2. それを圧縮します。
  3. .zipの名前を.txtに変更し、16個のコピーを作成します
  4. すべてを.zipファイルに圧縮し、
  5. .zipファイル内の名前を変更した.txtファイルの名前を.zipに再度変更します
  6. 手順3〜5を8回繰り返します。
  7. 楽しい :)

名前を変更したzipファイルの圧縮で、まだ小さいサイズに圧縮される部分を説明する方法はわかりませんが、動作します。多分私は専門用語が足りないだけです。


ちなみに、中のすべてのzipファイルを継続的に抽出することを恐れないでください。その下にネストされているzipファイルのみを抽出し、一番下までは抽出しません。
jaycroll

2

シリコンバレーシーズン3エピソード7が私をここに連れてきました。zip爆弾を生成する手順は次のようになります。

  1. サイズがゼロ(1 GBなど)のゼロ(または細い場合は1)のダミーファイルを作成します。
  2. このファイルをzipファイルに圧縮します1.zip
  3. 作成しn、このファイルのコピー(10と言う)と、圧縮されたアーカイブ(と言ってこれらの10個のファイルを追加します2.zip)。
  4. 手順3を繰り返しkます。
  5. あなたはzip爆弾を取得します。

Pythonの実装については、こちらを確認してください。


1

ZIPでランレングスエンコーディングを使用するかどうかはわかりませんが、使用する場合、そのような圧縮ファイルには小さなデータと非常に大きなランレングス値が含まれます。ランレングス値は、小さなデータが何回繰り返されるかを指定します。非常に大きな値がある場合、結果のデータは比例して大きくなります。


2
ZIPは、Lempel-Ziv-Welch(またはその修正バージョン)圧縮を使用して、データを効果的にトークン化します。バイトの「セット」を長時間実行すると圧縮率が高くなるため、GIF(LZWも使用)がグラフィックスに適しており、JPEG(複雑な正弦波圧縮を使用)がデータのランダム性が高い写真に適している理由'。
Lazarus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.