趙翠镕, 張文杰, 方 勇, 劉 亮, 張 磊
(四川大學網(wǎng)絡(luò)空間安全學院, 成都 610065)
當前的惡意代碼檢測主要是基于二進制文件靜態(tài)特征的靜態(tài)檢測和基于動態(tài)行為分析的動態(tài)檢測.靜態(tài)檢測通過提取二進制文件的反匯編序列,字符串,字節(jié)碼等特征來表示程序的行為.靜態(tài)檢測即為基于特征碼的檢測方法,通過匹配特征庫中的特征簽名來檢測惡意代碼,是反病毒軟件最為常用的檢測方法.此類方法的簡單,快捷等優(yōu)點吸引了很多研究者的關(guān)注. Ahmadi等人[1]基于微軟2015提供的Kaggle數(shù)據(jù)集[2],提出了一種基于十六進制字節(jié)碼和反匯編序列層次的惡意代碼分類方法,基于XGBoost分類器來進行惡意代碼分類,在保證分類精度的前提下,降低了性能開銷.Hassen等人[3]提出一種基于函數(shù)調(diào)用圖的惡意代碼分類方法,在圖匹配算法上進行改進,提高了分類精度和性能.Han等人[4]提出一種基于圖像進行惡意代碼檢測的方法,通過把二進制文件轉(zhuǎn)換為圖像和熵圖來進行惡意代碼分類.以上的方法都是從二進制文件的不同層次來提取特征,在一定范圍內(nèi)可以達到很高的檢測率.但是隨著越來越多的樣本添加了反靜態(tài)檢測的功能,如加殼、多態(tài)、混淆等,靜態(tài)檢測的效果越來越差.
基于動態(tài)分析的檢測方法不受加殼,多態(tài),混淆等因素的影響,可以有效檢測已知和未知的惡意代碼,受到了眾多研究者的青睞[5-8].動態(tài)檢測是通過在沙箱中執(zhí)行惡意代碼,通過獲取樣本與系統(tǒng)對象,資源和服務(wù)等的實時交互,基于程序的動態(tài)行為來構(gòu)造特征用于惡意代碼檢測.此類方法大多基于API序列構(gòu)造特征,因為API是應(yīng)用程序與操作系統(tǒng)的接口,程序的行為如文件操作,進程操作,注冊表操作等都是通過調(diào)用特定的API來實現(xiàn)的.因此眾多研究人員基于API特征進行惡意代碼檢測.Hansen等人[5]提出了一種基于API調(diào)用及其相關(guān)信息作為特征的動態(tài)檢測方法,相比其他方法,在特征種類和特征剪枝上進行創(chuàng)新,達到了不錯的檢測效果.Ding等人[6]提出一種基于家族行為依賴圖的惡意代碼檢測方法,采用動態(tài)污點分析構(gòu)建行為依賴圖,然后基于最大權(quán)重子圖匹配來檢測惡意代碼.Ki等人[7]提出一種新穎的基于DNA序列比對算法的惡意代碼檢測方法,基于該算法從不同類別的惡意代碼中提取惡意行為的常見API調(diào)用模式來檢測惡意代碼.上述的基于動態(tài)分析的檢測方法大多基于序列挖掘和圖匹配的方法進行惡意代碼檢測.基于序列挖掘的方法易受系統(tǒng)調(diào)用注入的影響,如插入一些無關(guān)的API調(diào)用,從而導致挖掘出來的API序列不再具備普適性.基于圖匹配的方法,時間開銷較大,并且隨著惡意代碼行為的越來越復雜,圖匹配的復雜度會越來越大.基于系統(tǒng)調(diào)用的注入混淆具有改變代碼語法特點但是仍保留行為語義的特點,基于語義的檢測方法利用這一特點,通過抽象語義特征來進行檢測可以達到較好的效果.
本文提出了一種基于程序語義API依賴圖的惡意代碼動態(tài)檢測方法,在真機物理環(huán)境執(zhí)行惡意代碼,使某些具有反虛擬機特征的惡意代碼得以正常運行,提取程序運行中較為完整的API調(diào)用來構(gòu)建API依賴圖,基于廣泛應(yīng)用于信息理論領(lǐng)域的AEP概念[9],提取API依賴圖的語義相關(guān)的典型路徑來定義程序的行為,以典型路徑的平均對數(shù)分支因子和直方圖bin技術(shù)來構(gòu)建特征空間,不包含原始的API調(diào)用,字符串等信息,從而增加了惡意代碼檢測模型的魯棒性,不易被攻擊,最后采用集成學習方法-隨機森林來分類惡意代碼.
本文提出了一種新的惡意軟件檢測機制,通過利用系統(tǒng)級信息流來描述程序行為.表征的行為是用于構(gòu)建和訓練特征空間的語義相關(guān)路徑來表示的.為了提取和識別語義相關(guān)的路徑,本文基于信息論中AEP的概念來實現(xiàn).根據(jù)AEP,在任何圖形中,都存在幾條路徑,幾乎包含圖形的所有信息.遵循這個概念和文獻[10]給出的證明,將AEP應(yīng)用于本文所提出的提取與語義相關(guān)的路徑的方法,構(gòu)造出一組語義相關(guān)路徑.在該路徑上本文應(yīng)用了一個稱為平均對數(shù)分支因子(ALBF[11])來構(gòu)建樣本的特征空間.最后采用隨機森林的機器學習方法來訓練和分類惡意代碼.這篇文章所提出的方法如圖1,分為三個階段,API序列提取,特征空間構(gòu)建和檢測模型訓練.
圖1 方法流程圖Fig.1 Flow chart of the method
(1) API序列提?。和ㄟ^改造現(xiàn)有的CuckooSandbox[12]環(huán)境,采用真機作為樣本分析環(huán)境,捕獲較為完整的系統(tǒng)API調(diào)用,作為原始的API序列數(shù)據(jù).
(2) 特征空間構(gòu)建:基于預處理后的API調(diào)用順序構(gòu)造API依賴圖;然后,根據(jù)AEP概念提取語義相關(guān)的API序列路徑;最后,采用平均對數(shù)分支因子構(gòu)建特征空間.
(3) 檢測模型訓練:首先,對得到的特征進行篩選,降低特征維度;然后,進行隨機森林分類器進行訓練得到檢測模型,用于惡意代碼檢測.
本節(jié)主要工作是把API調(diào)用轉(zhuǎn)換為有序的API依賴圖.圖的頂點對應(yīng)于程序跟蹤中的API調(diào)用,頂點u到頂點v的邊對應(yīng)為與
(1)
其中,Si→Sj代表從Si到Sj的轉(zhuǎn)變,284代表著WinXP的284個NTAPI函數(shù).如前所述:路徑假設(shè)為馬爾科夫鏈,所以滿足馬爾科夫?qū)傩怨?2).
(2)
API序列{S1,S2,S3,S4,S5,S1,S2,S5,S1,S2,S3,S5,S1,S3,S4,S5,S1,S3,S5}的圖表示如圖2所示,每一個邊上的數(shù)字代表其轉(zhuǎn)移概率Pij.表1為對應(yīng)的TPM矩陣.
圖2 API依賴圖Fig.2 API Dependency Graph
表1 API依賴對應(yīng)的TPM矩陣
Tab.1 The TPM matrix corresponding to the API dependency graph
PijS1S2S3S4S5S100.50.500S2000.500.5S30000.50.5S400.5000.5S510000
根據(jù)AEP,對于隨機過程,存在幾條路徑比圖形的其他路徑擁有很多的語義信息.作者已經(jīng)證明了這個觀點,并且稱之為“典型路徑”.本文也遵循同樣的概念,假設(shè)也存在典型路徑,圖的路徑有以下定義.
定義2 路徑P={S1,S2,...Sn}代表從S1開始到Sn結(jié)束的路徑.
S1代表路徑P第一個NTAPI調(diào)用,Sn代表路徑P最后一個調(diào)用,路徑的每個邊代表從一個API調(diào)用到另一個API調(diào)用的轉(zhuǎn)變.Pr(S1)表示S1出現(xiàn)的次數(shù)占所有出現(xiàn)的API序列次數(shù)的比例.而Pr(Si|Si-1=Si-1)則用Si-1到Si的轉(zhuǎn)移概率來表示.計算公式如式(3).此步驟的目的是確定所有從Sstart到Send的路徑,然后再來提取相關(guān)路徑.
Pr(P)=Pr(S1)×Pr(S2|S1=
S1)×...Pr(Sn|Sn-1=Sn-1)
(3)
為了判斷路徑的相關(guān)性,對每條路徑應(yīng)用AEP,首先確定樣本的最大熵值,如公式(4).
(4)
其中,n代表路徑長度;Tn代表路徑為n的路徑總數(shù),為了定義具有ε相關(guān)的ε語義相關(guān)路徑,應(yīng)用以下公式(5)來確定.
(5)
基于以上的理論,相應(yīng)的語義相關(guān)路徑提取算法的偽代碼如算法1所示.
算法1語義相關(guān)路徑提取算法
輸入API序列S={S1,S2,…,Sn}
輸出語義相關(guān)系數(shù)ε={ε1,ε2,…,εm}與其對應(yīng)的路徑Path P={P1,P1,…,Pm}
1) Function main(S)
2) 初始化ε=?,P=?,S_temp=?,T=?,λ=?
3) N_sequence=len(S),N_api=len_api(S) #N_sequence是所有序列的長度,N_api是API調(diào)用的數(shù)量
4) ForSiin S do #計算Si節(jié)點的下一個節(jié)點以及概率,構(gòu)造轉(zhuǎn)移概率矩陣
5) IfSinot in S_temp do
6) S_temp.append(Si)
7) S_temp[Si]=Cal_nextAPIandProbability(Si)
8) P=Cal_allpath(S_temp) #利用深度優(yōu)先算法求出所有的從S1到Sn的路徑
9) MinPathLen=Cal_minPathlen(P) #計算路徑的最小長度
10) MaxPathLen=Cal_maxPathLen(P)#計算路徑的最大長度
11) For I =MinPathLen; i 12) Ti=Cal_lenPath(P,i)#計算路徑長度為i的長度數(shù)量 13) λi=log(Ti)/i 14) λmax=Max(λi)#計算樣本的最大熵值 15) For Piin P do 16) εi=abs(1/(len(Pi)*log(Pr(Pi)))-λmax)#計算每條路徑對應(yīng)的最小語義相關(guān)系數(shù) 17) Return ε, P 18) Function Cal_allpath(S_temp) #計算所有從S1到Sn的路徑 19) S_path= [Si] 20) For Siin S_temp[S1].keys() 21) DFS(Si) 22) Function DFS(Si) #深度優(yōu)先算法,結(jié)束條件是達到Sn,最后一個API調(diào)用節(jié)點 23) S_path.append(Si) 24) If(Si==Sn) 25) P.append(S_path) 26) Break 27) Else 28) DFS(Si+1) 29) S_path.pop() 算法的輸入為在動態(tài)分析環(huán)境中提取的API序列,輸出為所有的路徑P以及對應(yīng)的語義相關(guān)系數(shù)ε.給定特定的ε,即可得到在ε條件下所有滿足條件的語義相關(guān)路徑. 算法1中,第2)~7)行是獲取所有的API調(diào)用以及其下一個節(jié)點,構(gòu)建轉(zhuǎn)移概率矩陣;第8)行為針對得到的轉(zhuǎn)移概率矩陣采用深度優(yōu)先算法進行搜索出所有的從S1到Sn的路徑,以節(jié)點Sn作為終止條件;第9)~10)行則是通過計算所有路徑的長度,求出最小路徑長度和最長路徑長度;第11)~13)行是計算路徑長度從最小到最大的各個路徑長度的路徑數(shù)量,以及對應(yīng)的熵;第14)行則是計算出路徑的最大熵用于下面相關(guān)系數(shù)的計算;第15)~16)行則是通過式(5)計算每一條路徑的語義相關(guān)系數(shù);第18)~29)行則是采用深度優(yōu)先算法計算出從S1到Sn的所有路徑的具體過程.算法的返回值為所有的路徑和相應(yīng)的相關(guān)系數(shù). 下面通過一個API依賴圖來進行解釋.如圖3所示,圖中有6個結(jié)點,1號是開始結(jié)點,6是結(jié)束結(jié)點.每個API節(jié)點上面的分數(shù)代表該API被調(diào)用的概率,如節(jié)點1的調(diào)用概率為2/29,2代表被調(diào)用了兩次,29代表所有API被調(diào)用的次數(shù)之和.根據(jù)API依賴圖可以得到表2的TPM轉(zhuǎn)移矩陣.然后根據(jù)所有的路徑首先確定最大熵值λ,然后根據(jù)式(5)得到每條路徑相應(yīng)的ε值,由表3可以看出ε在1.647到2.929之間變化,選擇不同的ε值會得到不同數(shù)量的相關(guān)路徑,選擇ε=2.1會有P1,P2,P5三條路徑,選擇ε=2.0會有P1,P2兩條路徑,通過這些不同的路徑,訓練不同的檢測模型來比較檢測精度.選擇檢測精度最高時對應(yīng)的ε值應(yīng)用于實際的檢測工作. 圖3 API依賴圖示例 表2 TPM矩陣 表3 路徑概率和相關(guān)系數(shù) ε 構(gòu)建特征空間,本文采用“直方圖分組bin”技術(shù),這主要應(yīng)用于信息檢索,圖像處理和文本處理領(lǐng)域.因為它包含近似匹配,所以降低了對調(diào)用序列輕微變化的敏感性.然后使用ALBF(平均對數(shù)分支因子)來構(gòu)建樣本的特征空間.平均對數(shù)分支因子定義如式(6). (6) 其中, B(S1,S2,S3,...,Sn)=∏1<=i<=nb(Si) (7) 其中,b(Si)代表結(jié)點Si的分支因子,我們定義每個bin代表一個ALBF的范圍,這些bin以均勻的間隔分割,其中包含著各個相關(guān)路徑的頻率次數(shù),也即是特征.比如如果特征空間有4個bin構(gòu)成,b1,b2,b3,b4.對于某個程序來說各自的頻率次數(shù)為f1,f2,f3,f4,那么得到的特征向量就是 對于得到的特征,采用機器學習的方法來分類.并不是所有的特征對最后的分類效果都是有用的,為了去除無關(guān)的特征,降低維度,減少時間代價,本文選擇采用信息增益來進行特征選擇,去除一些對分類無用的特征.最后使用基于集合的學習算法-隨機森林來區(qū)分惡意樣本和良性樣本.隨機森林在惡意代碼分類中應(yīng)用廣泛[4-5,13-15].在眾多研究者的對比中,應(yīng)用在惡意代碼分類時,在準確性和有效性方面都優(yōu)于支持向量機(SVM),邏輯回歸(LR),K近鄰(KNN)等算法,即使在噪聲存在的情況下也能提供很好的信息泛化,并且當數(shù)據(jù)較大時也能得到相當好的效果.因此,本文采用隨機森林的方法來實現(xiàn)分類.在給定的樣本空間之中,采用3折交叉驗證來分類預測.將數(shù)據(jù)集分成3份,輪流把兩份做訓練,一份做驗證. 實驗中選用了1 110個惡意代碼樣本和667個正常樣本,惡意樣本來源于是VirusShare[16]網(wǎng)站,對惡意樣本的標注則是基于VirusTotal[17]網(wǎng)站的眾多掃描引擎給出的結(jié)果.正常樣本則來源于Windows操作系統(tǒng)中正常的應(yīng)用程序.實驗環(huán)境則是基于改造的Cuckoo環(huán)境,通過更改虛擬機為物理機器,并對現(xiàn)有的一些易被檢測到的Cuckoo沙箱的特征進行了隱藏,在一定程度上避免樣本的檢測,獲得較為完整的行為. 本文根據(jù)流行評估指標真陽性率TPR,假陽性率FPR,真陰性率TNR,假陰性率FNR和精確度Precision來評估這篇文章所提出的方法的有效性,如表4所示. 表4 評估指標 實驗結(jié)果如表5所示. 表5 實驗結(jié)果 從表5可知,當ε∈{1.5,2.0,2.5,3.0}的時候產(chǎn)生較高的檢測精度.可以從表統(tǒng)計中很容易判斷出構(gòu)建的特征空間能夠有效的區(qū)分出惡意樣本和正常樣本.而且可以看到檢測模型在ε=2.0的時候達到最高的97.1%的檢測精度.因此可以選擇ε=2.0作為閾值來進行實際的檢測工作.實驗中應(yīng)用ε的各種值來進行實驗驗證假設(shè),即較小的ε值排除了一些信息比較豐富的路徑,而較大的ε值又導致信息泛化從而導致檢測精確率的降低. 雖然應(yīng)用了真機分析系統(tǒng),反虛擬機的手段不再奏效,但是由于本文使用的Cuckoo沙箱,由于一些反沙箱技術(shù)的流行,一些惡意樣本在運行期間,這些樣本很快終止,并沒有表現(xiàn)實際的惡意行為,所以僅產(chǎn)生部分日志,引起了錯誤分類從而導致了FNR的增加.另外也有一些正常的應(yīng)用程序與惡意代碼呈現(xiàn)高度的相似性,比如調(diào)用與內(nèi)存訪問,進程和線程處理活動等相關(guān)的系統(tǒng)調(diào)用,這也會導致FPR的增加. 為了表示所提出的方法的有效性,本文與文獻[18]提出的基于圖匹配的分類算法,文獻[19]提出的基于序列挖掘的方法,和文獻[20]中提出的基于組合學習的檢測方法進行了對比,實驗結(jié)果表6所示,本文所提出的基于語義API依賴圖的方法檢測精度上要明顯優(yōu)于其他方法. 表6 與其他算法的對比結(jié)果 本文設(shè)計了一種基于程序語義API依賴圖的動態(tài)行為檢測方法,采用真機作為分析環(huán)境,以Cuckoo的修改版作為分析框架,獲得較為完整的系統(tǒng)信息流-API調(diào)用序列.本文采用程序語義來定義程序的行為,基于API序列構(gòu)造API依賴圖,然后基于信息論AEP概念,提取API依賴圖中語義信息豐富的相關(guān)路徑來表征程序行為,然后基于相關(guān)路徑的平均對數(shù)分支因子來構(gòu)建特征空間,最后采用機器學習算法-隨機森林進行訓練然后進行分類.實驗結(jié)果表明這篇文章提出的方法能夠有效進行惡意代碼檢測,達到了97.1%的檢測精度. 本文提出的惡意代碼檢測方法從分析框架方面來看,整體框架是基于Cuckoo框架改造而來,而Cuckoo是從應(yīng)用層進行監(jiān)控API函數(shù)的調(diào)用,很多較為底層的函數(shù)就無法監(jiān)控到,從而得到的信息并不全面,從而影響到分析效果. 下一階段的工作要著重于搭建一個內(nèi)核態(tài)監(jiān)控的分析框架;另一方面,本文并沒有考慮到PE文件的多路徑執(zhí)行問題,因此,不能有效監(jiān)測滿足一定觸發(fā)條件才進行惡意行為的惡意代碼.2.4 構(gòu)建特征空間
2.5 分類模型訓練與檢測
3 實驗結(jié)果和分析
3.1 實驗環(huán)境與數(shù)據(jù)
3.2 實驗評估指標
3.3 實驗結(jié)果
4 結(jié) 論