劉紫煊,王 晨
(1.武漢郵電科學研究院,湖北武漢 430000;2.南京烽火天地通信科技有限公司,江蘇南京 210000)
目前,全球使用互聯網的人數已經達到47 億人次,互聯網正成為全人類最廣泛使用的工具。但與此同時,針對互聯網的網絡攻擊現象也越來越頻繁,個人終端遇到的網絡攻擊行為主要包括惡意代碼、惡意病毒、流氓軟件等。企業終端除上述攻擊外,還包含大量滲透攻擊。由于近年混淆器的更新迭代日新月異,病毒使用混淆器的情況也逐漸增多,這就導致了病毒變得更加難以發現,病毒生成速度更快,產生數量更多。惡意代碼利用代碼變形、反追蹤、反虛擬機、代碼混淆等技術避開安防系統,攻擊計算機的現象時有發生。根據報告,2020 年1-6 月,我國境內共攔截計算機惡意軟件約1 815 萬個,平均每日傳播次數約400 多萬次,其中相關惡意軟件家族達1 萬余個,被感染惡意程序的計算機約300 萬臺。
為了避免惡意軟件受到殺毒軟件的偵測和查殺,惡意軟件開發者通常會加入以下反檢測技術。加殼:加殼技術主要包括加密和壓縮兩個流程,將惡意代碼先加密后壓縮,從而提高代碼被檢測到的難度;寡態與多態:寡態是指在惡意代碼中植入多組加密器和解密器,惡意代碼每一次運行之后,就會隨機自動選擇其中一組加密器重新加殼;多態技術則是將惡意代碼進行加密過程之后,又為解密器添加了一個引擎,該引擎的主要作用是對解密器進行變形,以便將代碼混淆。代碼混淆:其基本原理是將原始惡意代碼的結構打亂重排,使其更加難以被逆向分析,而代碼的功能卻沒有變化,進而躲過查殺。
靜態分析技術是指在源代碼未被運行的條件下,運用專業的輔助工具,通過分析軟件代碼的結構、功能、操作碼、API 序列、函數調用等對代碼進行分析,進而驗證其是否為惡意軟件以及其所屬的類別。動態分析技術是指將代碼放置在一個條件可控的實際工作環境或虛擬環境中,運行程序代碼,通過定位到代碼運行時所執行的指令和調用的函數類型等,進而分析代碼的行為軌跡與目的,監測其是否為惡意代碼。需要注意的是,動態分析技術所依賴的實驗環境是要與外界網絡徹底隔絕,避免惡意軟件通過網絡向外傳播,導致其他計算機“中毒”,造成損失。
2015 年Microsoft 曾在kaggle 上發起過一個惡意軟件分類的挑戰賽,引起了全世界網絡安全行業相關學者的關注,微軟發布比賽的同時,又發布了近1 000 GB 的惡意軟件數據集,該數據集共分為九大類,包含超過一萬個惡意軟件樣本。具體分類和數量如表1 所示。

表1 惡意軟件家族分類及數量
由于原始數據量過大,解壓后占用存儲空間近200 GB,并受到機器性能的限制,因此在實驗之前,先對數據集進行抽樣處理。從10 868 個樣本中抽取十分之一作為實驗用樣本。
N-Gram 是根據統計學的模型原理生成的一種新算法,將每次滑動的窗口長度設置為N。N-Gram算法原理是提取文本內容,根據設置的窗口長度,將文本內容依此分割成n個片段,得到每個片段的長度為N。每完成一次分割后,便將窗口向后滑動一個單元,經過多次的分割移動,最終形成一個字節長度為N的序列。N-Gram 算法的性能和提取特征的總數取決于窗口的設定值。
每個被分割的片段稱為一個Gram 片段,統計被分割的Gram 片段出現的頻次,實驗前設定一個閾值,并依此過濾出一個Gram 列表,列表中一個Gram片段代表一個特征向量,多個特征向量組合便是該文本對應的特征向量空間[1]。該模型提出的前提是第n個片段只受前面n-1 個片段影響,而不受其他片段影響,整個片段出現的概率等于各個片段出現概率的乘積。常見的N-Gram 算法包括N為2 的Bi-Gram 和N為3 的Tri-Gram。N-Gram 生成的窗 口包含了對應操作碼序列的全部子序列,該子序列與其相鄰的子序列形成一種聯系,根據這種聯系,可以得出對應程序的語義。
以片段{push,mou,add,dec,lea,sub,mov} 為例,設窗口每次滑動長度L=3,每個窗口代表這段操作碼序列的子序列,每個子序列與其前后序列存在對應關系,如圖1所示,由此可以得到子序列集合{(push,mov,add),(mov,add,dec),(add,dec,lea),(dec,lea,sub),(lea,sub,mov)},子序列集合中所包含的子序列個數由n決定,如果一個二進制序列操作碼片段長度為L,那么將生成L-n+1個子序列[2],操作碼特征提取流程如圖1所示。

圖1 操作碼特征提取流程
根據上述流程,每一個編譯文件都可以生成一個集合文件,集合文件中包含多個子序列,生成的子序列可以組成一個子序列集:

A集合中包含了所有操作碼的子序列,例如(add,dec,lea)。如果要將該子序列集合作為機器學習模型的輸入特征,則需將子序列集特征轉化為可以應用到算法模型中的數字特征。假設一個.bytes 文件生成的子序列集合為(push,mov,add,dec,lea),那么可以定義一個數值化操作函數,將其轉化為一個維度方向向量:φ(x)=(φa(x))a∈A,其中:

假設,如果全部二進制子序列的總集合A和所需要驗證的集合B分別為{(push,mov,add),(mov,add,dec),(add,dec,lea),(dec,lea,mov),(lea,mov,sub)}和φ(push,mov,add,dec,lea)那么可以得到如下子序列:

則向量(1,1,1,0,0)便是該二進制文件的向量化和數值化的子序列,由此可得出集合B與集合A的關系。
B2M 算法的原理是以二進制比特流的形式讀取惡意代碼源文件,以16 個字節為一個單元,將其轉化為十六進制向量,設二進制文件固定寬度width 為2n,長度length 由文件大小和寬度相除獲得(length=文件長度/width),生成的向量仿照矩陣格式排列,設置矩陣中元素大小在0~255 之間。
灰度圖是指用黑白灰三種顏色描述的圖像。灰度圖像像素值介于0~255 之間,越靠近0 代表黑色越深,越靠近255 代表白色越深。在灰度圖像中,色彩的飽和度通常為零,像素信息由灰度信息與其位置信息共同構成[3-7]。根據算法原理,二進制文件可以灰度可視化成圖片。因為設置的矩陣值在0~255 之間,所以要將一個二進制文件轉換為灰度圖形式,必須把二進制文件按照每8 bits 為一組進行分塊,8 bits代表0~28中任意一個數,每個塊中的二進制序列可以被轉換為對應的整數,那么這個整數必然可以表示為一個灰度[3]。
隨機選取以下樣本,惡意代碼家族1 中的“1u3PmQiD0bX6RcgoCNKe”、“6bu0NZAsYoiUlCjEy H4X”、“8APhEd3UCifDsc4zVemR”,惡意代碼家族2中 的“aXMsY6r5HDflGbOjUcu7”、“czxjYgBb4TeOD 38AhNvi”、“DRXe2HIAxJaiFp0joQr1”以及惡意代碼家族3 中的“1iFYGHfzdnCJRXA5uby9”、“BLGY8Ek5 f4JlhOvIXxz2”、“ehW19YdIEik3jUpGA8sX”,分別將其灰度化后進行比較。結果發現,同一家族的惡意代碼生成的灰度圖具有相似的紋理結構。
隨機森林模型主要用作對數據集進行分類,模型根據數據集的特征進行劃分,每一棵決策樹代表一個特征,根據特征劃分數據集,在數據節點特征中找到最優解,進行分裂。隨機森林不依賴一棵決策樹,而是根據預測的多數票從每棵樹中獲取預測,并預測最終輸出[4]。RF 算法從訓練集中選擇隨機的K個數據點,構建與所選數據點(子集)關聯的決策樹,為要構建的決策樹選擇編號N,對于新數據點,找到每個決策樹的預測,然后將新數據點分配給贏得多數票的類別[8]。將樣本中的訓練集生成k個樹,這些分類樹組成隨機森林,分類樹投票分數的權重將決定測試數據的分類效果,隨機森林的構建流程如下[6]:

隨機森林的學習模型原理如圖2 所示。

圖2 隨機森林模型原理圖
設單個樹誤差為a,每個樹之間互相獨立,則組合樹的誤差為:

十折交叉驗證的具體流程:數據集被平均分成10 份,按順序選中其中每一份作為測試數據,剩下的9 份作為訓練集,進行實驗得到10 個值,取10 個值的平均值,作為待驗證算法的近似準確率,通常一次實驗要進行多次十折交叉驗證。K折交叉驗證雖消耗的計算資源較高,但可以在數據集較少時獲得最優解,之所以選擇將K定為10,是因為通過大量數據集測試結果表明,十折交叉驗證可以使誤差估計最小。該文所使用的算法模型訓練和評估測試方法,均是十折交叉驗證。
LSTM 模型示意圖如圖3 所示。

圖3 LSTM模型示意圖
圖3 中的A表示了LSTM 三個時間步的三個單元,其中第二個單元顯示了LSTM 內部單元的工作結構。該單元的第一個長方形A表示遺忘門,中間部分表示輸入門,右邊長方形A表示輸出門,σ表示以sigmoid為激活函數的神經元,tanh 表示以雙正切函數為激活函數的神經元[2]。多個神經元的組合和運算,可以計算當前時刻輸入與輸出數據、上一時刻輸出數據以及單元狀態,并將信息傳遞到下一個單元結構。每進行到一個時間節點,LSTM 模型便更新一次隱藏狀態和單元狀態。其中,xt-1、xt、xt+1分別表示不同時刻的輸入,ht-1、ht、ht+1分別表示不同時刻的隱藏狀態[5]。
在一個給定的輸入序列X={x1,x2,…,xt}中,若將LSTM 結構中的輸入門、遺忘門、輸出門、隱藏狀態和單元狀態分別設置為it、ft、ot、ht和ct,wc為細胞狀態的權重矩陣,bc代表細胞狀態的偏置項,附加的權重標記為wi、wf、wo、bi、bf、bo,用σ表示sigmoid 函數,則上述參數的公式表示如下:

采用OpCode N-Gram 的方式作為特征預測,數據集中不同惡意代碼文件大小不一,從全部的惡意代碼數據集中提取所有操作指令的N-Gram 數量過大,文中對此進一步作特征選擇。分別選取不同元組N值為{2,3,4,5,6}進行隨機森林分類準確率對比實驗,結果如圖4 所示。經過測試發現,與隨機森林算法結合后,N取值為3 得到的特征準確率和穩定性要略優于N取其他值時的準確率[9]。

圖4 N-Gram算法不同N值得到的準確率
因此,該文采用基于3-Gram 算法的隨機森林算法,將特征值輸入到算法選擇器中,采用十折交叉進行驗證,最終得到10 次測試結果如下:[0.950 617 28,0.925 925 93,0.937 5,0.887 5,0.887 5,0.962 5,0.975,0.925,0.937 5,0.987 5],預測準確率平均值等于0.937 65。
該文分別選取像素點數目pix值為{1 000,1 500,2 000,2 500}進行對比驗證,得到的準確率結果如表2 所示[10]。

表2 不同像素點數目的分類準確率
根據實驗結果顯示,像素值pix 的個數在1 500~2 000 之間,分類準確率取得最大值,由此該文選取1 500 個像素進行驗證,并將特征值輸入到隨機森林分類選擇器中,采用十折交叉驗證,最終得到10 次測試結果如下:[0.975 308 64,0.938 271 6,0.937 5,0.937 5,0.925,0.925,0.967 5,0.975,0.887 5,0.937 5],預測準確率平均值等于0.942 608。
根據前文實驗,N取值為3,像素取值1 500,得到的預測準確率值最大[11]?;诖?,將N-Gram 特征和紋理特征兩者結合作為聯合輸入特征,應用到隨機森林算法選擇器中,并采用十折交叉驗證,最終得到10 次測試結果如下:[0.987 654 32,0.950 617 28,0.9625,0.962 5,0.95,0.987 5,0.987 5,0.987 5,0.975,1.0],預測準確率的平均值為0.975 077,三種算法的結果如圖5 所示。

圖5 三種不同特征的預測結果準確率
由結果可知,只采用N-Gram 特征或圖像紋理特征作為輸入特征,得到的預測準確率結果互有勝負,采用二者聯合特征作為輸入特征,得到的準確率均好于單一特征得到的準確率[12]。
在LSTM 模型中,模型所包含的遞歸自然學習能力,能夠自動提取N-Gram 和紋理兩種特征結合后形成的深層次的特征,然后將融合該特征通過輸入門輸入到LSTM 模型后,依次經過隱含層中的遺忘門、輸入門、輸出門,計算出融合特征的特征圖,LSTM中每個隱藏神經元都是循環連接,輸出層輸出的向量大小要與分類的惡意軟件的類別數目相等[13]。該實驗采用單層長短時記憶網絡,模型每層結構采用兩個方向相反的LSTM模型,LSTM的隱含神經元個數初始值定為20,BiLSTM 雙向長短時記憶網絡模型圖如圖6所示。

圖6 BiLSTM雙向長短時記憶網絡模型圖
針對BiLSTM 模型,通過實驗不斷調整和優化LSTM 網絡結構中的有關參數,調整的參數包括隱藏神經元n_hidden 的個數、學習率lr、批次大小banth_size、網絡層數、數據集劃分比例、迭代次數epoch 等,使用控制變量法,先將某個參數值固定,通過調整其他參數,使泛化能力達到最優,得到一個最優解[14]。依此類推,直到得到所有的最優化參數,便得到了LSTM 結構的一組最優模型。在后續的融合特征數據作為輸入時均采用該最佳的參數組合情況,其最佳參數組合情況如表3 所示[15]。

表3 網絡結構最佳參數
通過實驗驗證,在相同輸入特征的條件下,該文提出的BiLSTM 雙向長短時記憶網絡對惡意軟件數據集分類的準確率達到了0.985,結果高于隨機森林分類器準確率0.976,也高于KNN、SVM 等傳統分類器的準確率[16],不同分類器得到的分類準確率如圖7所示,實驗結果符合預期。

圖7 不同分類器得到的分類準確率
該文根據惡意代碼源文件反匯編生成的.bytes文件和.asm 文件,基于.bytes 文件提取了N-Gram 操作碼子序列特征,基于.asm 文件提取了灰度圖像紋理特征,并基于隨機森林分類算法以及十折交叉算法,分別驗證了兩種輸入特征,得到每一種特征對應的分類準確率。最后將兩種特征結合在一起,作為輸入特征重復計算,發現預測準確率均高于單一特征的預測準確率。在此基礎上,該文基于LSTM 模型,提出一種新的BiLSTM 雙向長短時記憶網絡結構,在相同的輸入特征條件下,該模型的準確率要高于隨機森林等傳統分類模型準確率。