ZIP 一直是主流的壓縮文件格式,並且可追溯到幾十年前的 5.25 和 3.5 英吋軟碟時代。然而該技術作為一把雙面刃,也難免被別有用心的人所利用。比如透過一個看似超小型的壓縮包,製作一個內含巨量垃圾資料的「解壓炸彈包」(zip bomb)—— 一個表面上只有 46MB,但其實解壓縮後,可以膨脹到 4.5PB 的 zbxl.zip 炸彈壓縮包。
其實早在去年,研究員 David Fifield 就曾展示過早期的解壓炸彈包,能夠將一個 42kB 的 zbsm.zip 文件迅速膨脹到 5.5GB 。
之後,他又繼續努力,推出了一個表面上只有 10MB,但其實能夠膨脹到 281 TB 的 zbLG.zip 炸彈壓縮包。
時間轉眼到了 2019 年 7 月,David Fifield 又發表了他的最新研究成果 —— 一個表面上只有 46MB,但其實可以膨脹到 4.5PB 的 zbxl.zip 炸彈壓縮包。
不過需要指出的是,由於其採用了 Zip64,所以相容性較差。
zip 解壓炸彈包使用遞歸算法的原因,歸結於 ZIP 解析器中使用的 DEFLATE 算法無法實現高於 1032:1 的壓縮率。有趣的是,David Fifield 找到了一種繞過該限制的方法。
其寫到:本文介紹了如何構造一款壓縮比超過 DEFAATE 1032 的非遞歸解壓炸彈包。其透過重置 zip 容器內的文件來實現,以便在多個文件中引用高度壓縮數據的『內核』,而不是製作它的多個副本。
解壓炸彈的輸入與輸出大小,呈現的是二次方增長。即隨著炸彈變大,壓縮比也就更強。構造取決於 zip 和 DEFLATE 的特徵,它不能直接移植到其它文件格式或壓縮演算法。
此外,該方案與大多數 zip 解析器相容,不過文件流解析器是個例外。後者在一次傳遞中解析,而無需事先查詢 zip 文件的中心目錄。
為使該方法見效,Fifield 必須重新審視數據是如何存儲在 zip 文件中的,並且選擇了適當的 Deflate 實現。
其選擇了 bulk_deflate,一個專門用於壓縮一串重複字節的自定義壓縮器,能夠比 zlib、info_ZIP 或 Zopfli 更密集地打包數據的工具。
儘管 bulk_deflate 優於這些解決方案,但 Fifield 指出,其在一般用例中的效率並不高,還必須借助被稱作 ZIP64 的 zip 標準擴展,來創建一個內含超過 281TB 數據輸出的文件。
但若使用 ZIP64,便可創建出一個內含有效無限長度的解壓炸彈包。至於更多細節,還請移步至官網查看。
請注意!留言要自負法律責任,相關案例層出不窮,請慎重發文!