楊 望 高明哲 蔣 婷
(東南大學網絡空間安全學院 南京 211189) (計算機網絡和信息集成教育部重點實驗室(東南大學) 南京 211189) (江蘇省計算機網絡技術重點實驗室(東南大學) 南京 211189)
據不完全統計,現如今惡意代碼已成為網絡攻擊的主要載體,惡意軟件的樣本總量已達到百億級別,且每天新增百萬級別的惡意樣本.據國家互聯網應急中心(CNCERT)發表的《2020年上半年我國互聯網網絡安全檢測數據分析報告》[1]指出,僅2020年上半年,CNCERT就捕獲計算機惡意程序樣本數量約1 815萬個,日均傳播次數達483萬余次,涉及計算機惡意程序家族約1.1萬余個.而來自AV-Test[2]的數據則聲稱在2020年已統計到11.04億的惡意軟件樣本.由此可見,爆炸性增長且種類繁雜的惡意樣本如無法被快速高效地檢測,極易對用戶個人的財產安全、社會安全、乃至國家安全產生巨大威脅.
傳統基于人工簽名的檢測方式[3]早已無法適應目前惡意軟件數量指數型增長的趨勢.同時為了抵抗檢測,惡意軟件的變種、加殼[4]、混淆[5]等技術也一直在迅猛發展中.隨著對抗技術的不斷成熟,單特征和單模型的檢測能力持續不斷的下降,因此,實現大規模樣本數據的高效分析,并將之提取為機器可理解的數據,訓練對惡意樣本的加殼、混淆等技術有良好適應性的分類器已成為當前惡意代碼檢測的重中之重.
惡意代碼分析方法有動態分析、靜態分析2種類別.靜態分析無需執行惡意軟件即可對其進行分析.通常靜態分析提供了對偽代碼、散列、標頭結構、字符串、元數據等數據的分析.靜態分析惡意軟件一般使用反匯編工具IDA Pro[6],OllyDbg[7],OllyDump[8]等對惡意軟件進行逆向工程,以達到了解惡意軟件的代碼、邏輯結構等目的.動態分析則是指在受控環境中執行和分析惡意樣本,受控環境往往因存在某些與真實環境之間固有的缺陷而容易被惡意樣本所察覺,但使用真實環境的成本又過于昂貴.因此靜態檢測依然是惡意軟件分析中的重要環節,一旦靜態分析檢測出惡意軟件,就可以跳過下一步的動態分析,這在很大程度上節省了時間與人工等資源成本.
在近些年的研究中,一些學者不通過惡意軟件的先驗知識也能利用機器學習方法對惡意軟件進行分類,如Nataraj等人[9]提出惡意軟件轉為圖像的方法,將惡意軟件轉為灰度圖表示,之后惡意軟件圖像就在學術界被廣泛研究.Saxe等人[10]引入信息領域中熵的概念,將字節熵直方圖應用在惡意代碼檢測中.Anderson等人[11]則在此基礎上進一步挖掘其他相關特征以構建模型.當然另一主流研究方向則是利用惡意軟件的先驗知識,通過逆向工程的手段,提取字符串[12]、操作碼[13]、可執行文件結構[14]和函數調用圖[15]等特征以構建檢測模型.不管是否基于先驗知識,這些靜態分析的研究方法均為惡意軟件檢測提供了更多落地的可能,但最近的研究[16]表明惡意軟件加殼、混淆等對抗技術會極大的限制靜態分析技術,使靜態檢測器的泛化能力急劇下降.因此如何緩解并突破對抗技術所帶來的限制,該問題本身的研究價值是毋庸置疑的.
在近年的研究成果中,集成學習也成為常用的模型聚合方法:Zhang等人[17]提取惡意軟件的n_gram字節序列,使用多個概率神經網絡訓練并聚合結果.Garg等人[18]則使用IDA-Pro提取API調用,創建多層次集成學習模型進行訓練,以使模型對特征具有更好的表達能力.Guo等人[19]則通過提取惡意樣本圖像的GIST描述符,集成KNN和隨機森林模型以聚合結果.上述研究表明:多模型集成方法均能進一步提高模型的表達能力,使特征的潛能進一步發揮出來.但眾所周知,模型的檢測能力不僅受限于模型的表達能力,也受限于特征的潛在能力.一般利用集成學習的研究成果均使用單特征作為輸入,而加殼和混淆等對抗技術能夠對靜態檢測中單特征檢測造成不同程度的影響,而從不同測度提取特征,在多特征的基礎上構建多模型集成能更好地抬高特征潛能的上限,使模型的表達能力不再局限于單特征,多種測度的特征互相補充,取長補短,能更好地緩解加殼、混淆等對抗技術帶來的威脅,使惡意樣本在靜態檢測階段就能夠被捕獲.
本文提出一種基于多特征的策略投票方法的惡意代碼靜態檢測框架,該框架可以有效緩解對抗技術發展帶來的威脅,對惡意代碼的變種、加殼、混淆都有較強的普適性,且能有效減少對全部樣本直接進行動態分析的資源成本和人工分析的人力成本.
本文的主要貢獻有2個方面:
1) 提出了一種基于多特征的靜態檢測方法,該方法從不同角度提取了惡意軟件在字節、指令、調用3個不同層次的特征,并在每個特征的基礎上進行基模型的集成,增強模型的泛化能力,使其更加不易過擬合,然后采取策略權重投票算法糾正單特征訓練的初始分類錯誤,并且設定相應的策略閾值,在保證誤報率較低的條件下提高檢出率,達到最好的檢測效果.該方法不僅能在未加殼的惡意樣本檢測中產生更好的效果,同時也能有效緩解變種、加殼、混淆等惡意樣本對抗技術造成的干擾.
2) 論文使用的實驗數據加入了多種加殼和混淆樣本,包括使用了UPX殼、VMP殼、Themida殼以及Mpress殼等多種帶有壓縮殼或加密殼的樣本,這些樣本的使用可以更好地驗證檢測算法在惡意樣本使用對抗手段時的效果.
我們選用了6種靜態特征作為惡意軟件檢測的特征測度,其中包括:惡意軟件圖像的紋理特征、字節統計值和字節熵直方圖特征、opcode序列特征、字符串序列特征、PE文件結構特征以及函數調用關系特征等,下面對每部分特征進行詳細描述.
惡意軟件的二進制文件通過多個步驟可轉化為灰度圖像,如圖1所示.首先我們將二進制文件按照8 b無符號整數依次讀取并存入向量中.其次讀取文件大小,根據文件大小與灰度圖寬度映射表得到灰度圖的width,而后根據文件大小和width計算灰度圖的height,文件大小到width的映射如表1所述,將這些向量轉為形狀是[height,width]的2D數組,最后將2D數組可視化為[0,255](0:黑色,255:白色)范圍內的灰度圖像.二進制文件轉化為灰度圖算法流程如算法1所示.

Fig. 1 Binary to malware image圖1 二進制轉惡意軟件圖像

Table 1 Binary File and Grayscale Image width Mapping表1 二進制文件與灰度圖width映射
算法1.二進制文件轉惡意軟件圖像.
輸入:二進制文件file;
輸出:file的圖像表示image.
① functionbin2image(file)
②f=open(file,“rb”);
/*以二進制讀取文件*/
③image=np.fromfile(f);
④ /*將每8 b轉為一個無符號數存入
image中*/
⑤filesize=image.shape[0];
/*獲取二進制文件大小*/
⑥width=get_image_width(filesize);
⑦ /*根據映射表獲取width*/
⑧height=filesize/width;
/*計算height*/
⑨image=image.reshape(height,width);
/*調整shape*/
⑩ returnimage;
我們在將惡意軟件轉為圖像后,對圖像做統一的標準化處理,即統一圖像的shape至固定尺寸.我們使用(256,512)作為圖像新的height和width,如果圖像尺寸大于該尺寸,則使用像素面積相關重采樣算法縮小圖片至該尺寸,該算法可以有效避免圖像縮小時波紋的產生.否則使用雙三次插值法放大圖片至該尺寸.
圖像描述符通常用來描述圖像中的視覺特征.我們使用GIST描述符[20]計算惡意軟件圖像之間的相似度.給定對應輸入圖像,計算GIST描述符:首先需要將1幅惡意樣本圖像f(x,y)劃分為4×4的網格塊,每個網格塊代表一個子區域,按照行依次標記為p1,p2,…,p16.其次在每個網格塊使用4個尺度,8個卷積方向的Gabor濾波器做卷積濾波計算,每個網格塊再經過各通道的濾波后,將卷積結果級聯,得到該網格塊圖像的局部GIST特征為

(1)
其中,i=1,2,…,16,(x,y)∈pi,nc為m×n個通道,gmn表示濾波函數,cat為級聯運算符,*為卷積運算符.
最后計算局部GIST特征的均值,并將結果按行組合,得到全局GIST特征為

(2)
由于我們將圖像劃分為16個子區域,同時使用4個濾波尺度和8個方向的Gabor濾波器做卷積濾波計算,故因此會生成32個與輸入圖像大小相同的特征圖,平均16個子區域內32個特征圖的值排列組合得到的全局GIST特征為512維.GIST描述符總結了輸入圖像不同部分的梯度信息(比例和方向),因此可作為判斷惡意軟件圖像之間的相似度依據.
字節統計值同樣是一種無需解析PE文件格式就可直接提取特征的一種方式,它統計二進制文件中的全部數據,每8 b劃分為一個單位,其值在[0,255]之間,統計每個值的出現次數.在生成特征時,由于文件大小也作為常規文件信息中的特征,故字節統計值需要歸一化處理,即計算[0,255]范圍內統計值的總和,每一個統計值除以總和得到歸一化后的統計值.某樣本的字節統計值如圖2所示:

Fig. 2 Byte statistics圖2 字節統計值
字節熵直方圖則近似于熵H和字節值X的聯合分布p(H,X).我們為二進制文件計算以字節分布建模的字節熵直方圖的bin值.為了提取字節熵直方圖,如文獻[10]中所述,我們在二進制文件上滑動一個固定字節長度的窗口,步長也為固定字節長度,通過計算在該窗口中每個字節的出現次數,并計算每個窗口上的以2為底的熵,使用計算出的熵值作為下標,將窗口中每個字節的出現次數自增到特征矩陣相應下標所對應的向量上.隨后滑動窗口繼續計算對應字節窗口的熵值.在生成特征時,展開該特征矩陣為一維特征向量.計算字節熵時滑動窗口示意圖如圖3所示,在每個窗口內計算字節熵算法流程如算法2所示,遍歷二進制文件所有字節算法流程如算法3所示.

Fig. 3 Schematic diagram of sliding window圖3 滑動窗口示意圖
算法2.每個窗口內計算字節熵算法流程.
輸入:原始樣本在每個窗口內的二進制數據data、窗口值window;
輸出:熵值Hbin、窗口內所有值的出現次數c.
① functionCalc_window_entropy(data,window)
②c=np.bincount(data?4,minlength=16);
③ /*將data右移4位,即范圍從[0,255]縮小至[0,15],然后計算data中的值出現次數.
c為一個shape=(1,16)的數組*/
④p=c.astype(np.float32)/window;
⑤ /*將c轉為浮點類型除以窗口值*/
她要嫁給他,他說,不行,你有丈夫。她說,我要跟你走,不管你到哪,我都跟著。他說,不行,我身邊不能帶著女人。他又說,其實,我們不是朋友,是敵人。
⑥wh=np.where(c)[0];
⑦ /*獲取當前坐標對應值不為0的下標*/
⑧Hg=np.sum(-p[wh]×
np.lb(p[wh]))×2;
⑨ /*計算熵值*/
⑩Hbin=int(Hg×2);
算法3.遍歷二進制文件字節熵算法流程.
輸入:原始二進制樣本文件file、窗口值window、步長step;
輸出:(1,256)形狀大小的特征向量entropy.
① functionCalc_file_entropy(file,
window,step)
②f=open(file,‘rb’);
③data=np.frombuffer(f);
④entropy=np.zeros((16,16));
⑤filesize=data.shape(0);
⑥ iffilesize≤window
⑦ /*如果文件大小小于窗口值*/
⑧Hb,c=Calc_window_entropy(data,window);
⑨entropy[Hb,:]+=c;
⑩ else
(data,windows,shape);
(block,window);
我們使用IDA Pro反匯編工具的批處理功能對PE可執行文件進行反匯編,獲取二進制程序的opcode序列.可執行文件經過反匯編后一般分為3部分,包括text,data,bss段.data和bss段一般存儲程序的數據變量和數據常量,因此我們只對text段的opcode序列進行分析.text段部分opcode序列如圖4所示:

Fig. 4 Original opcode sequence圖4 原始opcode序列
由圖4可見,一條匯編指令由操作碼和操作數構成,但操作數過于復雜,包含偏移量、內存地址、立即數等各種表示形式.由于操作數格式復雜、長短差距懸殊、含義豐富雜亂且數量龐大,無法直接作為后續特征處理的語料庫.因此我們在獲取text段的opcode序列之后,對opcode序列進行了預處理.制定一系列的規則對opcode序列進行替換,使其表現方式有限,清除匯編數據中的一些噪聲干擾.
我們首先統計了所有x86指令集的操作碼及其參考含義[21],因為在IDA Pro反匯編得到的asm反匯編文件內存在大量的注釋、數據變量定義、交叉引用等方便提供給逆向工程分析師分析的內容.因此只有當asm反匯編文件的第一個分詞為x86指令集中的分詞時,我們才繼續統計該行中的剩余分詞.對操作數進行預處理時,我們參考文獻[22]的匯編指令預處理過程,制定6項規則對操作數進行處理.
1) 寄存器.收集8 b,16 b,32 b這3種主要的寄存器列表,如eax,ebx,ecx,edx,esi,edi,ebp,esp,ax,bx,al,bl等.
2) 內存.表示形式為內存的全部標準化為mem,如[ebx],[esi+8]等.
3) 立即數.表示形式為立即數的全部標準化為val,如5A4Dh,0 h等.
4) 調用指令.調用內部函數后的操作數全部標準化為sub,如“call sub_102A02D”,標準化為“call sub”.
5) 跳轉指令.跳轉指令后的操作數全部標準化為loc,如“jnz loc_3025A8”,標準化為“jnz loc”.
6) 對于不符合上述5條的操作數,全部標準化為oth.
對opcode序列進行預處理后,圖4的opcode序列處理為圖5所示:

Fig. 5 Original opcode sequence圖5 預處理后opcode序列
我們將預處理后的每個操作碼設定為一個單 詞,每條匯編指令設定為一個短語.隨后采用 Word2Vec[19-20,23-24]模型對所有asm文件進行訓練, 獲取每個詞對應的詞向量表示.Word2Vec模型是 當前最流行的詞向量轉換方法之一,該模型是一個 簡化的淺層神經網絡,包括輸入層、隱藏層和輸出 層.其中,我們采用Word22Vec模型的CBOW 模型 來根據上下文信息預測一個詞,該模型的輸入是某 一個特定詞上下文相關詞對應的詞向量,輸出則是這 一特定詞的詞向量.匯編指令處理流程如圖6所示:

Fig. 6 opcode sequence processing flow圖6 opcode序列處理流程
我們使用Linux下的Strings工具來提取二進制文件中的可打印字符串,但在可打印字符串中存在較多的噪聲與干擾,因此我們使用正則匹配有意義的字符串以減少噪聲和干擾.正則匹配的模式為0x30~0x39,0x41~0x5A,0x61~0x7A分別對應阿拉伯數字0~9、大寫字母A~Z和小寫字母a~z.之后我們使用TF-IDF算法對string序列進行處理,用于統計惡意樣本庫和良性樣本庫中string重要程度的差異.TF-IDF算法具體為.
詞頻-逆文檔頻率(term frequency-inverse docu-ment frequency, TF-IDF)是一種常用的文本特征向量化方法之一,該方法可體現出文本中某個詞語對整個文本的重要程度.一個特定詞語的TF-IDF值為TF值與IDF值的乘積,而TF值表示某一個給定的詞語在該文件中出現的頻率:

(3)
IDF則表示一個詞語普遍重要性的度量,某一特定詞語的IDF,可以由總文件數目除以包含該詞語的文件數目,再對商取以10為底的對數:

(4)
我們所使用字符串特征提取算法如算法4所述:
算法4.字符串特征提取算法.
輸入:每個樣本的原始字符串string;
輸出:3000維的特征矩陣Feature_map.
① functiontf_idf_string(string)
②Reg_mode=“[a-zA-Z0-9]+”;
③ /*定義正則匹配模式*/
④new_s=re.findall(Reg_mode,string);
⑤ /*使用定義的匹配模式正則匹配*/
⑥n_gram_strings=n_gram(new_s,[1,3]);
⑦ /*使用n_gram算法對字符串做(1,3)范圍內擴充*/
⑧Feature_map=tf_idf.fit(n_gram_strings);
⑨ /*tf_idf算法訓練處理好的字符串*/
⑩ returnFeature_map;
當前相當多的學者嘗試利用PE文件結構檢測惡意軟件,例如文獻[14]使用最少的領域知識,即MS-DOS,COFF,Optional標頭信息進行惡意軟件的檢測并取得了較好的結果.
PE文件格式描述了Microsoft Windows操作系統的主要可執行文件格式,包括可執行文件,動態鏈接庫等.而可執行文件結構又包含許多標準headers,每個header對應一個或多個部分,例如通用對象文件結構(common object file format, COFF)頭則包含一些相當重要的信息,如文件所針對標識鏈接器版本、文件的性質、節數、可選標頭標識連接器版本、代碼大小、已初始化和未初始化的數據大小、入口地址等.由此可見,根據先驗知識,PE文件頭結構經過解析后的結果在識別文件是否異常可以發揮重要作用.我們借鑒文獻[11]中所提到的思路,提取PE文件中的general,header,imports,exports,section這5部分結構信息,如表2所述,再分別做Feature-Hasher算法處理,將每部分向量拼接成形狀為1 735維的向量表示,即可得到每個樣本對應的PE文件結構特征.

Table 2 Corresponding Characteristics of Each Part of the PE File
我們使用反匯編工具IDA Pro批量導出惡意樣本的GDL文件,GDL文件通常由3部分組成:顏色、節點和邊,如圖7所示.其中顏色標識唯一的ID,后面跟的3個數字為RGB顏色每個通道所代表的顏色值;節點標識中title字段是唯一標識,label字段代表函數名,color,textcolor,bordercolor等字段代表顏色;邊標識中有源節點和目的節點2個信息,這2個信息與節點標識中的title字段對應,用以標識一條有向邊.

Fig. 7 The description of GDL file format圖7 GDL文件格式說明
我們發現,在節點與節點之間的有向邊反映了該二進制文件中函數的互相調用關系,函數之間的調用關系在一定程度上反映了該二進制文件本身的行為意圖,因此,我們抽取每個樣本文件的有向邊關系矩陣.由于二進制文件可能存在函數較多的情況,在本文的實驗中,sha256值為ec470aec5741cdbb45 d926e57cd5258104654cafa74771a4cf73cf33f23a1ef4的樣本中函數的數量達到39 664個,可知其生成的調用關系矩陣的大小是無比龐大的,而我們需要在保證精確度下降程度不大的情況下盡可能減少后續模型訓練的時間,因此我們采用核主成分分析算法對原始調用關系矩陣進行預處理,達到降維的目的.
核主成分分析算法(kernel principal component analysis, KPCA)是利用核技術對主成分分析的一種非線性推廣,該方法通過非線性映射,將原始數據從輸入控件映射到特征空間,使其具有更好的可分性,再對特征空間中的映射數據進行主成分分析,進一步得到該映射數據的主成分[25],并對生成的特征矩陣做規范化、歸一化處理.
提取函數調用關系算法流程如算法5所述:
算法5.提取函數調用關系算法流程.
輸入:GDL文件;
輸出:(1,20 000)特征矩陣.
① functionExtract_func_call(file)
②data=open_and_read(file);
③ /*讀取GDL文件內容至data中*/
④max_node_addr=re.findall(“//node 0”)[0]-1;
⑤ /*使用正則定位node的最大值位置*/
⑥max_node=data[max_node_addr].
node.title;
⑦ /*讀取node的最大節點數*/
⑧func_call=np.zeros((max_node,max_node));
⑨ forlineindata
⑩ /*遍歷有向邊*/
集成學習是一種范式,通過集成多種機器學習算法以進一步提高性能,這是一種基于委員會的方法,旨在獲得每個成員的投票.近幾年來,各個大數據驅動的機器學習賽事系統如Kaggle、天池、DataCon等頻繁看到集成學習的身影,集成學習思想也在其中大放光芒.自1979年集成學習思想[26]被首次提出,集成學習便不斷的蓬勃發展,由于集成模型具有更低的方差和更好的泛化能力,集成學習算法也越來越受到科研人員的關注.集成學習主要包含3種經典算法:Bagging,Boosting,Stacking.由于本文中只使用到了Bagging和Stacking,故本章節僅對這2種集成方法進行詳細介紹,同時介紹本文所使用的多結果聚合算法:權重策略投票.
Bagging算法[27]又稱裝袋算法,是最早的集成學習算法之一,Bagging的2個關鍵是自助和聚合.自助即使用自助采樣法[28]隨機改變訓練集的分布并產生新的子集.同時對于Bagging的任一基分類器,訓練時原始訓練集中約有36.8%的樣本會未被使用,此時該基分類器的好壞可以通過這些包外樣本進行估算.而對于分類任務,聚合則是指Bagging將樣本傳給基分類器并收集輸出,然后對輸出標記進行投票,獲勝的標記作為預測結果,平局則隨機挑選一個作為預測結果.
由于Bagging聚合多個且獨立的基分類器,故其可以顯著降低方差,提高模型性能,避免過擬合的發生.如圖8為Bagging算法流程:

Fig. 8 Bagging algorithm flow圖8 Bagging算法流程

Fig. 9 Stacking algorithm flow圖9 Stacking算法流程
Stacking算法[29]其結構如圖9所示,其中包括2層學習器,第1層有不定數目的基學習器,輸入的特征矩陣經由第1層的基學習器來抽取有效的特征,第2層的輸入來自于第1層的特征輸出,故第2層的輸入中不應包含原始特征.Stacking集成框架的存在即是為了降低單模型對訓練數據過擬合的風險,故第2層分類器通常為較為簡單的線性分類器,比如邏輯回歸、SVM算法等.由于Stacking框架平滑的特性,故其能突顯出性能最佳的基模型,且降低性能較差的基模型,使之泛化能力更加穩定.
在使用每部分特征預測出結果后,我們利用權重策略投票算法集成5種特征生成的結果,即5種特征經過Bagging集成或Stacking集成后輸出每個測試樣本的2類概率proba0和proba1.同時我們為每個分類器設置相應的權重,首先我們選擇唯一的評價標準,例如準確率、召回率、F1等,并計算該評價標準在每個模型訓練集上5折交叉驗證的分數,然后再把該分數相加得到總分數,將每個分類器的分數與總分數相比,得到單個分類器的權值λi(其中i表示分類器的個數):
(5)
然后使用計算得到的權值λi與各分類器所給出的對應測試樣本的概率相乘,得到該測試樣本的概率p0和p1,將各分類器的p0和p1累加得到聚合結果finalP0和finalP1,其中finalP0指被判斷為正常樣本的概率,finalP1則是指被判斷為惡意樣本的概率.
為了提高檢出率,我們檢查每個測試樣本的finalP1是否大于我們所設置的策略閾值,如大于該閾值,則輸出為惡意樣本,否則輸出為正常樣本.
權重策略投票算法可以最大程度地糾正每部分特征訓練出的分類器的初始分類錯誤,使聚合結果更加地可靠.
我們在第1節算法提取的基礎上,對部分特征進行整合.由于熵描述了惡意樣本混亂程度的大小,從本質上講加殼后的惡意樣本比未加殼的惡意樣本混亂程度更大,即如果可執行文件使用了加密或者加殼程序則往往反應了較高的熵值[30],而我們以往的認知是:正常樣本基本不會施以加殼等手段,故熵在惡意軟件檢測中發揮了很好的功效.但近期的一些研究[16,31]表明:正常軟件為了保護版權等信息也越來越多地使用加殼等手段;低熵加殼方法逐漸成為一種流行的加殼方式.故單純使用字節熵直方圖特征會使得模型的泛化能力越來越差,不利于其健壯性.而且字節統計值和字節熵直方圖特征的維數與GIST描述符的特征維數相同,均為512維,這2部分特征無需任何先驗知識就能對惡意樣本檢測,因此我們將惡意樣本圖像的Gist描述符特征與字節統計值和字節熵直方圖特征整合為非PE結構特征.
最終我們構成5組特征:非PE結構特征、字符串序列特征、匯編指令特征、PE結構特征以及函數調用關系特征.特征提取框架圖如圖10所示:

Fig.10 Feature extraction frame diagram圖10 特征提取框架圖
我們針對不同的特征,利用5折交叉驗證訓練不同的預選模型,根據在驗證集上的評價結果,選出合適數量的模型,而后分別使用Stacking框架或Bagging框架對基模型進行聚合,觀測在驗證集上評價結果的變化.每部分模型對應基模型列表如表3所示.而后我們使用網格搜索算法,對基模型所對應的參數加以調整,從而使基模型更加擬合數據分布.

Table 3 Each Part of the Feature Corresponds to the Base Model List
本文進行實驗的惡意軟件靜態檢測整體框架如圖11所示:

Fig. 11 Overall framwork of malware stastic detection圖11 惡意軟件靜態檢測整體框架圖
本文所使用數據集由2020年“DataCon開放數據計劃”[32]提供,為23 655個標注好的PE樣本,其中包含7 896個挖礦樣本與15 759個非挖礦樣本(其他家族惡意樣本),所有樣本均為現網中捕獲的真實數據,并非仿真數據、陳舊數據,這就保證了該數據集中的樣本存在加殼、混淆等大量對抗樣本.經我們統計:該數據集中包含UPX殼、VMP殼、Themida殼以及Mpress殼等多種帶有壓縮殼或加密殼的樣本.而且該數據集通過代碼相似性等方法過濾了相似樣本,保證所有樣本具有一定的多樣性.同時為了防止樣本誤運行,都抹去了MZ頭、PE頭以及導入導出表部分.故我們在進行實驗部分的時候人工為其添加了MZ頭和PE頭部分,使之可以被當成PE文件進行解析.
為了更能彰顯模型的泛化能力與抗加殼抗混淆的能力,我們舍棄正常情況下4∶1或7∶3的劃分標準,按照1∶3的比例將樣本隨機劃分為訓練集與測試集,即訓練集中的黑白樣本為2 000和4 000;測試集中的黑白樣本為5 896和11 759.
混淆矩陣是監督學習中一種可視化表示形式,為了方便表示后續的評價標準,我們首先介紹惡意軟件檢測的混淆矩陣,如表4所示,其中,TP指將惡意軟件正確分類為惡意軟件;FP指將正常軟件錯誤分類為惡意軟件;FN指將惡意軟件錯誤分類為正常軟件;TN指將正常軟件正確分類為正常軟件.

Table 4 Confusion Matrix表4 混淆矩陣
本文選用惡意代碼檢測領域的通用評測標準的準確率(accuracy rate,AR)、召回率(recall rate,RR)、誤報率(false positive rate,FPR)以及召回率和誤報率的平衡標準Score對本文方法進行評測,每個評測標準的計算:

(6)

(7)

(8)
Score=RR-ε×FPR.
(9)
其中式(9)中的ε為懲罰因子,可以為任意數值,我們在實驗中設為1.2.Score評價標準實際含義為召回率減去懲罰因子乘誤報率,用于平衡召回率和誤報率,即Score的大小與召回率呈正相關,與誤報率呈負相關.
根據特征提取方案及總體模型架構,我們對字節熵直方圖特征中的window和step變量以及權重策略投票算法中的策略閾值做不同取值的對比實驗.
在非PE結構特征中,字節熵直方圖的窗口和步長2個變量的取值對該部分特征的影響較大,所以我們對2個變量進行分析:首先固定step的值為256,使用CatBoost算法、XGBoost算法以及多層感知機算法(multilayer perceptron, MLP)3種不同算法對不同值的window所表現的Score進行評價,如圖12所示,顯而易見,在window=1280時,CatBoost模型和XGBoost模型達到最優,MLP模型也呈上升趨勢;而后我們取window=1280,利用上述3個算法對不同值的step進行Score評價,如圖13所示,在step=128時,MLP模型達到最優,CatBoost模型和XGBoost模型的Score值也在中等偏上,故我們選取step=128.

Fig. 12 When step=256, the effect of windowsize on Score圖12 step=256時window大小對Score的影響

Fig. 13 When window=1 280, the effect of stepsize on Score圖13 window=1 280時step大小對Score的影響
當我們進行最后的5部分特征聚合時,權重策略投票算法中的策略閾值也對最后的結果起著至關重要的作用,故我們針對該閾值進行實驗驗證:設定不同的閾值,以此對照AR,RR,FPR,Score,找到召回率和誤報率的最優平衡點.不同閾值對結果的影響如表5所示.
由表5及圖14可知,召回率與策略閾值呈正相關,誤報率隨策略閾值呈負相關,當閾值為0.30時,AR與Score評價均達到最高為0.969 9和0.921 9.

Table 5 The Impact of Different Policy Thresholds on Voting Algorithms

Fig. 14 Changes in AR, RR, and Score with policy thresholds圖14 AR,RR,Score隨策略閾值的變化情況
針對Stacking集成學習算法的二級分類器選擇,我們選擇Logistic Regression,KNN,SVM等算法進行評測,由于篇幅有限,我們僅對非PE文件結構特征進行描述,如表6所示.可以看出,在非PE結構特征中,當二級分類器為SVM算法時,Stacking算法在Score上的表現是最優的.但在字符串特征和PE結構特征中,二級分類器選擇KNN算法效果會更好,因此我們根據最終模型的表現效果來確定二級分類器算法的選擇.

Table 6 Stacking Algorithm Two-Level Classifier Comparison表6 Stacking算法二級分類器比較
我們提取上述5種特征,分別采用表現最好的單模型算法與集成學習算法輸出每種特征的性能指標,對比結果如表7所示,集成學習模型在AR,RR,Score上均略高或持平于單模型算法,凸顯了集成學習更加強大的潛力.并且使用權重策略投票算法聚合5部分特征的結果,通過調整策略閾值使得實驗結果在AR,RR,Score等評價標準上均有進一步提升.

Table 7 Comparison of Feature Detection Results for Each Part
我們參考文獻[15,19,22,33]分別做對比實驗,4篇對比文獻中,2篇關于深度學習,1篇關于集成學習,最后1篇則關于機器學習.文獻[15]是提取惡意樣本的函數調用圖,通過歸一化使函數調用圖更加穩定,繼而使用深度卷積神經網絡進行訓練得到分類結果.文獻[19]則是提取惡意樣本的灰度圖,通過不同參數的GIST描述符提取特征,而后采取KNN算法和隨機森林算法完成投票并達到分類效果.文獻[33]則是對惡意樣本的圖像進行處理,首先訓練一個成熟的卷積神經網絡,而后使用Xgboost算法替代卷積神經網絡的全連接層的最后一層以達到分類效果.文獻[22]是提取惡意樣本的匯編指令,經過預處理之后使用LDA算法降維,而后經LDA產生的數據由隨機森林算法訓練后得到結果.表8為對比實驗結果,我們隨后對文獻[22]的分類器做了改進,使用隨機森林、Catboost、Xgboost、lightGBM等算法進行集成學習,其結果如表8第4行所示,雖然相較文獻[22]有一定的提升,但跟我們的方法相比,明顯還存在一定差距.在AR評價標準下,我們所提出的基于多特征集成學習的靜態檢測框架在準確率上能達到96.99%,其余4篇文獻的AR值均在96.99%之下;在召回率評價標準下,其余4篇文獻所表現出的性能仍然明顯低于我們的方法;在誤報率評價標準下,雖然文獻[22,33]略低于于我們的方法,但我們的方法所表現出的誤報率仍在可接受范圍內.并且在綜合召回率和誤報率的Score的評價標準下,我們所提出的基于多特征的檢測方法表現最好,同時對混淆加殼等樣本的普適性更高.

Table 8 Explanation of Comparative Experiment Results表8 對比實驗結果說明
網絡空間安全的威脅日益加劇,海量病毒的處理已經成為愈發緊要的問題,本文所提出的基于多特征集成學習的惡意代碼靜態檢測框架具有檢出率高、誤報率低、抗加殼、混淆等一系列優點,可以很好地適應數據量級別較高的要求.但匯編指令特征與CFG調用關系特征所使用的模型仍為普通的機器學習模型,未將特征的性能全部發揮出來,在后續工作中將使用深度學習框架改進并搭建循環神經網絡、圖神經網絡等模型,進一步挖掘2部分特征.同時我們將持續關注在惡意軟件檢測領域的對抗攻擊技術,計劃使用一些較新的對抗攻擊技術攻擊檢測模型,核驗該檢測方法是否能抵抗更加高級的對抗攻擊方法.