劉金鑫 黃瑋 范文慶 鞏微 董航
(1.中國(guó)傳媒大學(xué)計(jì)算機(jī)與網(wǎng)絡(luò)空間安全學(xué)院 北京市 100024)
(2.中國(guó)移動(dòng)通信集團(tuán)公司信息安全管理與運(yùn)行中心 北京市 100053)
根據(jù)國(guó)家互聯(lián)網(wǎng)應(yīng)急中心(CNCERT)發(fā)布的《2019年我國(guó)互聯(lián)網(wǎng)網(wǎng)絡(luò)安全態(tài)勢(shì)綜述》顯示,2019年全國(guó)發(fā)現(xiàn)惡意程序的數(shù)目超過(guò)6200 萬(wàn)個(gè),單日平均傳播次數(shù)高達(dá) 824 萬(wàn)余次,涉及 66 個(gè)惡意程序家族,致使我國(guó)約 582 萬(wàn)臺(tái)主機(jī)遭受感染。惡意程序的不斷傳播嚴(yán)重威脅著我國(guó)的網(wǎng)絡(luò)空間安全,因此如何高效準(zhǔn)確檢測(cè)惡意程序是一項(xiàng)亟待解決的問(wèn)題。
惡意程序的檢測(cè)方法可以分為靜態(tài)檢測(cè)方法和動(dòng)態(tài)檢測(cè)方法,靜態(tài)檢測(cè)方法是指在不運(yùn)行惡意程序的情況下直接分析惡意程序,通常使用的靜態(tài)特征包括字符串特征、函數(shù)特征和字節(jié)碼特征[1]等,但是靜態(tài)檢測(cè)方法在面對(duì)采用混淆技術(shù)的惡意程序時(shí),檢測(cè)的準(zhǔn)確率會(huì)下降,因此眾多學(xué)者將目光轉(zhuǎn)向動(dòng)態(tài)檢測(cè)方法。
動(dòng)態(tài)檢測(cè)方法是指使用虛擬機(jī)或者沙箱對(duì)計(jì)算機(jī)的真實(shí)環(huán)境進(jìn)行模擬,然后將惡意程序放入構(gòu)建好的虛擬環(huán)境中運(yùn)行,借助搭建在虛擬環(huán)境中的行為監(jiān)控工具對(duì)樣本的行為信息進(jìn)行捕獲,進(jìn)而獲得動(dòng)態(tài)特征[2]。目前惡意程序的動(dòng)態(tài)特征通常以API 函數(shù)名組成的調(diào)用序列為主[3],然而僅使用 API 函數(shù)名描述惡意程序行為特征并不全面,需要結(jié)合API 參數(shù)才能真正反映出一個(gè)程序是否具有惡意性,將API 函數(shù)名與參數(shù)相結(jié)合可以更好地理解 API 調(diào)用序列之間的關(guān)系。因此,本文提出了一種基于動(dòng)態(tài)分析和深度學(xué)習(xí)相結(jié)合的惡意程序檢測(cè)方法,通過(guò)搭建自動(dòng)化分析沙箱,從沙箱的分析報(bào)告中提取惡意程序的API 調(diào)用序列,在此基礎(chǔ)上,基于卷積神經(jīng)網(wǎng)絡(luò)構(gòu)建惡意程序檢測(cè)模型,本文的主要工作概括如下:
(1)構(gòu)建Cuckoo 沙箱模擬惡意程序運(yùn)行環(huán)境,通過(guò)沙箱提供的json 格式分析報(bào)告獲取惡意程序運(yùn)行時(shí)的API 調(diào)用序列;
(2)改進(jìn)API 調(diào)用序列提取方法,提取惡意程序運(yùn)行時(shí)的API 類(lèi)型、API 函數(shù)名和參數(shù),從而全面獲取惡意程序的行為特征;
圖1:惡意程序檢測(cè)框架
圖2:卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
圖3:引入?yún)?shù)特征的準(zhǔn)確率曲線
圖4:引入?yún)?shù)特征和未引入?yún)?shù)特征的結(jié)果對(duì)比
(3)對(duì)提取的API 調(diào)用序列進(jìn)行預(yù)處理,將API 調(diào)用序列視為單詞,提出了基于詞嵌入的方法,將API 調(diào)用序列轉(zhuǎn)換為詞向量;
(4)針對(duì)于獲得的特征向量,構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)檢測(cè)模型實(shí)現(xiàn)對(duì)惡意程序的檢測(cè),并與未考慮參數(shù)特征的檢測(cè)結(jié)果進(jìn)行對(duì)比。
本文設(shè)計(jì)的基于動(dòng)態(tài)分析與深度學(xué)習(xí)結(jié)合的惡意程序檢測(cè)框架如圖1 所示,在動(dòng)態(tài)分析階段,將由良性程序與惡意程序組成的樣本數(shù)據(jù)集上傳至Cuckoo 沙箱[4]進(jìn)行動(dòng)態(tài)分析后,得到被檢測(cè)程序的分析報(bào)告。在特征提取與預(yù)處理階段,從沙箱提供的分析報(bào)告中提取API 序列特征,具體包括API 函數(shù)的類(lèi)型、API 函數(shù)名和API參數(shù),把參數(shù)中的特殊字符去除后,將API 調(diào)用序列看作單詞,使用Word2vec 模型[5]將API 調(diào)用序列轉(zhuǎn)化為詞向量作為檢測(cè)模型的輸入。在模型訓(xùn)練與檢測(cè)階段,本文選擇使用卷積神經(jīng)網(wǎng)絡(luò)來(lái)構(gòu)建惡意程序檢測(cè)模型,將動(dòng)態(tài)分析提取的樣本數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練和測(cè)試,驗(yàn)證該檢測(cè)框架的有效性。
應(yīng)用程序在Cuckoo 沙箱內(nèi)分析完成后沙箱會(huì)提供json 格式的動(dòng)態(tài)分析報(bào)告,良性程序和惡意程序運(yùn)行時(shí)的行為特點(diǎn)可以從API函數(shù)調(diào)用上進(jìn)行體現(xiàn),由于分析報(bào)告的信息量巨大,因此需要對(duì)分析報(bào)告進(jìn)行預(yù)處理,由于分析報(bào)告的內(nèi)容高度格式化,預(yù)處理的重點(diǎn)是提取運(yùn)行過(guò)程中的所有API 調(diào)用包括API 類(lèi)型、API 名稱(chēng)以及API 參數(shù),通過(guò)對(duì)分析報(bào)告的結(jié)構(gòu)和各字段的含義進(jìn)行研究總結(jié),API 調(diào)用情況在分析報(bào)告中的“/behavior/processes/calls/”字段下展開(kāi),其中字段“category”為API 的類(lèi)型,主要包含了網(wǎng)絡(luò)(network),進(jìn)程(process),文件(file),注冊(cè)表(registry),服務(wù)(services)和資源(resource)6 大類(lèi),字段“api”表示API 的名稱(chēng),字段“arguments”為API 的參數(shù),而程序運(yùn)行時(shí)進(jìn)程之間的調(diào)用關(guān)系可以在 “/behavior/processtree”字段下找到,依據(jù)“processtree”字段可以掌握進(jìn)程之間的調(diào)用關(guān)系,再結(jié)合“/behavior/processes/calls/”下的“api”字段,可以得到某一進(jìn)程下的API 調(diào)用序列,再根據(jù)進(jìn)程調(diào)用的時(shí)間先后順序?qū)λ械腁PI 調(diào)用序列進(jìn)行排列和記錄。
對(duì)于API 函數(shù)的類(lèi)別和API 函數(shù)名稱(chēng)均為獨(dú)立的單詞,但是對(duì)于提取到的API 的參數(shù)來(lái)說(shuō),則存在多種類(lèi)型例如文件路徑,URL鏈接,注冊(cè)表鍵值等,因此需要通過(guò)正則表達(dá)式對(duì)參數(shù)中的特殊字符進(jìn)行處理,將參數(shù)分割成單詞的形式。對(duì)于文件路徑來(lái)說(shuō),通常以盤(pán)符開(kāi)頭,以“\”符號(hào)將路徑完整串聯(lián)起來(lái),因此在處理的時(shí)候需要將盤(pán)符和“\”符號(hào)進(jìn)行刪除,對(duì)于URL 鏈接,通常以“http://”或者“https://”開(kāi)頭,以“.”進(jìn)行連接,以“/”符號(hào)結(jié)尾,因此也需要?jiǎng)h除這四個(gè)部分,對(duì)于注冊(cè)表鍵值通常以“HKEY_”開(kāi)頭以“”進(jìn)行連接,需要將“_”和“”符號(hào)進(jìn)行刪除,此外對(duì)于文件的擴(kuò)展名,例如“.exe”、“.ini”等,本文的處理方法是將“.”去除,保留擴(kuò)展名。通過(guò)對(duì)惡意程序API 調(diào)用序列進(jìn)行處理之后,就將所有的API 調(diào)用信息轉(zhuǎn)變成了獨(dú)立的單詞,也就便于后續(xù)借助自然語(yǔ)言處理方法,從語(yǔ)義層面對(duì)API 調(diào)用進(jìn)行分析,挖掘區(qū)分惡意程序與良性程序的行為模式。
在基于卷積神經(jīng)網(wǎng)絡(luò)的檢測(cè)模型中,需將從Cuckoo 沙箱分析報(bào)告中提取的API 調(diào)用記錄轉(zhuǎn)換成特征向量作為算法的輸入,API調(diào)用記錄經(jīng)過(guò)預(yù)處理后由單詞組成,而將單詞或者是詞語(yǔ)映射成的數(shù)字向量被稱(chēng)為詞向量,因此本文考慮使用Word2vec 詞向量模型,模型的原理是通過(guò)從一段無(wú)標(biāo)注的自然文本中統(tǒng)計(jì)詞頻和詞的搭配來(lái)建立一個(gè)語(yǔ)言模型,Word2vec 的本質(zhì)是簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)模型,由輸入層、隱藏層和輸出層組成,經(jīng)過(guò)訓(xùn)練學(xué)習(xí)之后得到的詞向量模型,包含了輸入文本的語(yǔ)義和語(yǔ)法信息。具體做法是將預(yù)處理階段處理好的API 調(diào)用信息構(gòu)成語(yǔ)料庫(kù)作為訓(xùn)練數(shù)據(jù)來(lái)訓(xùn)練Word2vec 模型。利用訓(xùn)練出的詞向量模型,對(duì)API 調(diào)用中的每一個(gè)單詞元素進(jìn)行向量化處理,得到一個(gè)float 型數(shù)組,這樣將所有單詞轉(zhuǎn)換成向量之后,也就得到了由完整API 調(diào)用序列轉(zhuǎn)換成的特征矩陣,進(jìn)而輸入卷積神經(jīng)網(wǎng)絡(luò)模型進(jìn)行分類(lèi)。
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)是深度學(xué)習(xí)算法之一,廣泛應(yīng)用于文本分類(lèi),語(yǔ)音識(shí)別,圖像處理等領(lǐng)域[6],由于本文提取的API 調(diào)用序列可以視為文本信息,因此可以借助卷積神經(jīng)網(wǎng)絡(luò)將惡意程序檢測(cè)問(wèn)題轉(zhuǎn)變?yōu)槲谋痉诸?lèi)問(wèn)題,本文設(shè)計(jì)的網(wǎng)絡(luò)模型結(jié)構(gòu)如圖2 所示:輸入層是由API 調(diào)用序列經(jīng)過(guò)Word2vec 模型訓(xùn)練得到的特征向量矩陣,將其作為卷積神經(jīng)網(wǎng)絡(luò)的輸入,在本文的網(wǎng)絡(luò)設(shè)計(jì)中,對(duì)于卷積層與池化層層數(shù)的設(shè)計(jì)需要考慮惡意代碼的API 調(diào)用數(shù)目,如果卷積池化的操作過(guò)少會(huì)出現(xiàn)模型難以提取到高階特征的情況,但是如果卷積池化的操作過(guò)多,會(huì)造成設(shè)計(jì)的網(wǎng)絡(luò)冗余,耗費(fèi)計(jì)算資源。綜合考慮,本文選擇設(shè)計(jì)三層卷積層和三層池化層,即連續(xù)進(jìn)行三次卷積和池化的操作來(lái)不斷迭代高階特征,卷積核的大小按照卷積層層數(shù)的增加逐層遞增,第一層卷積層使用16 個(gè)3*3 的卷積核,第二層卷積層使用32 個(gè)4*4 的卷積核,第三層使用64 個(gè)5*5 的卷積核。
關(guān)于激活函數(shù)的選擇,由于ReLU 函數(shù)相較于Sigmoid 函數(shù)和Tanh 函數(shù)具備收斂快,計(jì)算量小,可以降低參數(shù)間的耦合關(guān)系的優(yōu)勢(shì),因此本文選擇ReLU 函數(shù)。
關(guān)于池化層的設(shè)計(jì),本文將池化窗口大小設(shè)置為2*2,在池化方法的選擇上考慮到傳統(tǒng)的最大池化方法的缺點(diǎn)在于會(huì)丟失特征項(xiàng)頻次信息和位置信息,因?yàn)樽畲蟪鼗椒ㄖ槐A糇畲笾?,而在本文的研究?jī)?nèi)容中,API 的調(diào)用次數(shù)和API 調(diào)用出現(xiàn)的先后順序?qū)τ谂袆e程序的惡意性是有一定影響的。因此選用K-max-pooling 池化方法,在本文中K 設(shè)置為2,即保留特征值排名第一和第二的特征,選擇這種池化方式的目的是為了盡可能多地保留特征的頻次和位置信息,并且綜合考慮時(shí)間和空間消耗,這種池化方式對(duì)模型的檢測(cè)效率并無(wú)太大影響。
在經(jīng)過(guò)三次卷積和池化處理后接入一個(gè)丟棄層,目的是為了防止出現(xiàn)過(guò)擬合的情況,丟棄層的參數(shù)通常設(shè)置為0.5,最后連接一層softmax 全連接層給出分類(lèi)的結(jié)果,關(guān)于全連接層的損失函數(shù)的選擇,由于本文的研究問(wèn)題是對(duì)未知程序進(jìn)行二分類(lèi),即最后的分類(lèi)結(jié)果只有正例(惡意樣本)和負(fù)例(良性樣本),并且兩者預(yù)測(cè)概率之和為1,因此損失函數(shù)選擇交叉熵函數(shù)。
為了驗(yàn)證本文提出的惡意程序檢測(cè)模型的有效性,本文使用公開(kāi)數(shù)據(jù)集對(duì)檢測(cè)模型進(jìn)行評(píng)估,數(shù)據(jù)集包含惡意程序和良性程序,惡意程序選取自免費(fèi)惡意樣本網(wǎng)站VirusShare,惡意程序樣本數(shù)為3270 個(gè),良性程序選取自PortableFreeware,良性程序樣本數(shù)為1890 個(gè),共計(jì)5160 個(gè)。本文選擇Cuckoo Sandbox 2.0.7 作為驅(qū)動(dòng)惡意程序動(dòng)態(tài)分析的基礎(chǔ)環(huán)境,Cuckoo 沙箱主機(jī)端部署在硬件環(huán)境為Ubuntu 服務(wù)器的物理機(jī)器上,操作系統(tǒng)為Ubuntu 16.04 LTS(64位)。Cuckoo 沙箱客戶端部署在硬件環(huán)境為基于Virtualbox 搭建的Windows 主機(jī)上,操作系統(tǒng)為Windows7 專(zhuān)業(yè)版(64 位)。算法模型驗(yàn)證環(huán)境搭建在基于Windows10(64 位)的個(gè)人PC 中,算法實(shí)現(xiàn)部分基于Python3.7、Tensorflow 1.14.0 和Keras 2.4.3 進(jìn)行構(gòu)建。
為了驗(yàn)證本模型的檢測(cè)效果,本文使用3.1 中介紹的數(shù)據(jù)集進(jìn)行實(shí)驗(yàn),算法執(zhí)行時(shí)將80%的樣本數(shù)據(jù)作為訓(xùn)練集,20%的樣本數(shù)據(jù)作為測(cè)試集,訓(xùn)練集與測(cè)試集的準(zhǔn)確率的變化趨勢(shì)如圖3 所示。
通過(guò)觀察曲線變化規(guī)律可以發(fā)現(xiàn),在訓(xùn)練初期階段,模型在訓(xùn)練集上的準(zhǔn)確率已經(jīng)達(dá)到了98%,隨著訓(xùn)練次數(shù)的增加,訓(xùn)練集的準(zhǔn)確率在96%至99%之間浮動(dòng),訓(xùn)練集上的平均準(zhǔn)確率為99.08%。模型在測(cè)試集上的準(zhǔn)確率通過(guò)曲線可知,在測(cè)試初期階段達(dá)到了92%,而后準(zhǔn)確率趨于穩(wěn)定,模型在測(cè)試集上的平均準(zhǔn)確率為94.19%,說(shuō)明本文提出的卷積神經(jīng)網(wǎng)絡(luò)模型能有效檢測(cè)惡意程序。同時(shí)為了驗(yàn)證本文提出的結(jié)合API 參數(shù)的惡意程序檢測(cè)方法要優(yōu)于只提取API 函數(shù)名的檢測(cè)方法,本文進(jìn)行了對(duì)照實(shí)驗(yàn),即使用2.2 節(jié)介紹的提取方法只提取API 的函數(shù)名作為特征,使用相同的卷積神經(jīng)網(wǎng)絡(luò)模型進(jìn)行實(shí)驗(yàn),兩種方法的準(zhǔn)確率的對(duì)比結(jié)果如圖4所示。
通過(guò)觀察曲線可以發(fā)現(xiàn),在僅使用API 函數(shù)名作為特征的情況下,模型在訓(xùn)練集上的準(zhǔn)確率的變化幅度較大,檢測(cè)準(zhǔn)確率不穩(wěn)定,而模型在測(cè)試集上的準(zhǔn)確率根據(jù)圖中曲線變化規(guī)律可知,在測(cè)試階段初期其準(zhǔn)確率與增加參數(shù)特征的準(zhǔn)確率差距不大,但是隨著測(cè)試次數(shù)的增加,不增加參數(shù)特征的模型的準(zhǔn)確率開(kāi)始低于增加參數(shù)特征的模型的準(zhǔn)確率,平均準(zhǔn)確率為92.63%,因此證明了引入API參數(shù)特征的檢測(cè)方法能提高對(duì)惡意程序的識(shí)別率。同時(shí)由于兩種特征模型的平均準(zhǔn)確率均達(dá)到了92%以上也證明了本文提出的將動(dòng)態(tài)分析與深度學(xué)習(xí)相結(jié)合的惡意程序檢測(cè)方法是行之有效的。
本文提出了一種基于動(dòng)態(tài)分析和深度學(xué)習(xí)相結(jié)合的惡意程序檢測(cè)方法,改進(jìn)了只提取API 函數(shù)名的特征提取方式,從Cuckoo 沙箱提供的分析報(bào)告中提取API 函數(shù)類(lèi)型、API 函數(shù)名以及API 參數(shù),力求全面刻畫(huà)惡意程序行為特征。對(duì)API 序列進(jìn)行預(yù)處理后,將API 調(diào)用序列轉(zhuǎn)換為單詞,使用Word2vec 模型將單詞轉(zhuǎn)變?yōu)樵~向量輸入至卷積神經(jīng)網(wǎng)絡(luò)中。為了評(píng)估檢測(cè)模型的有效性,本文收集了5160 個(gè)樣本數(shù)據(jù)用于模型的訓(xùn)練與驗(yàn)證,在測(cè)試集上的平均準(zhǔn)確率達(dá)到了94.19%。同時(shí)為了驗(yàn)證改進(jìn)的特征提取方法的檢測(cè)效果,本文僅使用API 函數(shù)名作為特征,進(jìn)行同樣的實(shí)驗(yàn),在測(cè)試集上的平均準(zhǔn)確率為92.63%,證明了本文提出的改進(jìn)方法能提高對(duì)惡意程序檢測(cè)的準(zhǔn)確率。