張英韜,王寶會
(1.武漢大學(xué)國家網(wǎng)絡(luò)安全學(xué)院,湖北 武漢 430072;2.空天信息安全與可信計(jì)算教育部重點(diǎn)實(shí)驗(yàn)室(武漢大學(xué)),湖北 武漢 430072;3.北京航空航天大學(xué)軟件學(xué)院,北京 102206)
互聯(lián)網(wǎng)技術(shù)的高速發(fā)展在為人們帶來無限便利的同時,也同時成為某些別有用心的人對特定用戶群進(jìn)行攻擊的途徑。據(jù)統(tǒng)計(jì),過去一年中,全世界由于惡意攻擊造成的經(jīng)濟(jì)損失達(dá)6萬億之多[1]。在所有的操作系統(tǒng)中,Windows系統(tǒng)由于其用戶界面精美,操作簡單,且各類游戲和軟件的普及性較高,得到了眾多用戶的青睞。不幸的是,針對Windows系統(tǒng)的惡意攻擊層出不窮,對系統(tǒng)造成極大威脅。尤其是類似于勒索病毒,挖礦程序,DDOS木馬,蠕蟲病毒等惡意軟件。雖然業(yè)界涌現(xiàn)了大量的應(yīng)對方法,但由于這些軟件衍生出越來越多的變種、且具有更深的行為特征隱藏性,為惡意軟件檢測任務(wù)帶來了前所未有的巨大挑戰(zhàn)。
根據(jù)現(xiàn)有文獻(xiàn),惡意軟件檢測方法大致分為兩種,首先是基于人工提取特征的方式,其中典型的有基于統(tǒng)計(jì)特征的方式[2]。由于該方式往往依賴于過往人工積累的特征碼經(jīng)驗(yàn),因而易于導(dǎo)致在識別經(jīng)過加殼處理或經(jīng)過混淆的惡意軟件方面存在困難[3];其二是基于機(jī)器學(xué)習(xí)的檢測方法,該方法又分為基于傳統(tǒng)機(jī)器學(xué)習(xí)技術(shù)和基于深度學(xué)習(xí)技術(shù)。傳統(tǒng)機(jī)器學(xué)習(xí)的特征設(shè)計(jì)往往需要人工干預(yù),如果特征提取工作出現(xiàn)誤差,則可能會導(dǎo)致準(zhǔn)確性降低,誤報率更高[4]。同時在處理序列數(shù)據(jù)方面有很大不足[5],導(dǎo)致該類模型往往泛化能力較低。典型的如[6-7],其主要運(yùn)用了SVM,決策樹等傳統(tǒng)機(jī)器學(xué)習(xí)算法。與之相對應(yīng)的深度學(xué)習(xí)方法,由于該方法可以學(xué)習(xí)更高維度的特征及表達(dá)更抽象的語義,因而在近年來成為檢測方法的主流[8]。常用的深度學(xué)習(xí)方法依賴于對API語義的抽取,然而由于這些方法對于的過長序列數(shù)據(jù)常用截斷處理,導(dǎo)致惡意軟件可輕易繞過序列檢測窗口。幸運(yùn)的是,隨著深度學(xué)習(xí)的發(fā)展,以圖的方式來對API調(diào)用序列進(jìn)行建模的方式逐漸受到研究者的青睞。其主要優(yōu)點(diǎn)是可以在圖結(jié)構(gòu)內(nèi)部建立拓?fù)潢P(guān)聯(lián),并且具有強(qiáng)大的推理能力,可以充分吸收周圍節(jié)點(diǎn)的特征。有鑒于此,本研究將使用圖表示學(xué)習(xí)方法,根據(jù)API相互的調(diào)用關(guān)系和調(diào)用序列,得到該軟件的圖表示,再輸入至圖神經(jīng)網(wǎng)絡(luò)中進(jìn)行分類。本文在這項(xiàng)工作中的主要貢獻(xiàn)如下:
(1)本文根據(jù)PE軟件調(diào)用API的特點(diǎn),提出多子圖的圖表示方法對API序列構(gòu)圖建模,并運(yùn)用該模型實(shí)現(xiàn)惡意軟件家族分類,實(shí)驗(yàn)的結(jié)果驗(yàn)證了本文的合理性和準(zhǔn)確性。
(2)本文創(chuàng)新性提出了邊嵌入方法,將調(diào)用序列中的一些邊根據(jù)其兩頭的節(jié)點(diǎn)類型生成邊節(jié)點(diǎn),對關(guān)鍵性的調(diào)用信息進(jìn)行突出提取,實(shí)驗(yàn)證明,該方法增加了準(zhǔn)確性。
根據(jù)對惡意軟件處理的角度不同,目前惡意軟件的檢測方法大致可以分為靜態(tài)檢測技術(shù)和動態(tài)檢測技術(shù)兩類。靜態(tài)檢測是指并不實(shí)際的運(yùn)行樣本,而是直接根據(jù)樣本,使用相應(yīng)的反匯編軟件對樣本分析得到其特征信息。動態(tài)檢測則是將樣本放置在沙箱等環(huán)境中運(yùn)行,根據(jù)樣本對操作系統(tǒng)的資源調(diào)度情況的日志進(jìn)行分析。目前大多數(shù)的惡意軟件的檢測方法都是基于靜態(tài)檢測,通過一些靜態(tài)的軟件反匯編軟件,得到該軟件的API調(diào)用序列,再輸入到神經(jīng)網(wǎng)絡(luò)中進(jìn)行學(xué)習(xí)。然而隨著時代的發(fā)展,惡意軟件為了躲避檢測而采用了各種特征隱匿手段以抹除靜態(tài)特征。但是惡意軟件這種混淆檢測的方法仍舊無法隱藏其區(qū)別于良性軟件的動態(tài)行為模式,如特定的函數(shù)調(diào)用序列。因此本研究將選用動態(tài)檢測方法來對樣本進(jìn)行行為特征提取,并以此嵌入成圖進(jìn)行學(xué)習(xí)。在本節(jié)中我們將對整個模型的核心組成進(jìn)行介紹。
整體的數(shù)據(jù)準(zhǔn)備流程如圖1所示。其中Cuckoo sandbox[24]是一個開源的惡意文件自動化分析系統(tǒng),對于上傳的文件能記錄其在虛擬機(jī)動態(tài)運(yùn)行后的進(jìn)程、網(wǎng)絡(luò)、文件等行為,對于初步分析惡意軟件并獲取其動態(tài)特征有很大幫助。本文通過在virusshare網(wǎng)站中下載相關(guān)惡意軟件,將得到的惡意軟件上傳至virustotal網(wǎng)站進(jìn)行分類,得到其標(biāo)簽。
同時將惡意軟件送入cuckoo沙箱中進(jìn)行分析,得到的動態(tài)運(yùn)行報告如圖2所示。
圖1 數(shù)據(jù)準(zhǔn)備
本文對其中的“category”,“api”,“time”,“tid”進(jìn)行提取,轉(zhuǎn)化為csv格式后,得到了惡意軟件的初始特征數(shù)據(jù)。
在得到上述樣本的各種標(biāo)簽以及特征后,便開始著手構(gòu)建惡意軟件的圖表示。
(1)特征選擇。本文選擇了對于節(jié)點(diǎn)的嵌入方法來表示惡意軟件的API節(jié)點(diǎn)向量。首先我們繼承了Tu等人[9]的工作,根據(jù)API函數(shù)的調(diào)用序列,將各API函數(shù)嵌入為圖的節(jié)點(diǎn)。然后使用節(jié)點(diǎn)嵌入的方法將每個節(jié)點(diǎn)節(jié)點(diǎn)嵌入為獨(dú)特的向量表示。
圖2 行為報告
本文使用的節(jié)點(diǎn)嵌入方法是基于Deepwalk[10],并結(jié)合了NLP的一種新的基于惡意軟件API的圖嵌入方法。首先在每個圖中隨機(jī)選取一個節(jié)點(diǎn),對該節(jié)點(diǎn)進(jìn)行隨機(jī)游走并對已走過的節(jié)點(diǎn)進(jìn)行標(biāo)記。當(dāng)走到最后一個節(jié)點(diǎn)沒有路徑的時候退回前一個節(jié)點(diǎn)尋找其他路徑,每個圖截取其中的前n(超參數(shù))個節(jié)點(diǎn)組成該文件的路徑,在對所有的圖進(jìn)行隨機(jī)游走之后拼接在一起,得到整個語料庫的路徑,最后對這個路徑進(jìn)行一種改進(jìn)的fastText處理得到每個節(jié)點(diǎn)的嵌入表示作為其第一層特征。本文使用改進(jìn)的fastText方法H(駝峰)-fastText主要是基于API大多是類似“GetAsyncKeyState”的復(fù)合詞,且大多使用駝峰命名法。因此本文將子詞變?yōu)椤?Get”“Async”“Key”“State>”和“
其中Aw為所有子詞的詞庫,zg為該詞語所涉及的子詞的向量表示,最終加和得到該節(jié)點(diǎn)的向量表示。
在進(jìn)行圖表示時,本文另外對模型的邊進(jìn)行了處理,Wüchner等人[11]在文章中指出,在惡意軟件運(yùn)行的時候,極易調(diào)用以下三類的API,ProcessAPI,F(xiàn)ileAPI和RegistryAPI,而且特別當(dāng)這些類型的API連續(xù)調(diào)用時,基本就是在進(jìn)行對電腦較為重要的任務(wù)。因此如果某一條邊的兩端頂點(diǎn)為以上三類節(jié)點(diǎn)時,將該邊提取為一個節(jié)點(diǎn),命名為TypetoType,例如“FiletoFile”。然后將該邊節(jié)點(diǎn)放回至原DeepWalk得到的序列中并進(jìn)行Word2Vec處理,其中API節(jié)點(diǎn)向量不進(jìn)行訓(xùn)練,單獨(dú)訓(xùn)練邊向量。
(2)子圖表示。隨著惡意軟件檢測方法的發(fā)展,惡意軟件作者的水平也在提高,他們可能會使用多線程方法來實(shí)現(xiàn)其最終目標(biāo)。目前,惡意軟件的圖表示主要基于整個惡意軟件調(diào)用序列,而不同的線程的調(diào)用序列可能具有不同的含義。惡意軟件在運(yùn)行時可能會進(jìn)行大量的正常行為,但會分支出某個線程對系統(tǒng)進(jìn)行破壞。因此本文提出采用子圖,識別出具有惡意行為的線程。
本文的方法首先對每個惡意軟件的函數(shù)調(diào)用序列進(jìn)行提取,根據(jù)調(diào)用的時間信息進(jìn)行排序,得到其不同的函數(shù)調(diào)用子圖,如圖3所示。圖中將兩個不同的API調(diào)用序列表示為兩個子圖,作為接下來的圖神經(jīng)網(wǎng)絡(luò)的輸入。但是在對數(shù)據(jù)進(jìn)行處理的時候,出現(xiàn)了一個問題。首先由于每個圖輸入的子圖數(shù)量不同,導(dǎo)致在輸入至全連接層時的維度并不固定。這樣導(dǎo)致整體參數(shù)維度不固定而無法訓(xùn)練。因此我們選擇了類似Transformer中的Padding方法。對于子圖數(shù)量少于應(yīng)有的輸入數(shù)量的情況,直接輸入一個沒有任何邊的子圖進(jìn)行訓(xùn)練,即鄰接矩陣與度矩陣均為0的輸入。
(3)基于圖神經(jīng)網(wǎng)絡(luò)的分類器。在得到每個惡意軟件的圖表示后,便開始構(gòu)建我們的圖神經(jīng)網(wǎng)絡(luò)分類器。如圖4所示,首先我們對每個子圖單獨(dú)進(jìn)行兩層圖卷積[12],如公式(2)所示:
圖3 生成子圖
圖4 圖表示分類方法
在經(jīng)過卷積后,各個節(jié)點(diǎn)均吸收了其鄰居節(jié)點(diǎn)的特征,此時使用TopK[14]的方法來對圖進(jìn)行池化。TopK的思路是指對該圖分類越不重要的節(jié)點(diǎn)則丟棄,而保留對分類結(jié)果重要的節(jié)點(diǎn),其中池化率K是一個超參數(shù),K∈(0,1)。在進(jìn)行圖卷積的之后,我們設(shè)立一個權(quán)重值以表示其節(jié)點(diǎn)的重要程度并對其進(jìn)行降序排序。如公式(3)所示:
Mask操作相當(dāng)于在原始的數(shù)據(jù)上蓋上一層掩膜,從而屏蔽或選擇一些特定元素。應(yīng)用于本文方法中則是屏蔽掉那些被池化的節(jié)點(diǎn)的鄰接矩陣A和特征向量X。每個子圖在進(jìn)行兩次卷積和池化后,得到K1*K2*N個節(jié)點(diǎn)(K1,K2∈(0,1),且均為超參數(shù)),這些節(jié)點(diǎn)有著他們的特征值,以及屬于哪個圖的標(biāo)識。為了統(tǒng)一所有圖的維度,使用平均池化的方法,如公式(7)所示,對每一層池化后的節(jié)點(diǎn)的向量進(jìn)行讀出:
在本文的模型中,經(jīng)歷了多次池化的過程,每一次池化都會丟失一定的節(jié)點(diǎn)信息。為了使本文的模型也能收錄全部丟棄了的節(jié)點(diǎn)的信息,本文對得到的信息進(jìn)行一次性的聚合,具體方式為將各子圖池化后的值拼接起來:
最終,得到了該樣本經(jīng)過圖神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)后的向量表示,然后將該向量輸送至前饋神經(jīng)網(wǎng)絡(luò)中降維至類別數(shù)量,再對其進(jìn)行Softmax處理得到每個類別的概率。
本文進(jìn)行了多組實(shí)驗(yàn),同時對數(shù)據(jù)集也進(jìn)行了多種的處理。為了使我們的實(shí)驗(yàn)的結(jié)果更加令人信服,本文使用了同種數(shù)據(jù)對其他的模型(LSTM,CNN等)進(jìn)行了實(shí)驗(yàn),并將我們的準(zhǔn)確率與這些模型進(jìn)行了對比。
本文使用前文所示的方法共獲取數(shù)據(jù)集總量為13996個。其中各類惡意軟件樣本分布情況如圖5所示。
圖5 軟件類型分布表
本文一共使用以下指標(biāo)對我們的實(shí)驗(yàn)進(jìn)行評估,準(zhǔn)確率(ACC),召回率(R),精度(P)以及F1_score(F1)。本文做了兩類實(shí)驗(yàn),首先是對是否為惡意軟件的二分類,其次是具體屬于哪個種類的8分類。同時還對自身的實(shí)驗(yàn)進(jìn)行了消融實(shí)驗(yàn),也對其他模型進(jìn)行了橫向?qū)Ρ取?/p>
我們的模型為WMALG(Windows Malware Graph),SAGp為本文所使用的的初始模型SAGp[33](Self-Attention Graph pool)。在二分類方面,從表1,表2的實(shí)驗(yàn)結(jié)果可以看出本文所提出的兩種方法均可以有效的提高檢測效果。首先相對于經(jīng)典的機(jī)器學(xué)習(xí)而言,本文所使用的數(shù)據(jù)集并不是很適合,我們僅提取了兩類特征,一是線程數(shù)量,另一個為惡意等級為3的API的數(shù)量的特征,因此所提供的參考意義不大。但與CNN、LSTM等神經(jīng)網(wǎng)絡(luò)模型的實(shí)驗(yàn)結(jié)果進(jìn)行對比,分類的各項(xiàng)指標(biāo)均有著很大提升,而相比于MAG同樣使用圖神經(jīng)網(wǎng)絡(luò)進(jìn)行分類的模型也有著2.5%左右的提高。在表2的消融實(shí)驗(yàn)中,也進(jìn)一步驗(yàn)證了本文所使用的兩種惡意軟件圖嵌入方法確實(shí)有效。而對于8分類而言,表3可以看出本文的方法相對于其他的深度學(xué)習(xí)模型而言有著較大提升,但受限于數(shù)據(jù)集的分布不均勻,最終的F1值和ACC值并不是很高。但總體來說,本文所提出的模型對于檢測效果的提升是十分有效的。
表1 二分類對比實(shí)驗(yàn)
表2 二分類消融實(shí)驗(yàn)
表3 八分類對比實(shí)驗(yàn)
圖6 準(zhǔn)確率,召回率以及精度
圖7 SAGp 與WMALG 模型的準(zhǔn)確率對比
圖8 SAGp 與WMALG 模型的Loss 對比
惡意軟件已經(jīng)成為了最具威脅性的網(wǎng)絡(luò)安全問題之一,給個人、企業(yè)以及國家的信息安全造成嚴(yán)重威脅。針對此問題,本文提出了一種基于圖表示學(xué)習(xí)的惡意軟件檢測方法,使用基于多線程的多子圖表示方法以及添加邊節(jié)點(diǎn)的方式將惡意軟件表示為圖結(jié)構(gòu),并輸入至圖神經(jīng)網(wǎng)絡(luò)中進(jìn)行分類。實(shí)驗(yàn)證明,本文提出的方法的檢測效率對比其他模型有著不小的提升。