經典的阻斷服務壓縮檔是遞迴式 zip bomb:42.zip 嵌套六層 zip 檔案,只有在解壓器持續解開嵌套壓縮檔時才會達到 4.5 PB。大多數實際的解析器只解壓一次,因此頂層僅產生微不足道的 0.6 MB,而掃描器則以限制遞迴深度和解壓後大小來自保。眾所皆知的攻擊具有樹狀結構。

David Fifield 的做法是移除遞迴。他壓縮一小顆重複位元組的核心,然後讓數萬個中央目錄項目指向這些位元組的重疊範圍,並將每個中間的本地檔案標頭引用在 DEFLATE 非壓縮區塊內,使普通解析器仍能看到各自獨立、格式良好的檔案。核心的每個位元組會為每個檔案解壓一次,因此輸出隨輸入呈平方增長,而炸彈在一次解壓中引爆。

數字超越所有先前的構造:在 42,374 位元組,即 42.zip 外層的大小下,壓縮檔膨脹到 5.5 GB(比率為 129,000);10 MB 版本膨脹到 281 TB,比率超過 2,800 萬,達到 zip 格式理論最大值的 99.97%;使用 Zip64 擴展,46 MB 膨脹到 4.5 PB。USENIX 接受該論文於其 WOOT 2019 研討會發表,並授予最佳論文獎。

該發布成為業界防禦的實測。10 MB 樣本的 VirusTotal 掃描在許多引擎上逾時;ClamAV 消耗 CPU 直到其偵測被修補,然後再次修補;Mark Adler 為 UnZip 撰寫了重疊檔案偵測器,Debian 隨之發布,而 SUSE 拒絕(CVE-2019-13232);Chromium 增加了異常壓縮比的指標;Apple 在 iOS 14 中緩解了 iOS Quick Look 快取耗盡問題。

將多個檔案重疊在一個壓縮核心上,使每個儲存的位元組膨脹 N 次

它攻擊了標準防禦下的假設:掃描器限制了遞迴深度,因此一個在單次解壓中完全膨脹的炸彈看起來很普通,直到它淹沒磁碟。

重疊使比率呈超線性,因為每個儲存的位元組都貢獻給每個輸出檔案,因此壓縮檔越大越致命,而不是每層增加固定倍數。

相容性是透過匹配的名稱、正確的 CRC 和純 DEFLATE 來設計的,因此示範可在 Info-ZIP、Python、Go 和 Android 解析器上運行,而不是邊緣案例。

Fifield 發布了可用的樣本,並將攻擊與修復、重疊偵測和解析器沙箱化配對,將好奇心轉化為供應商可採用的修補程式。

當防禦者修補了一種攻擊形態,就改變形態:重疊檔案使遞迴成為可選,深度限制變得無用。在解析器內部限制時間和磁碟,而不是枚舉簽名。

Mark Adler 的重疊偵測器進入 UnZip 和 Debian,ClamAV 最初只檢查相鄰對,然後施加時間限制,D 的 std.zip 學會拒絕重疊,Chromium 增加了異常比率指標,Apple 在 iOS 14 中緩解了 iOS 12/13 Quick Look 耗盡問題。VirusTotal 記錄了逾時的引擎,防毒廠商在 2019 年更新了偵測。Google Safe Browsing 在 2019 年 7 月底至 8 月中標記了整個 bamsoftware.com,短暫破壞了 Tor 的 Snowflake 代理,Xfinity 在 2019 年 11 月封鎖了該頁面。Fifield 在 USENIX WOOT 2019 獲得最佳論文獎。

追溯依據

參考來源

  1. A better zip bomb David Fifield · bamsoftware.com
  2. A better zip bomb (Best Paper), USENIX WOOT 19 USENIX Association · usenix.org
  3. A better zip bomb — Hacker News discussion Hacker News · news.ycombinator.com ·