彭偉
(安徽工貿(mào)職業(yè)技術(shù)學(xué)院 計算機(jī)信息工程系,安徽 淮南 232007)
由于惡意軟件的攻擊導(dǎo)致的安全漏洞繼續(xù)升級,構(gòu)成了這個數(shù)字時代的一個主要安全問題。惡意軟件攻擊呈指數(shù)增長,許多計算機(jī)用戶、企業(yè)和政府受到影響,因此惡意軟件檢測是一個熱門的研究課題。當(dāng)前,基于惡意軟件簽名和行為模式的靜態(tài)、動態(tài)分析的惡意軟件檢測解決方案非常耗時,并且無法實(shí)時識別未知惡意軟件。而且惡意軟件會使用變形等規(guī)避技術(shù)來快速更改惡意軟件行為并生成大量新惡意軟件。為了實(shí)現(xiàn)高效、全自動的惡意軟件識別系統(tǒng),研究者們開始采用數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)技術(shù)。深度學(xué)習(xí)算法具有強(qiáng)大的學(xué)習(xí)能力,本文基于堆疊自編碼器,提出了一種高魯棒性惡意軟件識別算法。自編碼器是一種無監(jiān)督的學(xué)習(xí)方法,與圖神經(jīng)網(wǎng)絡(luò)等半監(jiān)督學(xué)習(xí)算法相比,自編碼器有著更低的訓(xùn)練成本,且能夠?qū)W習(xí)并識別未知的惡意軟件,具有更好的魯棒性。
所提識別算法的流程如圖1所示,由三個階段組成,即特征選擇階段、圖生成階段和深度學(xué)習(xí)階段。
創(chuàng)建了一個包含1078個正常軟件和128個惡意軟件樣本的數(shù)據(jù)集。所有惡意軟件樣本均來自威脅情報平臺,所有正常軟件來自各種官方App商店。
圖1識別算法流程
應(yīng)用程序包含一系列的操作碼,這些操作碼是在設(shè)備處理單元上執(zhí)行的指令。利用Objdump作為反匯編程序來提取操作碼s。創(chuàng)建n元模型操作碼序列是基于反匯編代碼對惡意軟件進(jìn)行分類的常用方法[1]。長度為n的基本特征的數(shù)量是Cn,其中C是指令集的大小。因此,n的增加將導(dǎo)致特征數(shù)量劇增,減小特征的大小能增加了檢測的魯棒性和有效性。
因此,需要先應(yīng)用特征選擇算法找到最佳特征,以減少特征集。信息增益(IG)是一種信息理論方法,通過根據(jù)分類問題中可用的信息內(nèi)容量對它們進(jìn)行排序來選擇全局特征。IG使用統(tǒng)計工具來選擇全局特征,而不考慮類別信息。但在數(shù)據(jù)集不平衡的情況下,全局特征選擇方法忽略了類別特征,這可能會使系統(tǒng)效率降低。
因此,為了兼顧類別信息,采用類信息增益(CIG)[2]來克服全局特征選擇不完善問題,其計算方式如公式(1)所示。
(1)
提取了操作碼序列的1元模型和 2元模型,其數(shù)量分別為4543個和610109個。與此同時,還分別計算了信息增益CIG(f,ci)和CIG(f,c1-i)。由于第80個特征和第81個特征的信息增益的差別較大,因此選擇了前80個特征。
控制流圖(CFG)是一種數(shù)據(jù)結(jié)構(gòu),表示可執(zhí)行文件中操作碼的順序。圖G=(V,E)由節(jié)點(diǎn)集合V和邊集合E組成?,F(xiàn)有研究表明,圖的表示方式在惡意軟件檢測中是很有用的[3]。Vi∈{fj|j=1,2,…,80}是頂點(diǎn),而邊Eij的值表示頂點(diǎn)(特征)Vi和Vj之間的關(guān)系。
為了構(gòu)造操作碼s圖,首先需要計算邊的值。通常,當(dāng)樣本操作碼序列中的Vi出現(xiàn)在Vj之后時,Eij的值會增加1。這樣一來,將能為數(shù)據(jù)集中的每個樣本應(yīng)用程序生成鄰接矩陣。在對矩陣的行進(jìn)行歸一化后,Eij的值將變成了Vi出現(xiàn)的概率。
這種做法雖然簡單,卻有比較明顯的缺點(diǎn)。對于某些軟件的操作碼來說,在特征選擇后簡單地將Eij值遞增1會產(chǎn)生一個稀疏的鄰接矩陣,這種稀疏的表示方式并不適合分類任務(wù)。此外,惡意軟件開發(fā)人員可能會注入無用的垃圾操作碼,致使算法產(chǎn)生錯誤的圖。
因此,提出了一個啟發(fā)式規(guī)則來計算邊的值,如式(2)所示。該啟發(fā)式規(guī)則的基本要素是操作碼s之間的距離:較長的距離會產(chǎn)生較小的Eij。α是調(diào)整操作碼距離影響的權(quán)重參數(shù)。此外,α可以控制操作碼s距離對檢測率的影響。式(2)將為每個給定的惡意軟件和良性樣本生成82個頂點(diǎn)的圖形,作為該方法的深度學(xué)習(xí)階段的輸入。算法1描述了每個樣本的圖生成過程。
(2)
算法1輸入:樣本sample, 特征feature輸出:圖G1:k =|feature|;2:G =?3:for i in k do4: Vi=Fi5: for j in k do6: Vi=Fi7: CalEdgeValue(); //利用公式(2)計算邊的值8: end for9:end for10:Normalize(G); //歸一化11:return G;
1.3.1 矢量化 作為用于表示頂點(diǎn)之間關(guān)系的復(fù)雜數(shù)據(jù)結(jié)構(gòu),圖是機(jī)器學(xué)習(xí)中的普遍數(shù)據(jù)類型,不過很少有數(shù)據(jù)挖掘和深度學(xué)習(xí)算法接受圖作為輸入[4]。因此,一種可能的替代方案是將圖形嵌入向量空間。
2017年6月,在湖南通道縣木腳青錢柳生產(chǎn)合作社基地采集7年生青錢柳老葉(枝條頂端倒數(shù)的第6~8片綠葉)與嫩葉(新冒芽的兩葉一心),每個樣品來自3個不同的單株.收集到的樣本立即在液態(tài)氮冷凍、儲存在-80℃.使用mirVana 試劑盒 (Ambion公司)提取總RNA.使用Agilent 2100生物分析儀(Agilent Technologies,Santa Clara,CA,USA)評估RNA完整性,RNA 完整性較好的樣品 (RIN≥7)用于進(jìn)行后續(xù)分析.
特征向量和特征值是圖譜中的兩個特征元素,它們可以將圖的鄰接矩陣線性轉(zhuǎn)換為向量空間,如式(3)所示。
Av=λv
(3)
其中,v、λ和A分別表示特征向量、特征值和圖的鄰接。為了獲得生成的CGF結(jié)構(gòu)的信息,創(chuàng)建了一個圖以闡述數(shù)據(jù)集中所有樣本的累積。該圖由兩個主要的對角構(gòu)建塊(用紅色邊框標(biāo)記)組成,表明給定的樣本中存在兩個主要數(shù)據(jù)分布?;趫D的譜理論,在這種情況之下,矩陣的特征值之間存在一個明確的特征值差。
因此,與其他剩余的特征向量相比,具有較大特征值差的兩個特征向量包含了更多鄰接矩陣的信息,可以用來表示整個矩陣。此外,在學(xué)習(xí)階段,由于惡意軟件和正常軟件特征值的數(shù)據(jù)分布不同,將使用特征值提高識別算法的性能。
1.3.2 深度學(xué)習(xí)算法 深度學(xué)習(xí)(DL)是神經(jīng)網(wǎng)絡(luò)(NN)的進(jìn)化版本。標(biāo)準(zhǔn)NN包括幾個或多個簡單的、相互連接的神經(jīng)元節(jié)點(diǎn)。DL專注于隱藏層的能力和功能,專注于更深入的數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)。深度學(xué)習(xí)最近已被用于各種應(yīng)用,例如語音識別和機(jī)器視覺。雖然基于淺層學(xué)習(xí)架構(gòu)的分類方法(如支持向量機(jī)、貝葉斯分類器、決策樹和人工神經(jīng)網(wǎng)絡(luò))可以用于惡意軟件的識別,但是深度學(xué)習(xí)由于其強(qiáng)大的學(xué)習(xí)能力,可以實(shí)現(xiàn)更好的性能。典型的深度學(xué)習(xí)模型包括堆疊自編碼器、深度信念網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)等。探討了一種采用堆疊自編碼器的深度學(xué)習(xí)架構(gòu),該架構(gòu)是由一組自編碼器組成。
自編碼器是一種用于學(xué)習(xí)有效編碼的人工神經(jīng)網(wǎng)絡(luò),由輸入層、輸出層和一個或多個隱藏層組成。自編碼器的目標(biāo)是將輸入層的表示編碼到隱藏層中,然后將其解碼到輸出層。隱藏層可以充當(dāng)特征空間的另一種表示,并且由于隱藏層比輸入層具有更少節(jié)點(diǎn),輸入的數(shù)據(jù)會被隱藏層壓縮。圖2示出了具有一個輸入層、一個隱藏層和一個輸出層的單層自編碼器模型。
(4)
編碼器fθ將輸入xi變換為隱藏表示向量yi,具有以下的形式:
yi=fθ(xi)=s(Wxi+b)
(5)
其中,W是一個d0×d1的權(quán)重矩陣,d1是隱藏層的神經(jīng)元數(shù)量,b是偏移向量。接下來,解碼器將隱藏層的輸出yi作為輸入,解碼器具有以下的形式:
zi=gθ'(xi)=s(W'yi+b')
(6)
其中,W'是一個d1×d0的權(quán)重矩陣,b'是偏移向量。一般來說,隱藏層的神經(jīng)元數(shù)量遠(yuǎn)小于輸入和輸出層的神經(jīng)元數(shù)量。當(dāng)數(shù)據(jù)經(jīng)過堆疊自編碼器網(wǎng)絡(luò)時,會被隱藏層壓縮,然后會被重構(gòu)。目標(biāo)是盡量減少重構(gòu)的誤差,誤差具有以下形式:
(7)
算法2展示了自編碼器的訓(xùn)練過程。
算法2輸入:訓(xùn)練數(shù)據(jù)集X輸出:參數(shù){W,b}1:iter = 0;2:while iter >= max_iter or E <= threshold do3: for i in X do4: CalHiddenlayer(); //使用公式(5)計算yi5: CalOutLayer(); //使用公式(6)計算zi6: end for7: CalError(); //使用公式(7)計算誤差E8: UpdateParameter();9:end while
為了形成一個深層網(wǎng)絡(luò),通過菊花鏈將自編碼器連接在一起創(chuàng)建一個堆疊自編碼器模型:前一層自編碼器的輸出作為下一層自編碼器的輸入。為了使用堆疊自編碼器進(jìn)行惡意軟件檢測,需要在頂層添加一個分類器。堆疊自編碼器和分類器組成了用于惡意軟件檢測的結(jié)構(gòu)模型,如圖2所示。
圖2 惡意軟件檢測的結(jié)構(gòu)模型
采用基于梯度下降的反向傳播來訓(xùn)練深度網(wǎng)絡(luò)是很簡單的,然而以這種方式訓(xùn)練的深度網(wǎng)絡(luò)具有較差的性能。因此采用貪婪分層無監(jiān)督學(xué)習(xí)算法,以自下而上的方式逐層對深層網(wǎng)絡(luò)進(jìn)行預(yù)訓(xùn)練,然后以自上而下的方式應(yīng)用BP來微調(diào)參數(shù),從而獲得更好的結(jié)果。算法3中描述了使用堆疊自編碼器深度學(xué)習(xí)架構(gòu)進(jìn)行惡意軟件檢測的訓(xùn)練算法。
算法3輸入:訓(xùn)練數(shù)據(jù)集X,隱藏層數(shù)量h,每一層的神經(jīng)元數(shù)量kj輸出:所有參數(shù){W,b}1:for l in 堆疊自編碼器 do2: TrainEachLayer(l); //采用算法2訓(xùn)練每一層神經(jīng)網(wǎng)絡(luò)3:end for4:Initialze(h+1); //初始化第 層網(wǎng)絡(luò)的參數(shù)5:CalClass(X); //對樣本進(jìn)行分類6:BackPropagation(); //進(jìn)行反向傳播
在本節(jié)中,評估了提出的方法的準(zhǔn)確性、精度、召回率和F度量,以驗(yàn)證其在檢測惡意軟件方面的魯棒性。為了驗(yàn)證提出算法的魯棒性,將其與兩個現(xiàn)有的算法進(jìn)行比較,分別是DMBD[5]和GUMD[6]。采用MATLAB作為實(shí)驗(yàn)評估平臺。在驗(yàn)證中使用了10-fold交叉驗(yàn)證,表1展示了算法對比的結(jié)果。顯然,提出的方法優(yōu)于其他兩種算法。
準(zhǔn)確率是評估惡意和正常軟件識別算法性能的一般標(biāo)準(zhǔn)。所提出的方法達(dá)到了99.5%的準(zhǔn)確率。召回率也是一個重要標(biāo)準(zhǔn),本文算法具有高達(dá)98.8%的召回率。與此同時,提出的方法在精度和F度量方面也優(yōu)于其他算法。
圖3是對本文算法進(jìn)行魯棒性評估的實(shí)驗(yàn)結(jié)果。代碼注入技術(shù)對惡意軟件進(jìn)行隨機(jī)代碼注入,以達(dá)到混淆惡意軟件的操作碼、降低惡意操作碼的比例,最終令識別算法失效的目的。由實(shí)驗(yàn)結(jié)果可知,隨著注入代碼的比例增加,算法的各項(xiàng)度量指標(biāo)均有下降。但是下降的幅度并不明顯,這說明了本文算法具有一定的魯棒性。
圖3 算法魯棒性評估結(jié)果
提出的惡意軟件識別算法使用軟件操作碼作為特征,并為每個樣本創(chuàng)建了特征的圖表示。然后使用基于堆疊自編碼器的深度學(xué)習(xí)框架進(jìn)行惡意軟件識別。實(shí)驗(yàn)評估的結(jié)果表明了本文的算法具有較高的魯棒性。未來的工作在于采用更大規(guī)模和更具多樣性的數(shù)據(jù)集,在實(shí)際的應(yīng)用環(huán)境中驗(yàn)證算法的性能。