按 Enter 到主內容區
:::

TWCERT-電子報

:::
發布日期:
字型大小:

解碼RAR格式而無精確初始化,7-Zip衍生memory corruptions

CVE編號 CVE-2018-10115
影響產品 7-Zip 18.03以前版本
解決辦法 (1)適用32-bit Windows,參考:
http://7-zip.org/a/7z1805.exe
http://7-zip.org/a/7z1805.msi

(2)適用64-bit Windows,參考:
http://7-zip.org/a/7z1805-x64.exe
http://7-zip.org/a/7z1805-x64.msi

張貼日 2018-05-11
上稿單位 TWCERT/CC

●概述:
知名壓縮軟體7-Zip以C、C++開發,係遍及86個語系地區的開放原始碼軟體,搭配Windows及Unix-like作業系統,提供圖形介面與自行開發的7z格式,經landave測試指出,其RAR解碼器物件(decoder object)運算程序出現邏輯判斷異常,導致程式誤用缺乏初期界定之記憶體範圍,若攻擊者製作惡意RAR縮檔,可於7-Zip進行解碼實心壓縮(solid compression)階段,觸發資料結構初始化錯誤,引發buffer overflow,造成本機DoS或擴權執行任意代碼等負面影響,7-Zip已就相關瑕疵進行軟體升級。
●編註:
(1)實心壓縮概念
solid compression之概念,比方有一堆檔案在同資料夾,可以看做成一個成串的資料區塊,壓縮軟體對整個區塊執行編碼運算,如果多數檔案屬性內容類似,則壓縮率大幅提升。而7-Zip處理solid compression的方式,在面臨首個待解碼之檔案個體,會在作業開始時先確定decoder object初始化其狀態,該方式採用迴圈設計,於解壓縮過程,橫跨全數檔案個體,以特定變數邏輯索引重複疊代,以原始碼體現如後:
Byte isSolid = (Byte)((IsSolid(index) || item.IsSplitBefore()) ? 1: 0);
if (solidStart) {
isSolid = 0;
solidStart = false;
}
RINOK(compressSetDecoderProperties->SetDecoderProperties2(&isSolid, 1));
程式內solidStart為boolean變數,在迴圈運作前就設定為true,以保證解碼器處理首個對象檔案時,變數isSolid能被設為0,之後無論何時decoder被呼叫進行初始化,相關變數isSolid均維持在false。
(2)漏洞成因
通常7-Zip解壓縮solid compression資料可以正常運行,然RAR有其特別之處,RAR格式對實心壓縮的技術極富彈性變化,對任何檔案都視作獨立的實心壓縮個體,且RAR支援3種編碼方式,表示每個檔案個體均能套用不同的編碼運算,3種編碼方式就有3種專屬decoder object。因為每逢non-solid檔案個體,程式重新初始化其狀態,基於某種盲目假設,誤認為呼叫器總是有把握讓decoder首次運作前將isSolid設為false,故負責管理decoder object的建構器會遺留一大部分未初始化的狀態,試著模擬7-zip解壓縮情境,item_1採用method_1編碼,而item_2採用method_2編碼,當7-zip建立decoder object_1解碼item_1,則造成solidStart = false,既然solidStart被重設則跳離if判斷式,後續decoder object_2解碼item_2時,就無法以RINOK( )重新初始化,如果整包壓縮檔內藏100個檔案個體,就有99個未初始化狀態發生。
(3)可能風險
前段敘述僅從7-zip運作來討論,乍看之下似無甚緊要,但眾多的缺乏初始設定事件,極可能肇生記憶體崩潰,試想物件內資料結構,總有用來設定buffer size之變數,若變數值過大,讓該物件設定buffer size超過實際值,則引發溢位錯誤,或者陣列資料型態內存有鍵值索引,可用來指向其他陣列變數,但缺乏精確的初始設定,導致相關資料被任意覆蓋,會損毀資料完整性。

回頁首