魏利卓,石春竹,許鳳凱,張慕榕,郝 嬌
(中國電子信息產業集團有限公司第六研究所,北京100083)
在網絡迅猛發展的今天,惡意代碼已經成為網絡安全的重要威脅,在網絡信息安全中占有一席之地[1]。當開源代碼概念出現之后,產生了各種類型的代碼,現在即使是新手也可以輕松地使用駭客工具創建惡意代碼并發布到網絡上,目前這種代碼呈指數增長和擴散。現如今,國家網絡安全問題受到了前所未有的關注[2]。
日益嚴重的安全問題,已經滲入到人民日常生活乃至國家層面上,特別是在工業互聯網中的網絡攻擊會給國家的工業造成巨額損失。例如,震網病毒曾于2010年大面積出現,是當今世界上第一個完全根據工業控制環境所產生的毀滅性蠕蟲病毒,它在短時期內危及著許多公司的正常運營[3]。伊萬諾-弗蘭科夫斯克半數以上的家庭受到了停電影響,困擾持續了幾個小時[4]。在電站遭到攻擊的同時,烏克蘭的許多其他能源企業,如煤礦和石化等,也成為網絡攻擊的目標。
近年來,深度學習技術在人工智能應用領域受到了人們更多的關注。在語音識別、圖形視覺效果及自然語言處理等應用領域,深度學習比淺層學習模型在特征提取、分類以及預測準確性方面有許多優勢。鑒于其在其他領域的廣泛應用,研究人員已經將深度學習用于惡意軟件檢測系統的開發,已有很好的檢測結果,但也存在著不足之處。
比如,通過簽名的惡意代碼檢測技術一般根據模式匹配的思路。2012年,Desnos提出了一種基于相似距離的檢測軟件之間的相似性和惡意軟件的系統,從應用程序中提取簽名,可以確定兩個應用程序的相似性[5]。基于簽名的惡意代碼檢測方法十分準確,但是對于未知的惡意代碼來說卻無能為力,因為需要有關人員不斷地進行標記、更新病毒庫,無法自動標記和更新,否則停歇之后,就會被逐漸淘汰下來,喪失其使用價值。
2020年,Kishore等人提出了一種利用沙盒輔助集成模型分析和檢測JavaScript的新技術[6]。使用惡意軟件沙箱提取有效載荷,以獲得真實的腳本。將提取的腳本進行分析,以定義創建數據集所需的特征。但這種方法開銷大,耗費大量的時間,需要保證虛擬環境下不被惡意代碼攻擊。
所以,針對以上惡意代碼檢測方法存在無法自動和高效提取惡意代碼的問題,本文從紋理特征和操作碼特征入手,提出了基于特征序列的惡意代碼靜態檢測方法來實現自動、高效準確的惡意代碼檢測。
1.1.1惡意代碼灰度圖處理
灰度圖是每個像素只有灰顏色的圖像,這類圖像通常顯示為白色到黑色,即0到255像素。在惡意代碼檢測中,同類惡意代碼有可以追溯同源的特性。因此,可以在惡意代碼灰度圖上找到其相似性。現階段將二進制文件轉換成8 bit的灰度圖像,這樣其中的每個字節都被視為一個值為0至255的像素。如圖1所示,可以清楚地觀察到同家族灰度圖之間有相似的紋理結構,這體現了同一家族的同源性,而不同家族的紋理特征相差就比較明顯。

圖1 惡意代碼家族灰度圖像
首先,利用反編譯工具IDA Pro對本文使用的惡意代碼家族數據集進行反編譯,并批量產生asm編譯文檔,在asm文檔中能夠獲得Opcode序列。經過察驗,在asm文檔中操作碼一般都是出現于以“text”為首的代碼段中,利用正則表達式的方法來提取每行的惡意代碼序列。這樣提取出來的序列是完整的,包括了操作碼和操作數的指令。本文利用操作碼提取算法[7]進行操作碼提取。根據操作碼提取算法得到含有“text”的操作碼序列,將惡意代碼相似性轉換成判斷操作碼序列的相似性。最傳統的方式是將兩惡意代碼的操作碼序列進行分詞,以獲得其相應的特征向量,通過計算特征向量間的漢明距離來確定惡意代碼之間的相似性。傳統的hash算法可以避免沖突,但是避免沖突幾率非常低。即使對于兩個相似的輸入,散列輸出也會大不相同。操作碼提取算法如下:

惡意代碼序列中相似的hash值其表示內容也是相似的,因此使用雙線性插值算法來計算操作碼序列的hash值。通過用MD5算法來計算每個操作碼的hash值,并把每個序列編碼成n位Simhash值。根據序列中的每一個1或0,可以加或減掉操作碼的權值,得到新的序列。接下來確定新序列第n位值為1的哈希數量與第n位值為0的哈希值數量關系設置為1或0。這樣每個序列就被編碼成n位的Simhash值。將處理過的每個Simhash轉換為一個像素值。如果比特位為0,那么像素值為0,如果比特位為1,那么像素值為255,之后將n個像素點排列成矩陣,將Simhash值轉換成灰度圖像。因為存在著不同惡意代碼家族所產生的灰度圖像尺寸差異的問題,于是在本文中引入了雙線性插值算法對圖像進行壓縮。雙線性插值算法所下:

如 圖2所 示,P為 插 值 點,Q11、Q12、Q21和Q22是已知的像素點,P(x,y)為所要計算的像素數,假設已知函數f在Q11=(x1,y1)、Q12=(x1,y2)、Q21=(x2,y1)和Q22=(x2,y2)四個點的值。 先在x軸方向進行線性插值,得到R1和R2,然后在y軸方向進行線性插值得到插值點P。公式如下:


圖2 雙線性插值算法
通過雙線性插值算法對灰度圖像縮放后,利用圖像紋理特征提取算法提取圖像的特征,具體流程如圖3所示。

圖3 提取灰度圖特征流程
1.1.2灰度圖紋理特征提取
在上小節把二進制文件轉換成灰度圖片,本節中使用GIST(全局特征)算法對灰度圖片進行全部特征的提取,再使用SIFT(尺度不變特征變換)算法對圖像進行部分特征的提取。通過比較灰度圖片后,可發現惡意代碼家族的全局相似性非常高,具體區別在于部分特征上。在獲取惡意代碼圖像全局特征信息的前提條件下突出局部特點,才能最好地表現出惡意代碼的家族特征,更有區分性。本節先提取惡意代碼灰度圖像的全局和局部特征,后再把全局和局部特征加以融合。
GIST是2001年由Olive等人提出的描述圖像全局特征的算子,能夠識別圖像的全局不變性,檢索速度快[8]。該特征對不同尺度和方向的Gabor進行改進和拓展。GIST算法把尺寸為m×n的灰度圖像f(x,y)切分成nq×nq規格的網格結構,其中網格結構的塊數為S。每個網格行標記為Qi(i=1,2,3,…,S)。網格像素的平均大小大小為r×c,其中r=m/np,c=n/np。像素經過kn個通道的Gabor濾波器卷積運算,這樣每個網格圖像在各自的濾波通道后,級聯結果就是GIST特征,如式(4)所示。

其中α和β分別表示濾波器的尺度和朝向,通過GIST算法將圖像分成4×4的網格,在灰度通道上采用方向數8、8、4的三種尺度,即提取320維的GIST特征。
SIFT是用來描述圖像局部紋理特征的算子[9]。其特征是通過計算圖像間不同尺度下高斯對數的拉普拉斯算子(LOG),選擇地給出最佳結果的尺度值,就是在圖像的不同比例值上計算多個LOG值。但是由于對數計算在某種程度上代價太高,因此在SIFT算法中使用高斯差(DOG)。高斯差是通過使用等式減去圖像中兩個不同比例(r)的高斯模糊來計算,檢測的關鍵點使用泰勒級數展開進行準確定位。SIFT中的每個關鍵點都使用128位特征向量來描述,該向量可用于從圖像構建模式,如式(5)所示:

高斯模糊使用高斯函數計算模糊模板,將計算后的模板與最初圖像信息卷積運算,從而對圖像進行模糊處理。n維空間正態分布方程如式(6)所示:

式中,σ是正態分布的標準差,σ值越大,表示處理后的圖像效果越模糊(平滑)。r是模糊模板上任一元素到中心的距離。如二維模板尺寸為m×n,則模板上的元素(x,y)對應的高斯計算如式(7)所示:

首先利用SIFT提取惡意軟件灰度圖像的局部特征,描述圖像的邊緣和角點。通過特征包(BOF)[10]范式降低密集SIFT描述符的維數。通過BOF方法降低稠密SIFT算子的維數分為四個階段。在第一階段,借助密集SIFT檢測器從密集網格中提取惡意軟件圖像的關鍵特征。在第二階段,選擇密集的SIFT描述符來計算矩形區域的128維局部特征向量,其中每個關鍵特征由式(8)所示的函數表示。

其中MI表示維度為Dh×Dw的二值圖像,Rs表示尺寸調整參數,Ssize表示密集SIFT描述符的大小,Bbounds表示二值圖像每個關鍵點周圍的矩形區域。
第三階段,DSIFTFV用K-means技術進行聚類,這個過程稱為字典學習,如式(9)所示:

其中Dsize是字典的大小。
最后,DSIFTFV分配給字典中最接近的視覺特征,這個過程稱為描述符量化。每個量化的描述符就會以直方圖的形式來表示,直方圖出現的值在0至1尺度之間變化,然后通過計算DSIFTFV和DictionaryL之間的最小歐幾里德距離來生成基于BOF的密集SIFT描述,如式(10)所示:

其次,通過使用GIST計算惡意軟件灰度圖像的全局特征,得到圖像的紋理和空間布局。通過GIST描述惡意軟件圖像分為三個階段。在GIST的第一和第二階段,惡意軟件圖像通過不同比例和位置的過濾器過濾,將其分成N個塊。第三階段,用GIST計算每個塊的平均值,如式(11)所示:

其中MI表示維度為Dh×Dw的惡意軟件圖像;Rs表示尺寸調整參數;Nb表示將惡意軟件圖像分成水平和垂直位置的標準塊大小;Bovertap表示重疊參數,用于分離重疊或非重疊塊中的二值圖像;Fn表示用于過濾二值圖像的多個過濾器;Nsq表示統計量的數量,即在計算特征描述時使用的平均值和偏差。
最后,將基于BOF的稠密SIFT與GIST組合,得到的混合的CSGM特征維數。CSGM特征如式(12)所示:

其中w表示加權參數,其值取決于惡意軟件分類中的特征值。
1.1.3 基于流程圖的操作碼
因為惡意代碼都是機器識別的二進制文件,所以將其反編譯得到研究人員能夠識別的匯編文件。由上文可得到IDA Pro反編譯的編譯文件,并對編譯文件用正則表達式的方法得到操作碼。在本節中,首先使用IDA Pro將惡意代碼程序反編譯轉換成編譯程序。由于惡意代碼程序由一些結構體、條件循環等構成,因此在函數調用之間存在著一些聯系,可以通過IDA Pro來查看函數的調用關系,如圖4所示。這種函數調用關系可以用控制流程圖表示,抽象表達一個過程或者程序。根據控制流程圖的順序來提取其對應的操作碼:{call,mov,jmp,mov,lea,mov,lea,mov,cmp,jle,call,cmp,jz,mov,call,mov,leave,retn,mov,call}。

圖4 函數調用關系
這樣提取的操作碼無法完成自動化分析,下一節將操作碼序列轉換成向量。
1.1.4 基于N-garm的Opcode特征
從上一節得到了惡意代碼的控制流程圖操作序列,但是這個序列不能被模型識別。因此需要對其進行矢量化和數值化的處理,作為神經模型的輸入。在這一節,用N-gram方法對操作碼序列進行特征提取,這種方法的檢測顆粒度較小,與控制流程圖相結合會得到代碼上下文之間的關聯。下面主要介紹將操作碼向量化的過程。
假設操作碼序列片段為{push,mov,push,call,add,mov,xor,pop},將滑動窗口長度n設為3,會得到子序列集合{(push,mov,push),(mov,push,call),(push,call,add),(call,add,mov),(add,mov,xor),(mov,xor,pop)}。每個二進制文件可以組合所有子序列(v1,v2,v3,…,vn)來生成子序列集合S。如果這個子序列v在集合S中,那么將其設置為1,否則設置為0,最終會得到一個只包含0和1的特征向量,這樣形式的特征序列可以被神經網絡模型識別。操作碼N-gram算法如下:


將惡意代碼圖像紋理特征和操作碼特征融合成一個特征向量,作為模型的輸入。融合的特征向量可以從不同的維度和層次綜合考慮和分析惡意代碼。首先讀取灰度圖像樣本和操作碼的特征向量,對兩種特征向量利用pandas.merge()函數進行融合,生成新的融合特征向量f_s,之后利用pandas.merge()函數把特征向量fusion_s與標簽文件labels融合,最終得到融合特征f,特征融合方法下:

操作碼序列是按照惡意代碼執行邏輯順序出現的,所以上下文之間存在著一定的關聯性,而融合的特征也具備了這一特點,在此特點上,LSTM(長短期記憶網絡)具有遺忘機制、保存機制和長時間記憶信息的特點[10],所以LSTM能更好地提取到惡意代碼深層次的特征。本小節構建LSTM模型對惡意代碼進行檢測并分類。
在LSTM訓練過程中,通過不同的特征來對模型訓練。在前面通過對編譯文件進行特征提取,將asm文件通過Simhash算法處理生成灰度圖像,并提取惡意代碼灰度圖像的紋理特征。在匯編文件中,通過控制流程圖的方式提取到操作碼,之后通過N-gram算法提取操作碼。最終把所獲取到的灰度圖像紋理特性與操作碼特性進行特征融合,進而得到一種全新的融合特征,將融合的特征作為LSTM模型的輸入。
LSTM是一種特殊的循環神經網絡(RNN)。在RNN模型訓練中,隨著訓練時間的延長和網絡層的增加,很容易發生梯度爆炸或消失,從而在處理長序列時RNN的效果差強人意[11]。2005年,Graves和Schmidhuber提出了一種雙向長短期記憶神經網絡(Bi-LSTM),是當前應用最廣泛的一種LSTM模型[13]。
LSTM與RNN最大的區別是,RNN有單循環結構的狀態,而LSTM的單循環結構(又稱細胞)有四種狀態。與RNN相比,LSTM循環結構具有一個持續的單位狀態進行傳播,可以用來判斷某些信號要遺忘還是繼續傳播下去。具有三個連續循環結構的RNN如圖5所示,每個循環結構都有一個輸出。

圖5 連續循環結構的RNN圖
具有三個連續循環結構構造的LSTM如圖6所示。

圖6 循環結構的LSTM的模型圖
一層LSTM通常是由單一循環結構組成的,即由輸入數據的維度和循環次數確定每一個循環結構需要自我更新幾次,而不是由多個單一的循環結構連續組成。當前層LSTM的參數總個數只需要計算每一個循環單元數量就行,不計算幾個連續單元的合計數量。
LSTM網絡利用同一種門結構對所有細胞狀態進行刪減或添加信息。LSTM由輸入門、遺忘門、輸出門和單元狀態組成。門由sigmoid層和逐點乘法等運算方式構成,在sigmoid層中輸出0到1之間的數值,由門判斷各個元素該通過多少,數值為0代表門不讓所有內容過,而數值為1代表門讓全部內容通過。
輸入門:決定當前時刻網絡的輸入數據有多少需要保存到單元狀態。
遺忘門:可以決定在上一時刻的所有單元狀態有哪些需要保存到當前時間。
輸出門:可以控制對當前單元狀態的需要程度,輸出到當前的輸出值。
首先把上一時刻的輸出ht-1與當前的數據輸入xt接連通過遺忘門得到ft。

接下來是應用上一個時刻的輸出ht-1和當前的數據輸入xt,通過輸入門得到it,以及通過單元狀態得到當前時刻暫時狀態

之后應用上一個細胞結構的單元狀態Ct-1、遺忘門輸出ft、輸入門輸出it以及單元狀態的輸出得到當前細胞的狀態Ct。

最后通過輸出門得到ot,以及結合當前細胞的單元狀態Ct和ot得到最終的輸出ht。

本節采用的是單層的LSTM單元來構建融合特征的惡意代碼檢測模型。在構建模型時候,選擇具有兩個相反方向的結構組成模型,在LSTM模型后連接Softmax分類器,這樣可以對惡意代碼進行自動提取特征及分類。模型構建完成后,將已處理好的融合特征向量作為LSTM的輸入、訓練模型。在訓練中,通過不斷對模型調參來確定惡意代碼的輸入數據,提高模型的分類能力。
靜態惡意代碼檢測的用的實驗數據是微軟惡意軟件數據集和VirusShare惡意樣本數據集,包括了12個惡意家族的11 516惡意代碼可執行文件。如表1所示。

表1 靜態惡意代碼數據集
在實驗中,使用統一的統計指標來評估模型的性能,包括準確率、精確率、召回率、F1-Score等。準確率(Accuracy)用來評價惡意代碼檢測分類模型對惡意代碼分類的正確率程度,是一種直接直觀的評價指標。精度率(Precision)是評估真正檢測到的實例與預測的正確應用數量的比率。召回率(Recall)是計算為正的正樣本實例與總樣本的比率。F1-score是判斷良性還是惡性軟件的比較值。
首先對于灰度圖像特征提取與傳統方法進行比較,之后將融合的特征在前文使用的LSTM模型中進行訓練,結果與傳統的機器學習模型和其他論文方法進行比較。
在模型構建成功后,為了使得模型能夠適應惡意代碼融合特征,需要對LSTM模型調整參數,對LSTM的網絡結構進行優化。先對模型進行調優,測試迭代次數epoch、學習率lr、隱藏神經元的個數n_hidden等參數設置對特征融合的LSTM惡意代碼檢測模型的分類結果產生的影響。在N-gram的Opcode特征中,n的取值也會對最終的結果產生影響。最終經過多次實驗和不同參數組合下,確定在學習率lr為0.002,迭代次數epoch為15,Dropout設置為0.5,隱藏神經元的個數設置為20的組合下,模型具備較好的分類能力。先對操作碼特征與灰度圖像特征進行提取和實驗,之后把融合后的特征與單一特征進行比較。
在提取操作碼特征中將N-gram中的n值設置為1到5,測試不同的n值對實驗結果的影響,實驗結果如表2所示,可以看出當n=4的時候分類的準確率最高。

表2 操作碼特征對比結果
在灰度圖像特征提取中,先是用GIST算法獲取全局特征,隨后再用SIFT算法提取局部特征,再將全局和局部按照上一小節方法進行融合,將三者特征與LSTM模型訓練。實驗如表3所示。將全局與局部特征融合一起的準確率更高,效果更好。

表3 圖像特征對比結果
在對比實驗中,利用兩種單一特征和特征融合的方法與LSTM模型進行訓練實驗,對比實驗如圖7所示。

圖7 單一特征與融合特征對比流程
其中LSTM模型的參數在上面已經描述。如表4所示,基于N-gram操作碼的分類準確率為93.4%,基于灰度圖像特征的分類準確率為97.8%,融合特征的分類準確率為98.3%。可以看出融合特征的分類準確率高于其余兩者的準確率,這說明了融合特征從不同維度描述惡意代碼的行為特征,提高了對惡意代碼檢測的準確率,而單一層面的特征是從局部或者全局維度來考慮惡意代碼的行為信息,不能完整地描述惡意代碼的行為。

表4 與單一特征對比結果
(2)傳統機器學習模型進行對比分析
將N-gram中n設置為4的融合特征模型與傳統機器學習模型進行對比,驗證不同模型對于實驗結果的影響,對比實驗如圖8所示。

圖8 融合特征模型與機器學習對比流程
實驗分別使用支持向量機(SVM)、邏輯回歸(LR)、樸素貝葉斯(NB)和RNN與LSTM模型進行對比,利用Precision、recall、F1-score和Accuracy對 實 驗 結 果進行評估,如表5所示。

表5 靜態特征與模型對比結果
表5中模型訓練10次的準確率如圖9所示。

圖9 五種模型10次訓練準確率折線圖
由表5和圖9可知,LSTM模型的精度率、召回率和F1-score這三項指標小于和等于其余模型,但是在準確率上面要高于其余四個模型,雖然這四個指標是衡量分類效果的標準,但是準確率更主要地確定模型分類的效果,特征融合的LSTM模型準確率要高于其他模型,說明了模型的分類效果較好。
(3)與其他文獻方法進行對比分析
將本文融合特征的模型與其他論文使用相同數據集的模型進行對比,如表6所示。

表6 與其他論文對比結果
融合特征的分類準確率要高于文獻[14]所采用的ResNet和GoogleNet模型進行的分類;高于文獻[15]將惡意軟件映射成彩色圖像,利用CNN模型對惡意軟件進行的分類;也略高于文獻[16]的經典惡意代碼可視化方法。實驗驗證了基于融合特征的靜態惡意代碼檢側模型的效果。
通過對上述實驗分析可知,融合的特征效果要比單一特征效果要好,而且LSTM模型可以通過上下文的聯系,能夠提取較深層次的惡意代碼融合特征,這些特征描述能力較好,能夠更好地表現出惡意代碼特征,融合特征,使模型有較好的分類能力。
本文針對深度學習的惡意代碼檢測問題進行了相關的研究并提出了一種檢測方法,主要如下:
首先,在靜態惡意代碼分析方面。在提取圖像紋理特征上,本文提出一種Simhash處理編譯文件轉換成灰度圖像的方法,該方法利用Simhash算法的特性將惡意代碼中相似的二進制值轉換成相同大小的相似圖像,通過GIST算法和SIFT算法提取灰度圖像的全局和局部紋理特征,將全局和局部紋理特征進行融合。在獲取操作碼的特征上,用控制流程圖的順序反編譯惡意代碼后得到操作碼,之后用N-gram算法獲得操作碼特征。
其次,因為灰度圖像特征和操作碼特征分別反映了惡意代碼的全局和局部上同類別惡意代碼的相似性,所以提出一種將全局和局部特征進行融合的方法,綜合考慮到惡意代碼的特征,將融合特征作為LSTM模型的輸入加以訓練、分類,以此增加惡意代碼檢測的精確度,并經過實驗驗證,本文提出的方法能夠提高惡意代碼檢測工作的效率和準確率。