機器學(xué)習(xí)如何檢測那些使用沙盒逃避和靜態(tài)防護的惡意軟件
Unit 42研究人員討論了基于虛擬機監(jiān)控程序的沙盒中基于內(nèi)存的工件構(gòu)建的機器學(xué)習(xí)渠道,該沙盒是Advanced WildFire的一部分??梢蕴岣邔阂廛浖臋z測精度。
正如我們以前所介紹的,惡意軟件開發(fā)者正在不斷完善他們的攻擊手段,以使靜態(tài)分析和沙盒等策略失效。封裝方法和沙盒逃避等技術(shù)的不斷發(fā)展讓防御者防不勝防。
更糟糕的是,流行的檢測技術(shù),如結(jié)構(gòu)分析、靜態(tài)簽名和許多類型的動態(tài)分析,并不能很好地應(yīng)對目前越來越復(fù)雜的攻擊。
惡意軟件開發(fā)者越來越多地采用逃避技術(shù),如混淆、封裝和在進程內(nèi)存中執(zhí)行動態(tài)注入的shellcode。使用來自文件結(jié)構(gòu)的線索進行惡意軟件檢測可能并不總是成功的。封裝技術(shù)可以充分修改文件結(jié)構(gòu)以消除這些線索。因此,僅在這類特征上訓(xùn)練的機器學(xué)習(xí)模型將無法有效地檢測出此類樣本。
這種檢測方法的另一種流行的替代方法是使用機器學(xué)習(xí)模型,該模型基于惡意軟件在沙盒內(nèi)的執(zhí)行痕跡來預(yù)測惡意行為。然而,正如我們原來所詳細介紹的那樣,沙盒逃避非常普遍,有效負載通常會根據(jù)任何數(shù)量的線索選擇不執(zhí)行,這些線索會指向正在模擬的樣本。
惡意軟件也可能會無意或有意地破壞沙盒環(huán)境,覆蓋日志文件,或由于其所使用的低級技巧而阻止成功分析。這意味著,在執(zhí)行日志上訓(xùn)練機器學(xué)習(xí)模型也不足以捕捉這些逃避類的惡意軟件。
使用NSIS Crypter加密的GuLoader惡意軟件
在這篇文章中,我們將分析一個使用Nullsoft Scriptable Install System(NSIS)加密器加密的GuLoader下載器。NSIS是一個用于創(chuàng)建Windows安裝程序的開源系統(tǒng)。
Hash cc6860e4ee37795693ac0ffe0516a63b9e29afe9af0bd859796f8ebaac5b6a8c
為什么靜態(tài)分析沒有幫助
GuLoader惡意軟件是加密的,它也是通過NSIS安裝文件傳遞的,這對于靜態(tài)分析來說并不理想,因為必須首先解壓縮文件內(nèi)容。一旦它被解壓縮,我們?nèi)匀挥屑用艿臄?shù)據(jù)和一個NSIS腳本。腳本本身也會動態(tài)地解密代碼的某些部分,這是使其難以檢測的另一個因素。
然而,沒有太多的結(jié)構(gòu)線索可以識別這可能是惡意軟件。因此,在可移植可執(zhí)行文件(PE)結(jié)構(gòu)上訓(xùn)練的機器學(xué)習(xí)模型將不能有效地將該文件與其他良性文件區(qū)分開來。
NSIS腳本和提取GuLoadershellcode
要提取NSIS腳本,我們必須使用7-Zip的舊版本15.05。這個版本的7-Zip能夠解包腳本,而新版本已經(jīng)刪除了解包NSIS腳本的功能。一旦我們提取了文件內(nèi)容和NSIS腳本(如圖1所示),我們就可以開始分析腳本并查看GuLoader示例是如何執(zhí)行的。
NSIS腳本
如果向下滾動腳本,我們會很快注意到文件正在復(fù)制到新創(chuàng)建的名為%APPDATA%\Farvelade\Skaermfeltet的文件夾中。雖然不清楚原因,但所使用的文件路徑似乎是丹麥語。在復(fù)制活動之后,腳本中有常規(guī)的安裝邏輯,但是有一個名為func_30的有趣函數(shù)。
在此函數(shù)被調(diào)用之前,字符串$INSTDIR\Filterposerne\Malkekvg. exeNat被復(fù)制到名為$4的字符串變量中,如圖2和圖3所示。函數(shù)func_30從Programmeludviklinger210中讀取數(shù)據(jù)。Kon文件并構(gòu)建代碼,它將在字符Z被看到后立即調(diào)用這些代碼。
NSIS允許開發(fā)人員能夠從Windows DLL調(diào)用任何導(dǎo)出的函數(shù),并且還允許他們將結(jié)果直接保存在NSIS寄存器/堆棧中。此功能允許惡意軟件開發(fā)者在運行時動態(tài)調(diào)用Windows API函數(shù),并使靜態(tài)分析更加困難,因為在分析之前必須對其進行評估。
調(diào)用函數(shù)func_30
解碼NSIS代碼
要解碼動態(tài)代碼,我們可以編寫一個簡短的Python腳本,該腳本再現(xiàn)行為并提取Windows API調(diào)用:
下圖顯示了上述腳本產(chǎn)生的解碼數(shù)據(jù)
解碼的Windows API調(diào)用
解碼后的函數(shù)一起從NSIS壓縮文件中的另一個文件中讀取shellcode,并使用EnumWindows函數(shù)執(zhí)行它。如果我們必須用偽代碼編寫這個過程,它看起來應(yīng)該是這樣的:
為了使其余的分析更容易,我們將使用shellcode生成一個PE。為了生成可執(zhí)行文件,我們可以使用Cerbero Profiler或LIEF Python庫等工具。
在本例中,我們使用了LIEF庫來構(gòu)建一個新的可執(zhí)行文件。我們所要做的就是添加一個包含Malkekvg.Nat文件內(nèi)容的新部分,并將入口點設(shè)置為正確的偏移量。一旦我們得到了這些,就應(yīng)該能夠在IDAPro中打開shellcode,并看到它包含有效的x86指令。
在IDA Pro的入口點生成PE文件
Shellcode分析
現(xiàn)在我們在PE文件中有了Shellcode的第一階段,我們可以在動態(tài)分析中運行它,看看會發(fā)生什么。我們將看到的第一件事是它檢測到虛擬機,并在顯示消息框后停止執(zhí)行。此文本在運行時使用4字節(jié)XOR密鑰解密。
無法在虛擬環(huán)境中執(zhí)行該示例
如果我們在IDA Pro中打開文件并稍微遵循代碼,就應(yīng)該能夠看到用于解密第一階段的大函數(shù)。雖然函數(shù)圖概述看起來很大,但識別垃圾代碼仍然很容易。
進行解密的代碼如下圖所示。在下圖中,我們可以看到跳轉(zhuǎn)到第二階段的最終調(diào)用。此時,我們可以將第二階段轉(zhuǎn)儲到另一個可執(zhí)行文件中進行解密。
我們可以直接從內(nèi)存中轉(zhuǎn)儲可執(zhí)行文件,但是必須確保將入口點修補到正確的地址(在本例中為0x404328)。
第一階段的Shellcode解密
調(diào)用到下一階段
第二階段使用了許多反分析技術(shù),其中的一些反分析技術(shù)為:
內(nèi)存掃描已知沙盒字符串;
虛擬機監(jiān)控程序檢查;
時間測量;
為了獲得GuLoader正在下載的最終負載,我們必須手動繞過所有這些檢查,在不受所有這些技術(shù)影響的沙盒中運行它,或者在裸金屬沙盒上運行它。
提取有效負載信息
為了在不分析第二階段的情況下獲得有效負載信息(包括所有字符串),我們可以使用Spamhaus描述的一個小技巧。GuLoader使用簡單的XOR加密來加密其字符串,其中包括有效負載URL。
要解密字符串,我們可以對已經(jīng)知道存在于第二階段中的模式使用暴力。XOR運算的結(jié)果就密鑰。對此的唯一限制是模式必須足夠大,以便我們能夠完全解密有效負載URL。例如,一個好的模式可能是用戶代理字符串,默認設(shè)置為Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) ,如Gecko。
為了快速自動找到解密密鑰,我們必須首先加密一個短模式(例如,用戶代理字符串的前8個字節(jié)),然后搜索該結(jié)果是否在文件中的某個位置。如果它在文件中的某個位置,那么我們可以繼續(xù)解密剩余的模式以獲得完整的加密密鑰。
我們會在本文的最后附上Python腳本,該腳本能夠通過上述方法從有效負載中找到加密密鑰。在任何轉(zhuǎn)儲的第二階段GuLoader負載上運行腳本后,我們應(yīng)該能夠看到一些字符串和負載URL。
GuLoader有時在有效負載URL前面包含7到8個隨機字符,它在運行時將其替換為http://或https://。使用http還是https的區(qū)別是由隨機模式中的第四個字符決定的。
在此示例中,有效負載URL為http://ozd[.]com[.]ar/wp-includes/nHMoYlbGLWls101.qxd,并且在分析時有效載荷仍然在線。
最終下載的有效負載來自FormBook惡意軟件家族,其SHA256值為fa0b6404535c2b3953e2b571608729d15fb78435949037f13f05d1f5c1758173。
機器學(xué)習(xí)如何檢測?
在之前的一篇文章中,我們詳細介紹了在實時沙盒運行期間可以從內(nèi)存中提取的幾種可觀察工件。我們發(fā)現(xiàn),當(dāng)與機器學(xué)習(xí)結(jié)合使用多種逃避技術(shù)檢測惡意軟件時,來自內(nèi)存分析的數(shù)據(jù)是非常強大的。
接下來我們回仔細觀察所有這些關(guān)于運行時內(nèi)存中被修改的內(nèi)容,并將它們與大規(guī)模的機器學(xué)習(xí)相結(jié)合,用于惡意軟件檢測。該算法可以自動找到模式,并且可以識別惡意軟件試圖在內(nèi)存中隱藏其足跡、動態(tài)分配和執(zhí)行shellcode或使用解包的共性。
在這個GuLoader示例中,人類分析人員會立即識別出有幾個獨特的函數(shù)指針。我們還會注意到,惡意軟件已經(jīng)將其自身進程內(nèi)存中的多個頁面的頁面權(quán)限更改為可寫和可執(zhí)行。我們的機器學(xué)習(xí)模型能夠自動執(zhí)行這些活動,從各種內(nèi)存構(gòu)件中提取有關(guān)特征來檢測GuLoader示例。
如上所述,我們?yōu)锳dvanced WildFire創(chuàng)建的自動分析平臺將以一種高性能的方式自動提取所有這些基于內(nèi)存的工件。這意味著所有與動態(tài)解析函數(shù)指針、權(quán)限更改和解包可執(zhí)行文件相關(guān)的信息都可以在我們手動管理的檢測邏輯中使用,也可以用于我們的機器學(xué)習(xí)渠道。
使用機器學(xué)習(xí)模式的檢測
下圖顯示了我們?nèi)绾蝿?chuàng)建一個機器學(xué)習(xí)模型渠道的高級視圖,該模型渠道是根據(jù)從上述基于內(nèi)存的工件中提取的自定義特征進行訓(xùn)練的。我們選擇的特性被設(shè)計成保留來自冗長工件的最有用的信息。
我們還將惡意軟件執(zhí)行跟蹤作為額外的信息源,并構(gòu)建了一個集成模型來檢測惡意樣本。如下圖所示,從四個內(nèi)存工件和惡意軟件執(zhí)行痕跡中自動提取各種自定義特征,并將它們傳遞給一個分類模型以檢測惡意樣本。此外,我們還構(gòu)建了一個集成模型,該模型基于內(nèi)存工件和基于執(zhí)行跟蹤的特性進行訓(xùn)練,以提高其性能。
機器學(xué)習(xí)模型架構(gòu)
文件樣本由流程渠道處理,以將內(nèi)存工件和其他惡意軟件屬性保存到功能存儲中。特征提取階段使用流式處理和批處理PySpark作業(yè)的組合來生成用于訓(xùn)練模型的最終特征向量。
ground truth標簽來自一個單獨的渠道,該渠道根據(jù)惡意軟件特征和研究人員輸入為樣本分配標簽。該渠道通過使用樣本首次出現(xiàn)的時間和哈希來生成非重疊的訓(xùn)練和評估數(shù)據(jù)集。
解釋模型預(yù)測
為了識別模型的局限性和能力,理解機器學(xué)習(xí)模型的預(yù)測是至關(guān)重要的。機器學(xué)習(xí)很容易出現(xiàn)誤報,因為它嚴重依賴于訓(xùn)練數(shù)據(jù)的質(zhì)量和多樣性,以及對不斷變化的文件進行預(yù)測的泛化能力。因此,具有識別預(yù)測的因果特征的能力是非常有用的。
Shapley值
Shapley加法解釋(SHAP)是一種博弈論方法,用于解釋任何機器學(xué)習(xí)模型的輸出。與基線預(yù)測相比,SHAP值解釋了每個特征對輸入特征向量的實際預(yù)測的影響。在下圖中,從右到左的紅色特征是將模型推向惡意預(yù)測的最頂層特征。從左到右,藍色的特征表示降低預(yù)測為惡意軟件概率的最頂層特征。
如上圖所示,我們繪制了具有重要SHAP值的前七個特征及其相應(yīng)原始特征值的力圖。由于這些頂級特征的存在,我們的機器學(xué)習(xí)模型能夠檢測到GuLoader。這些特性對應(yīng)于幾個特定的動態(tài)解析API指針及其在內(nèi)存中的相對位置,以及樣本所做的內(nèi)存頁權(quán)限更改的相對類型。
通過聚類尋找相似樣本
另一種理解模型預(yù)測的方法是在訓(xùn)練數(shù)據(jù)集中識別相似的樣本。我們使用基于密度的掃描(DBScan)作為聚類技術(shù),如下圖所示,因為它允許異常值和不同形狀的聚類。
基于DBSCAN的集群
總結(jié)
GuLoader家族是unit42開發(fā)的機器學(xué)習(xí)模型檢測惡意軟件的一個很好的示例,因為GuLoader使用沙盒逃避和靜態(tài)防護,使得傳統(tǒng)防御很難單獨使用結(jié)構(gòu)線索和執(zhí)行日志進行檢測。
在Advanced WildFire中,開發(fā)人員引入了一個基于虛擬機監(jiān)控程序的沙盒,它可以在執(zhí)行期間暗中觀察GuLoader的內(nèi)存,以解析有意義的內(nèi)存駐留工件和對機器學(xué)習(xí)檢測渠道有用的信息。這允許安全防護人員使用從觀察到的基于內(nèi)存的工件中提取的特征來準確地檢測惡意行為。
本文翻譯自:https://unit42.paloaltonetworks.com/malware-detection-accuracy/