超危険ファイル「ZIP爆弾」の衝撃!その仕組みと危険性を徹底解説
- 2024-12-15
超危険ファイル「ZIP爆弾」の衝撃!その仕組みと危険性を徹底解説
はじめに:パスワードを使い回すのはもうやめよう!そしてZIP爆弾とは?
皆さん、パスワード管理はきちんとできていますか? パスワードを使い回していると、セキュリティリスクが高まるのは周知の事実です。しかし、パスワードの数が増えすぎて管理が大変…という方も多いのではないでしょうか。 そんな中、今回取り上げるのは、パスワード問題とはまた違った、非常に危険なファイル「ZIP爆弾」です。
「爆弾」とつく時点で危険な予感がプンプンしますが、一体どんなものなのでしょうか? 本記事では、ZIP爆弾の仕組み、危険性、そして実際に実験した結果を分かりやすく解説していきます。 読み終わる頃には、ZIPファイルに対する見方が変わるかもしれません!
圧縮と展開:ZIP爆弾を理解する第一歩
ZIP爆弾を説明する前に、まずは圧縮と展開の仕組みについて理解する必要があります。
皆さん、ファイルを圧縮したことはありますか? 「ZIPファイル」など、圧縮ファイルは日常的に使われていますよね。しかし、ビジネスで使わない人にとって、圧縮の仕組みは馴染みが薄いかもしれません。
そう思われがちですが、実は圧縮は身近な存在です。圧縮はZIPファイルだけでなく、JPEGやPNGなどの画像フォーマット、MP4やAVIなどの動画ファイルでも利用されています。 普段何気なく使っているファイルにも、圧縮技術が隠されていたなんて驚きですよね!
圧縮を使わないと不便なのでしょうか? 圧縮しなくても済む場合もありますが、特に動画ファイルの場合、圧縮しないとファイルサイズが巨大になってしまいます。
一体どれくらい大きくなるのでしょうか? 例えば、過去に作成したIntel事件の動画を例に見てみましょう。アップロードした動画のファイルサイズは約1.165GBでした。しかし、無圧縮状態だと…なんと約1.9TBにもなります! 単位が違いますね。圧縮前と比較すると約1600倍の差があります。
このようにファイルサイズが小さくなることで、データの保存容量を削減できる、回線輻輳を解消できるなど、圧縮技術は大きな意味を持ちます。画像や音声ファイルでも、数十倍から数百倍の圧縮率が実現します。
では、圧縮の逆は何だと思いますか? 「展開」または「解凍」です。圧縮で小さくなったファイルを元に戻し、データを復元する過程のことを指します。動画、画像、音声では「レコード」とも呼ばれます。圧縮されたままだとプログラムが読み取れないため、展開して読み取れる形式にする必要があるのです。
ちなみに、圧縮の対義語として「解凍」以外にも「解凍」という言葉が未だに使われています。これは古い呼び方の名残りと言われています。
「圧縮」と「解凍」は自然な対義語ですが、「圧縮」と「解凍」という組み合わせは少し違和感がありますよね。パソコン通信が主流だった1990年代頃に広まったと言われています。当初は圧縮に対応する言葉として「統合」という言葉もありましたが、あまり使われず「圧縮」が主流になったため、現在のようなやや不自然な対義語の組み合わせが生まれたのです。
「統合」と「解凍」なら、確かに自然な対応関係ですね。ちなみに、圧縮の反対語は「伸張」もしくは「展開」です。現在のWindowsでは「展開」を採用しているため、本記事では以降「展開」として説明を進めます。
ZIP爆弾の正体:小さなファイルが巨大化する脅威
さて、今回のテーマはZIP爆丹です。一体どうやってZIPファイルが爆弾になるのでしょうか?
汎用圧縮ファイルとして広く用いられているZIP形式ですが、ファイルの状態によっては、展開時に爆弾のような挙動をすることがあります。
これを理解するには、圧縮の仕組みについてさらに深く理解する必要があります。
圧縮の仕組み:なぜファイルサイズは変わるのか?
ファイルの圧縮の例として、例えばこのような数字のデータを考えてみましょう。
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
この100文字もあるデータを、どうやって容量を小さくできると思いますか?
同じ数字が沢山並んでいるので、それをまとめれば容量が小さくなりそう…ですよね。実際、同じデータをまとめる方法で上記のデータを圧縮してみると、なんと78文字に減ります。更に、一文字や二文字はそのままにすると、最終的に67文字まで減らせました。データ量は元の2/3になりました。
小さな圧縮アルゴリズムでは、もっと高度な技術を用いて圧縮率を高めています。圧縮アルゴリズムは進化を続けており、例えば映像フォーマットの場合、20年前はMPEG-2が主流でしたが、その後H.264やH.265、WMVやVP9、そして最近はH.266やAV1なども登場し、同じビットレートでもより高画質になっています。最近では4Kや8Kといった超高解像度も登場し、圧縮前のデータ量が膨大になる傾向があるため、より高度な圧縮技術が必要となるわけです。
映像に限らず、圧縮アルゴリズムは進化を続けており、例えば画像のJPEGの改良版があったり、汎用圧縮フォーマットでも7-Zipなどが開発されています。
ところで、同じ圧縮アルゴリズムを使っても、元のサイズが同じでも、ファイルによって圧縮率が異なるのはなぜなのでしょうか? 例えば画像ファイルでも、JPEGにすると容量が激減するものもあれば、全然減らないものもあります。動画も同様で、ある動画は高効率コーデックで小さくなるのに、別の動画は全然小さくなってないということが起こります。
なぜこのようなことが起こるのでしょうか? 実は、ファイルの内容によって、圧縮されやすいものとそうでないものがあるのです。
例えば、数字の「0」が1億個並んだファイルがあります。これをそのまま保存すれば1億バイト、つまり100MBになります。しかし、圧縮してももう少し効率よく保存できるとは思いませんか?
これまでの話を考えると、「0」を馬鹿正直に1億個並べるよりも、「0 × 1億」のように表した方が明らかにファイルサイズが小さくなるはずです。実際、この場合だとわずかな11バイトまで圧縮され、なんと9999万分の1に圧縮されました。
じゃあ、1兆個だったらどうなる? 「0が1兆個ある」と書けばいいから、わずかな15バイトで表されてしまいます。なんと6666億7000万分の1になりました。もしかしてこれ、桁数が増えたら指数関数的に増えないか?
はい、今のは極端な例でしたが、同じ文字が並んでいるだけとか、同じパターンの繰り返しとか、内容がシンプルなファイルほど圧縮率が大きくなる傾向があります。逆にランダムな数字の列とか、既に圧縮されているようなものだとあまり圧縮されないわけですね。
別の分野になりますが、例えば数学の累乗なんかは掛け算の繰り返しを省略表記して大きな数を表しているし、数学における圧縮といったところでしょうか。
実は、この圧縮されやすさが、今回のテーマであるZIP爆弾につながっています。
ZIP爆弾の危険性:PCの処理速度低下、HDD/SSDの寿命短縮
ZIP爆弾の危険性として、まず、生成ファイルが巨大であることによるPCの処理速度の低下、HDDやSSDの寿命短縮などが挙げられます。処理が続いてPCが重くなり、書き込み量が増えてストレージにも悪いというわけですね。
実際にZIP爆弾を展開してみた!
ということで、実際にZIP爆弾を展開してみました。
まずは、ZIP爆弾をダウンロードします。
ダウンロードできるの?
あ、「BetterZipBomb」というサイトで配布されていて、そこで複数のZIP爆弾が配布されています。
ファイルによって違うのか?
それぞれ展開後の容量が異なっており、一番上は比較的安全な5.5GBですが、下の2つは大変危険です。ペタバイトなんて単位、そうそう見ないぞ。今回は上の2つを試してみます。
ダウンロードしたファイルを見てみます。1つ目のファイルは42KBとなっており、公称値通りとなっています。圧縮後は小さいファイルだけれどな。
さて、このファイルを展開してみましょう。Windows標準の機能で展開します。
展開が始まると、いつも通り進みます。特に変るところはない。
展開が終了し、ファイルが生成されました。ちゃんと5.5GBになっているか?
はい、単位換算の関係で5.08GBとなっていますが、ちゃんと5.5GBになっています。
次に、2つ目のZIP爆弾を試してみます。ファイルサイズは公称値通り、約10MBとなっています。ちゃんと展開されれば、これが281TBになるのか。想像もつかない。
早速、Windowsの機能で展開します。ファイルサイズがテラバイトに…と思ったのですが、なんと空き容量不足で処理が中止されてしまいました。まさかこんなことになるとは。
Windows標準の機能ではダメだったので、私が普段使っている7-Zipで展開が可能か試してみます。
すると処理が始まり、ファイルが生成され始めます。ちょっと待て、残り時間が150時間近くになっている。まあ、それくらいにはなるかもね。
処理中のCPU使用率を確認したところ、CPUの使用率は意外にも低いです。1コアしか使われていないので、使用率がかなり低い。一方、ディスクの使用率は常に100%となっています。これだと動作も遅くなりそう。
しばらく処理を待っていると、あるところで空き容量が不足しているとなって処理が停止しました。さすがに容量を超えて展開はしないのか。今回は空き容量が160GB程度だったため、比較的早く処理が止まりましたが、大容量のHDDとかだったりすると、かなり長い間処理が続くでしょう。
ついでにファイルの構造を見てみると、1つ目の小さなZIP爆弾は21MB程度のファイルが250個入っていました。合計で5.5GBとなるわけか。
2つ目の大きなZIP爆弾には、4.2GB程度のファイルがなんと65534個も確認されました。クラスタ爆弾かよ。容量も数もえぐい。さすがに281TBは中身も恐ろしい。
実際に試した結果と注意点
実際にZIP爆弾を試してみた結果、空き容量より小さいZIP爆弾の場合は完全にファイルが展開され、空き容量より大きい場合はエラーが出て処理が止まるか、空き容量が無くなるまで処理が続きました。今回はたまたま処理が止まってよかったけど、もし処理が止まらなかったら…。環境によっては処理が止まらない可能性もあり、最悪の場合PCがクラッシュしたり、データが失われる恐れがあります。
他に気になった点として、これだけ容量を一度に書き込んだら、SSDだと残り寿命を削ることになるし、HDDでも故障の確率を高めそう。SSDの書き換え可能回数は、TLCなら数千回から数万回とも言われていますが、1回のZIP爆弾使用で、大体0.01%から0.003%寿命を縮めます。
思いの外影響がたいしたことないけれど、迷惑っちゃ迷惑だな。まさにZIP爆弾は迷惑なファイルで、そういう意味ではコンピューターウイルスと性質が似ているのかもしれません。
じゃあ、コンピューターウイルスじゃないのか? 実は、ウイルスと呼ぶにはかなり微妙で、そもそも実行ファイルではないこと、セキュリティソフトも必ずしもウイルスとしてみなさないという厄介な性質があります。セキュリティソフトに検知されないのはヤバそう。確かにウイルスと呼ぶには微妙だ。
でも、ウイルスじゃなくても、電子的な方法で相手に損害を与えるのは、DDoS攻撃などと同じように日本の法律で違法とされているので、学術研究用とか、ちょっとした実験で自己責任で作るならまだしも、ZIP爆弾を友人にメールで送ったりするのは絶対にやめましょう。メールに添付すると、スキャンが延々と続くという話があったな。
また、ZIP爆弾の展開についても、今回はたまたま被害が出ませんでしたが、前述したように危険性もあるので、必ず自己責任で実行してください。PCがぶっ壊れても知りません。間違っても私に責任を押し付けないように。
ZIP爆弾の技術的な詳細:非再帰的と再帰的の違い
そういえば冒頭で「非再帰的ZIP爆弾」と言っていたけど、「非再帰的」って一体何なんだ?
再帰的とは、自分自身を呼び出すことで、ここでは展開動作を繰り返すことを指します。非再帰的はその逆で、繰り返しません。
じゃあなぜ再帰的? 非再帰的区別が必要なのか? それはZIPの圧縮の仕組みが大きく関わっています。
ZIPの場合のアルゴリズムは「Deflate」と呼ばれています。しかし、Deflateはその仕組み上、実は100分の1程度にしか圧縮できません。それじゃ、ZIP爆弾を作ろうにも爆弾自体が巨大になってしまいます。
そこで、ZIP爆弾自体を畳み重ねて、入れ子構造にすることで、より強力なZIP爆弾の作成が試みられました。これが再帰的ZIP爆弾と呼ばれるものです。
入れ子にすることで、指数関数的に爆発力が増すというわけか。恐ろしい。
しかし、再帰的ZIP爆弾の場合、プログラム側で再帰的な展開ができないと、1回しか展開されません。実際、今回紹介したZIP爆弾でも、この再帰的ZIP爆弾は使われていません。
入れ子構造にしないのなら、どうやって42KBが5.5GBみたいな危険な爆弾を作れるのか?
再帰的な技術を使わずに、普通にZIP爆弾を作れば1000倍が限界です。今回紹介したBetterZipBombの作成者は、構造を工夫してZIPの圧縮率を高めました。
具体的にどうやって?
ZIPファイルの構造は、各ファイルごとにヘッダー、ファイルのデータが格納されており、その後にファイルの圧縮方法を記述した辞書が入っています。しかし、これでは1000倍が限界なので、辞書が参照するファイルを重複させて圧縮率を高めました。
で、どれくらい圧縮率が高まるのか?これである程度2万倍くらいに圧縮されます。最初よりはだいぶ圧縮率が高くなったけど、まだ爆弾としては物足りない気がする。
ということで、BetterZipBombの作成者は、辞書もファイルの中に内包させて重複させることで、更なる効率化を図りました。ファイルの内容も辞書も重ね合わせているから、圧縮率が更に高くなるわけか。更に、ファイル名もファイルサイズに影響するため、このZIP爆弾では極めて短いファイル名を付与しています。
そしてこれらのテクニックを活用して作られた非再帰的ZIP爆弾は、再帰的な構造を作る事なく、非常に高い圧縮率を実現しました。
直球で出てきた。非再帰的とはそういうことだったのか。普通に圧縮すると1MBにも満たなかったゴミ性能のZIP爆弾が、展開後のサイズ5.5GB、約13万倍のZIP爆弾になりました。現実で例えるなら、おもちゃの花火がTNTになったようなものか。
この技術を使って、さらに大きな爆弾も作成可能で、最大で展開後に281TBの大きさになるZIP爆弾も作れるわけです。さっき紹介した大きなZIP爆弾の方か。ただ、このZIP爆弾、さすがに再帰的ZIP爆弾にはかなわないようです。
再帰的ZIP爆弾だとどれくらい大きくなるのか?同じ42KBのファイルで比較すると、通常のZIPファイルは500KB程度にしかならないのに対し、非再帰的ZIP爆弾で5.5GB、再帰的ZIP爆弾ではなんと4.5PB(4500TB)もの巨大ファイルとなります。天文学的数字。
再帰的ZIP爆弾がいかに恐ろしいものかお分かりいただけましたか?まあ、どうせ途中で処理が止まるし、気づいたら止めればいい。もし、サーバーとかで自動実行されたらどうなる?
まとめ:怪しい圧縮ファイルには注意!
そんなわけで、皆さんは怪しい圧縮ファイルを見つけたら、絶対にすぐに開かず、きちんと確認しましょう。そんなのはセキュリティの基本中の基本だよな。
ということで、次回は281TBのZIP爆弾を展開してみます。それ、できるのか?
おわりに:今回の実験のまとめと今後の展望
今回は超危険なファイル、ZIP爆弾を解説・実践しました。ペタバイトなんて単位、まず日常で使わないし、テラバイトのファイルというのも非現実的。それにしても、未だに単位を1024で換算するから、1000と混ざって混乱してしまうんだよな。1KBが1024バイトというのは、情報分野のヤード・ポンド法かもしれません。ヤード・ポンド法といえば、ゴルフのヤードとか、ボーリングのポンドとか、航空業界ではよく見かける単位だけど、アメリカ以外の国はほぼ使っておらず、滅ぼすべきとか言われているよな。今はメートル法が主流で、日本人からすれば、紛らわしいだけのヤード・ポンド法は撲滅すべき、というのは気持ちは分かりますが、やはり航空分野など、慎重にしている分野では慎重に移行しないと混乱を招くので、難しい問題だったりします。
情報の単位でも同じようなものか。ストレージの容量は1000だと分かりやすいけど、メモリ・キャッシュ関係は1024のままとか。それにしても、今でも混在しているというのは、移行は難しいんだろうな。実際、メートル法もフランス革命で始まって、日本で法制化されたのは1959年。実はそんなに昔ではない。1KBが1024というのも、まだ50年くらいの話だから、この先も残り続きそう。
今後の本チャンネルの発展のため、チャンネル登録、高評価をお願いします!
ということで、ご視聴ありがとうございました!