AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
隨著移動應用的廣泛普及,惡意軟件也日趨復雜和隱蔽。本報告著眼于一個由 ReBensk 提交至 incinerator.cloud 的惡意 Android 軟件樣本。
樣本哈希值:
MD5: 2f371969faf2dc239206e81d00c579ff
SHA-256: b3561bf581721c84fd92501e2d0886b284e8fa8e7dc193e41ab300a063dfe5f3
在 ReBensk 提交至 incinerator.cloud 的多個惡意樣本中,我們特別關注了一款經(jīng)過自定義修改的 APK 文件,以下簡稱為“樣本 b356”。這個樣本采用了獨特的混淆和隱蔽技術,導致標準的解壓縮工具無法成功解壓其內(nèi)容。通過特定的修正操作,我們成功突破這一限制,并進一步分析了該樣本。
分析過程
1. 解壓失敗分析
在嘗試使用 7z 工具解壓這個 APK 文件時(Apk 本質(zhì)上是一個 ZIP 文件),遇到錯誤顯示 AndroidManifest.xml header 錯誤,這說明標準的解壓過程無法正確地解壓樣本 b356。
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
在使用 010 Editor 打開 APK 文件并應用 ZipAdv 模板進行解析后,并未發(fā)現(xiàn)任何明顯的錯誤或異常。
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
為了更深入地了解問題,我們打開了一個正常運行的 APK 文件進行對比分析。這樣做是為了確定是否存在某種特殊或不規(guī)則的結(jié)構(gòu)或數(shù)據(jù),可能是導致解壓失敗的原因。
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
通過對比發(fā)現(xiàn),我們發(fā)現(xiàn)樣本 b356 采用了一個不非法的壓縮算法 0x23C2。在標準的 ZIP 格式規(guī)范中,壓縮方法由一個短整數(shù)(short)表示,取值通常如下文所示(以下代碼取自 010 Editor 的 ZIPAdv.bt 模板)。由于 0x23C2 不是任何已知的標準壓縮方法,因此 7z 等解壓工具無法識別和處理。
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
因此,樣本 b356 采用了未知的壓縮算法,導致通用壓縮工具解壓縮失敗。但為什么它能在 Android 系統(tǒng)上仍然可以成功安裝和運行呢?
2. Android 系統(tǒng)的成功解析與運行原因
正如下圖所示, 根據(jù) Android 系統(tǒng)源代碼,當系統(tǒng)遇到非 COMP_DEFLATE 的壓縮算法時,它會采用“未壓縮”(COMP_STORED)的方法處理輸入文件。具體來說,系統(tǒng)直接讀取未壓縮數(shù)據(jù)的長度,并據(jù)此進行解析。
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
請注意看黃框和紅框中的代碼對比,在黃框中,如果使用的是 COMP_DEFLATE 壓縮算法,系統(tǒng)將按照相應的方法解壓縮,如果不是,系統(tǒng)將直接讀取壓縮前的長度,然后進行處理。
這就解釋了為什么修改了 AndroidManifest 的壓縮方法后,系統(tǒng)仍然可以正確運行。樣本 b356 在正常打包流程完成后,將包中的 AndroidManifest.xml 文件內(nèi)容替換為未壓縮前的內(nèi)容,并將壓縮算法替換為非 COMP_DEFLATE 。因此,常規(guī)解壓工具會失敗,但 Android 系統(tǒng)會按照未壓縮的方式處理,因此可以正常運行。
3. 解壓程序的修改建議
3.1 修復 Apk
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
按照 Android 系統(tǒng)的處理方式,Apk 的 AndroidManifest.xml 只能采用兩種壓縮方式。COMP_DEFLATE 或未壓縮。
如果壓縮算法不是默認的 COMP_DEFLATE ,那么一定是未壓縮。因此修復 apk 的方法是,如果發(fā)現(xiàn)壓縮算法不是 COMP_DEFLATE ,將壓縮算法設置為 0,即未壓縮,并將壓縮后的長度設置為壓縮前的長度。這樣,常規(guī)解壓工具就可以解壓了。
修復后,我們嘗試使用 7-Zip(通常簡稱為 7z)工具進行解壓,結(jié)果如下圖所示。盡管仍然存在錯誤,特別是關于 CRC(循環(huán)冗余檢查)值尚未修復的問題,但我們已成功解壓了 APK 文件,并可以訪問其中的 AndroidManifest.xml 內(nèi)容。
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
AndroidManifest.xml 多種混淆繞過靜態(tài)分析的技術分析(Zip 格式類型修改繞過)
3.2 靜態(tài)分析工具的修復
靜態(tài)分析工具可以按照系統(tǒng)的解壓方式處理,如果發(fā)現(xiàn) AndroidManifest.xml 的壓縮方法不是 COMP_DEFLATE ,那么就讀取壓縮前的長度作為 AndroidManifest.xml 的內(nèi)容。
總結(jié)
由于 Android 系統(tǒng)在解析時對非 COMP_DEFLATE 的壓縮方式采取的是未壓縮處理,從邏輯上看,這種做法并不符合規(guī)范,因此,導致 b356 成功地利用了這一邏輯漏洞。徹底的解決方案應該是 Android 系統(tǒng)按照規(guī)范的 zip 包解壓格式進行處理。
來源:https://www.liansecurity.com/#/main/news/GzKmQIoBUQjGUXE22_tO/detail