李佟鴻,冷 靜
(湖北警官學院,武漢 430032)
隨著網絡技術的飛速發(fā)展,惡意代碼在各種各樣的惡意意圖中急劇增長。根據AV-TEST發(fā)布的最新報告,每天都會監(jiān)測到超過45萬個新的惡意代碼,截至2023年5月,累計捕獲12.55億惡意樣本。[1]應對快速增長的惡意代碼的數量、復雜性和可變性要求,研究和開發(fā)新的智能化、自動化的惡意代碼檢測方法,已成為網絡安全行業(yè)的研究熱點。目前較為流行的方法是從文件中提取相應特征,如字節(jié)序列、API調用、操作碼序列和硬件事件等,使用機器學習技術來檢測惡意代碼。利用可移植的可執(zhí)行文件頭(Portable Executable header,PE Header)提取特征,并用機器學習的方法來研究惡意代碼,是該領域一種廣泛采用的方法。惡意代碼和正常程序的目的不同,導致它們的PE文件格式存在結構性差異,這種差異表現出包含不同的特征,可用于區(qū)分惡意代碼和良性程序。本文對PE文件提取文件頭信息,使用可視化方法分析惡意代碼和良性程序突出特征的差異,設計了一個基于stacking結合策略的機器學習檢測模型,獲得了較高的惡意代碼檢測率,以期實現一個有效的、低成本的惡意代碼識別途徑。
研究人員通過提取PE惡意代碼的靜態(tài)和動態(tài)特征,使用機器學習方法研究PE文件進行惡意代碼的分類和檢驗,是目前網絡安全領域非常熱門的研究熱點,并取得了大量的研究成果。Rezaei T(2020)提出了一個基于PE 頭信息的混合機器學習和基于簽名的技術來檢測惡意代碼的研究方法,總體準確率達到99.70%以上;[2]他隨后的研究(2021)又提出了一種新的深度學習方法,[3]利用了PE文件頭的原始字節(jié),在深度神經網絡訓練過程中使用聚類算法,學習惡意代碼和良性程序的不同嵌入表示,該方法具有速度快、計算開銷低等突出特點。Raff 等人使用PE 頭字節(jié)來檢測惡意代碼,從報頭的原始字節(jié)中提取特征來訓練多個機器學習模型,檢測效果非常好。[4]Manavi 等人研究勒索軟件的檢測,使用可執(zhí)行文件頭創(chuàng)建一個圖,然后使用“冪迭代”方法,將該圖映射到特征空間中使用模型分析,獲得了較高的檢測率。[5]Kim 等人提出了一種使用機器學習算法的基于PE 頭的惡意代碼檢測技術,準確率達到99%。[6]Darshan 等人使用一個PE 文件混合特征集來訓練多個機器學習模型來檢測惡意代碼。[7]Azeez 等人提出了一種基于Stacking 集成學習(一維卷積神經網絡+機器學習)的惡意代碼檢測方法,在Windows 可移植可執(zhí)行(PE)惡意代碼數據集上進行實驗,取得了良好的檢測效果。[8]
國內使用PE文件特征集檢測惡意代碼,研究起步較早,也取得很多突出的成果,如樊震等提出了一種基于靜態(tài)文件和PE文件結構的未知病毒檢測方法。[9]該方法具有較高的檢測率和較低的誤檢率。徐國天等提出一種基于XGBoost與Stacking融合模型,通過獲取目標惡意代碼對外通信流量自動化生成高級特征集,實現惡意代碼多分類檢測方法。[10]賈立鵬提出一種基于PE文件多特征融合的惡意代碼分類方法,利用惡意代碼的多種特征和集成學習思想實現對惡意代碼家族的分類。[11]韓科研究了CNN在PE惡意代碼檢測中的應用,并嘗試分析對加殼程序的檢測效果。[12]
PE文件格式是一種通用對象文件格式(COFF),是一種數據結構,封裝了Windows OS loader 包裝好的可執(zhí)行代碼所需的信息。PE文件的格式信息如圖1所示。[13]
圖1 PE文件格式
PE文件由一個PE文件頭和一個節(jié)表(節(jié)頭)組成,后跟節(jié)的數據。PE文件頭由MS DOS頭、PE簽名、NT映像頭和可選頭組成。PE文件中有許多冗余字段和空格,為惡意代碼的傳播和隱藏創(chuàng)造了機會。這也使得惡意代碼和良性軟件的格式信息表現出許多差異。雖然格式信息不是很先進,但研究這些格式信息的差異是檢測已知和未知惡意代碼的一種可行、有效方法。如Size Of D-ebugData是調試信息的大小,惡意代碼為了防止調試而保留的調試數據較少,惡意代碼的調試數據明顯少于良性軟件;Number Of Sections 指節(jié)表的大小,此功能在惡意代碼和非惡意代碼文件中都不同;Number Of Symbols 表示符號表中的條目數,良性軟件將符號信息保留在符號表中,惡意代碼中的符號數量遠遠大于良性軟件中的符號數量。惡意可執(zhí)行文件在資源部分的條目(如消息表、組圖標和版本)少于良性軟件中的條目。95%的良性軟件有版本信息,但只有40.8%的惡意代碼有版本信息。90%的情況下,當文件的校驗和Major Image Version 和DLL Characteristics 等于零時,會發(fā)現該文件是惡意的。
我們選擇了一些重要特征,通過繪制直方圖和核密度估計圖,進行可視化比對分析,用直觀的方式展示了這些特征在惡意和良性PE文件有明顯的不同,如圖2所示。
圖2 特征的可視化分析
機器學習(Machine Learning,ML)在計算機安全領域有著非常廣泛的應用,比如惡意URL檢測、入侵檢測和惡意代碼檢測。ML 成為當前惡意代碼分類和聚類中的主要技術之一。使用各種工具IDA Pro、Lida、Peview、PeStudio分析惡意代碼樣本,并提取動態(tài)或靜態(tài)特征,用于使用傳統算法或機器學習算法訓練惡意代碼檢測器,如圖3所示,展示了使用靜態(tài)特征分析開發(fā)基于特征碼的惡意代碼分類器的所有可能方法。它涵蓋了設計惡意代碼檢測器的各種工具、靜態(tài)特性和方法。
圖3 惡意代碼靜態(tài)分析方法
本文采用的ML算法通過考慮惡意代碼和良性樣本的更多特征,為開發(fā)更精確的模型提供了更多選擇和空間。如圖4所示,使用機器學習算法的惡意代碼檢測系統示意圖,展示了機器學習分類器的基本架構。首先提取特征,再進行特征選擇和分析,最后應用集成學習分類模型對惡意代碼分類器進行訓練。
圖4 惡意代碼檢測基本架構
在有監(jiān)督的機器學習分類或回歸任務中,往往希望通過學習模型得到準確且穩(wěn)定的學習結果。然而,由于訓練樣本的質量、學習模型的復雜度等問題,可能存在穩(wěn)定性不高或效果不理想等問題,研究人員往往采用集成學習的方法解決這些問題。集成學習指的是將多個基礎學習模型按照集成策略組合在一起共同完成學習任務,[14]與僅使用單一學習模型相比,集成模型可以取得更好、更穩(wěn)定的學習效果。集成學習的結合策略主要有Boosting、Bagging 和Stacking等三種架構。[15]
本文使用的ML 算法如GBDT(Gradient Boosting Decision Tree)就是采取Boosting 結合策略,隨機森林(Random Forest,RF)算法采取的是Bagging 結合策略,都取得了較好的分類效果。根據Stacking 結合策略原理,我們設計了一個兩層的Stacking Classifier 學習模型組,如圖5 所示,第一層由RandomForest 和Gradient-Boosting對數據集進行初始訓練和測試,第二層采用DecisionTree作為Meta-Model,對第一層生成的數據進行訓練和測試,生成最終檢測結果。該設計模型能夠取得較好的檢測效果。
圖5 Stacking分類模型
在本文采用的機器學習算法中,GBDT是一個重要的取得良好檢測效果的算法模型,這里我們重點討論該算法的基本理論。GBDT是一種迭代的決策樹算法,由多棵決策樹組成,所有樹的結論累加起來作為最終答案。該算法是在BDT(Boosting Decision Tree,提升決策樹)的基礎上改進得到的,BDT是一種以CART決策樹為基礎學習模型的集成學習方法,算法原理如圖6所示。
圖6 BDT算法原理
GDBT算法流程如下所示:
Input:訓練數據集T={(x1,y1) ,(x2,y2),…(xm,ym)};Loss函數L(Y,f(X))
(1)初始化(最大迭代次數為N,c的均值可以設置為樣本y的均值)
(2)for t=1 to N:do
(3)得到強學習器f(x)表達式
所有實驗均在以下規(guī)格的系統上進行:Intel(R)Core(TM)i7-8570CPU@3.10GHz,8GB 內存,操作系統為ubuntu18.04,該實驗使用python V3.6和Tensorflow V1.13.1實現。PE頭字節(jié)是使用python一個第三方庫pefile作為工具來提取,提取方法的實現是公開的。
本文使用的數據集是從Kaggle獲取。[16]屬于PE文件的良性和惡意樣本有19611個,如圖7所示。數據集最初有77個特征,包括PE header中DOS_HEADER、NT_HEADER、FILE_HEADER和OPTIONAL_HEADER 中的全部字段。去除不重要的特征可以確保算法的最佳性能,如避免數據擬合過度或擬合不足,并提高運算速度。本文采用主成分分析(PCA)進行特征降維,選擇了55個特征(代表95%的可變性)傳遞到機器學習模型中,因為這些特征被證明與被檢測文件是惡意還是良性相關。
圖7 數據集樣本分布
(1)實驗評價指標
為了對實驗效果進行評估,本文使用準確率(Accuracy)、查準率(Presision)、查全率(Recall)、F1-score 作為實驗的評價指標。計算過程如公式所示其中,TP是實際為正預測為正,TN是實際為正預測為負,FP是實際為負預測為正,FN是實際為負預測為負。
另一個評價方法是ROC曲線下的面積AUC(Area Under Curve),是二分類器的評價指標,它主要反映的是一個分類器的排序能力。對于給定一個正例和一個負例,它的值代表了將給定正例排在給定負例前面的概率。它的計算方式是通過TPR(True Positive Rate)、FPR(False Positive Rate)來分別作為橫縱坐標畫出曲線,再計算曲線下面積。
(2)實驗結果分析
在本次實驗中,主要檢驗基于上述設計的Stacking集成學習模型的分類效果。作為實驗比對的機器學習算法主要有高斯樸素貝葉斯(Gaussian Naive Bayes)、多項式樸素貝葉斯(Multinomial Naive Bayes)、伯努利分布樸素貝葉斯(Bernoulli Naive Bayes)、決策樹(Decision Tree)、隨機森林(Random Forest)、Gradient Boosting(簡稱為GBDT)等基礎算法模型。實驗結果如表1所示。
表1 集成學習模型實驗結果
在實驗中,Decision Tree、Random Forest、Gradient Boosting都取得較好的分類效果,Stacking分類模型取得的分類效果最好,準確率達到了99.1%。
各分類模型的學習曲線如圖8所示。
圖8 基礎算法學習曲線
Stacking分類模型的學習曲線和ROC曲線如圖9所示。
圖9 Stacking分類模型學習曲線與ROC曲線
各算法模型分類效果綜合對比如圖10所示。
圖10 算法模型分類效果對比
(3)對比驗證
對于本次實驗,我們又使用了一個更大的PE文件數據集來進一步檢驗該模型的分類效果。該數據集有138148個樣本,這些樣本來自各種惡意代碼存儲庫,包括96724個惡意樣本和41424個良性樣本。
獲得的實驗結果如下。一是MultinomialNB、BermoulliNB 等算法欠擬合情況得到明顯改善,實驗準確度有所提高。如圖11所示。
圖11 MultinomialNB和BermoulliNB學習曲線
二是Decision Tree、Gradient Boosting等依然保持較好的實驗效果,如圖12所示。
圖12 決策樹和GDBT學習曲線
三是Stacking模型效果。所設計的堆疊算法(Stacking)分類模型,ROC曲線下的面積幾乎接近于1,學習曲線依然能夠保持很好的分類效果。如圖13所示。
圖13 Stacking模型的ROC曲線和學習曲線
但通過比對實驗,也發(fā)現存在的一些問題,如增加數據集,對于Stacking模型、Decision Tree、GDBT等檢測準確率高效果好的模型,改善過擬合的情況效果不明顯,還需要進一步改進模型,優(yōu)化參數或提高模型的復雜度以改善過擬合問題。
本文對PE文件提取文件頭信息,對重要特征信息進行可視化分析,直觀地展示了惡意代碼與良性程序之間的特征差異。將機器學習的集成學習思想應用到惡意代碼檢測分析,使用幾種典型的集成學習模型對惡意代碼特征進行學習,取得了較好的檢測效果。設計的Stacking 組合模型能夠達到99.13%的分類準確率和98.22%的F1-Score,有效實現了惡意代碼的檢測。Gradient Boosting 同樣取得了99%以上的準確率,與Stacking組合模型相比,Gradient Boosting 能夠在更短的時間內完成實驗訓練。實驗結果表明,本文提出的惡意代碼檢測方法具有較強的檢測能力,是一種有效的、低成本的檢測方法。該方法的不足之處,一是分類效果比較好的模型,存在過擬合情況;二是針對復雜的惡意代碼(如加殼程序)僅采用獲取的文件頭信息進行檢測,方法較單一。下一步研究的重點,將設計更為復雜的檢測模型,改善過擬合情況;同時對PE文件進行多特征提取,如API、字節(jié)碼等,結合PE文件頭信息,實現多特征融合研究,并進一步應用深度學習模型,提高惡意代碼檢測的準確度。
注釋:
①該圖片引自“Kevin,PE File Format,http://dandylife.net/blog/archives/category/attack-defense”.