魯倩,吳向前
(1.新疆大學信息科學與工程學院,烏魯木齊 830046;2.新疆大學網(wǎng)絡中心,烏魯木齊 830046)
為了降低Android惡意軟件的攻擊危害,目前已經(jīng)提出了各種研究方法。惡意軟件檢測方法可分為兩類:基于靜態(tài)分析的檢測和基于動態(tài)分析的檢測。基于靜態(tài)分析的方法可以在不執(zhí)行應用程序的情況下提取應用的語法功能,而基于動態(tài)分析的方法使用可以在受控環(huán)境中執(zhí)行應用程序,并監(jiān)控的語義功能。靜態(tài)分析的優(yōu)點是不需要設置執(zhí)行環(huán)境,且計算開銷相對較低。動態(tài)分析的優(yōu)點是可以處理惡意應用程序,這些應用程序使用一些混淆技術,如代碼加密或打包。
本文主要討論基于靜態(tài)分析的方法,靜態(tài)分析的關鍵點在于對應用程序的特征提取,許多研究者已經(jīng)提出并測試了許多針對惡意軟件檢測的特征庫,但這些特征多基于操作碼、權限以及API調(diào)用等,而針對界面文件以及代碼方法的特征研究還比較少,而本文則基于文件熵、界面布局文件與代碼方法進行特征提取,并結合機器學習算法進行研究。
本文的貢獻在于:首次提出文件熵、界面布局、代碼方法這些非常規(guī)作為區(qū)分Android惡意軟件的特征,并結合傳統(tǒng)的權限特征,利用Random Forest算法做分類對比實驗。實驗證明采用非常規(guī)特征和傳統(tǒng)特征結合比只采用非常規(guī)特征或傳統(tǒng)特征的效果要好。
(1)文件熵
上文已經(jīng)提到了在APK文件里的assets文件夾下的存放的文件惡意行為可能通過更為高級的方法進行偽裝或隱藏。在信息安全行業(yè)中,檢測隱藏在可移植可執(zhí)行文件下的加密或壓縮文件的常見做法是熵分析。一般來說,壓縮或加密的代碼段的熵往往高于本地代碼[1]。根據(jù)此屬性,將PC端的思想引入Android惡意代碼檢測,有助于進一步搜索APK中的可疑內(nèi)容,基于此提出文件熵。
在信息論中,熵(更具體地說,香農(nóng)熵)是包含在一條消息中的信息的期望值。一般來說,序列的熵會受到不確定性或統(tǒng)計變量的大小的影響。如果所有值的出現(xiàn)都是相同的,那么熵將是最大的。相反,如果某個字節(jié)值出現(xiàn)的概率很高,那么熵值就會更小[1]。由于對任意長度的信息輸入,MD5都將產(chǎn)生一個長度為128bit的輸出[2]。為了便于計算大小不一的APK文件的文件熵,我們引入消息摘要算法(MD5)。由此,我們定義文件熵為對APK計算所得的消息摘要進行熵值計算所得的值。公式為:

其中H(X)是對離散變量X在值為x1,...,xj的熵,j是X可能的取數(shù)值,pi代表隨機事件X取值為xi的概率。
(2)界面布局特征
對界面布局的分析,類似于人們對朋友和陌生人的區(qū)別一樣。界面布局屬性提取自布局和定義應用程序的圖形用戶界面結構的XML文件。這些XML文件中包含層次化布局控件如LinearLayouts,Button以及View等。我們在這里把特征定義為APK中所有XML文件包含各種控件的總和以及每種控件的平均數(shù)量。
(3)方法/指令數(shù)量
提取方法/指令數(shù)量特征可以幫助識別那些有相同代碼結構的已知App。基于此,我們對每個APK文件提取以下特征值:代碼中的方法總數(shù),每個方法包含的平均操作碼數(shù)量,以及每個方法操作碼數(shù)量的標準差和方差。當一個方法包含小于3個操作碼的時候我們將其剔除掉。
隨機森林算法是一種集成式機器學習算法,其核心思想是:通過Bootstrap方式抽取數(shù)據(jù)獨立訓練多個基礎決策樹,每棵決策樹都是一個分類器(假設現(xiàn)在針對的是分類問題),那么對于一個輸入樣本,N棵樹會有N個分類結果。而隨機森林集成了所有的分類投票結果,將投票次數(shù)最多的類別指定為最終的輸出。研究表明隨機森林算法在惡意代碼檢測分類中有較好的效果[3]。
決策樹分裂或特征選擇的依據(jù)是:基尼系數(shù)和信息增益。基尼系數(shù)用來度量數(shù)據(jù)的不純度,假設有數(shù)據(jù)集D,則計算公式為:

其中c表示數(shù)據(jù)集類別數(shù)量,pi表示類別i樣本數(shù)量占所有樣本的比例,數(shù)據(jù)混合程度越高,基尼指數(shù)也越高。
信息熵表示了信息的混亂程度,熵值越大信息的不確定性就越大。節(jié)點的信息熵計算公式如下:

若對數(shù)據(jù)集D進行特征子集劃分,劃分成k個Dj子集,其子集的期望信息計算如下:

子集的信息增益則為:

選擇具有最大信息增益的特征進行分裂。
在對樣本分類時使用WEKA[4],整個實驗在Androguard框架下運行[5]。測試環(huán)境為Intel i7 4810MQ,8GB內(nèi)存并運行64位Ubuntu 16.04的操作系統(tǒng)。Androguard為開源框架且具備對字節(jié)碼、AndroidManifest文件以及APK中其他XML文件的處理能力。WEKA中包含了高性能的Android惡意軟件檢測算法,如Random Forest、Bayesian Network、K-Nearest Neighbors等。
在樣本集方面我們的樣本集來自Malware Genome Project[6]、VirusTotal Malware Intelligence Service[7]和Google Play[8],總計5000個樣本,其中包括2500個正常App和2500個惡意App。我們根據(jù)8:2的比例進行訓練集和測試集的分配。為了更客觀的反應測試結果,測試集中的App不包含任何來自或相似于訓練集的App。
首先對收集的樣本集進行數(shù)據(jù)預處理,通過Androguard工具,通過analysis.py庫提供APK.get_permissions()、get_file()、get_activities()等方法結合 Python,寫批量提取文件MD5值并直接計算文件熵、計算布局文件<xml>數(shù)量、計算方法指令數(shù)量等提取APK文件各特征的代碼,運行得到特征數(shù)據(jù)集。根據(jù)得到的特征數(shù)據(jù)集以8:2的比例劃分訓練集和測試集,先將各特征的訓練集導入WEKA中進行分類器的訓練,然后再用測試集進行測試。如此反復進行,從單一特征到組合特征逐一實驗。實驗的流程圖如圖1。

圖1 實驗流程圖
下面我們對測試結果的參考標準作如下說明,True Positive(真正,TP)被模型預測為正的正樣本;True Negative(真負,TN)被模型預測為負的負樣本;False Positive(假正,F(xiàn)P)被模型預測為正的負樣本;False Negative(假負,F(xiàn)N)被模型預測為負的正樣本,如表1混淆矩陣所示。True Positive Rate(真正率,TPR)和True Negative Rate(真負率,TNR)分別表示惡意App樣本和正常App樣本的正確識別率。相對的False Positive Rate(假正率,F(xiàn)PR)和 False Negative Rate(假負率,F(xiàn)NR)分別表示正常App被預測為惡意App和惡意App被預測為正常App。TPR有時也叫召回率,表示被正確檢測出的惡意軟件數(shù)量與被標記為惡意軟件的總數(shù)量的比值,與其相對的是特異度,即被檢測為正常的正常App數(shù)量除以被標記為正常App的數(shù)量總和。正確率被定義為真正和真負的總和除以樣本集的總數(shù),如公式(6-9)所示。此外,我們還會對訓練模型用時和測試用時分別進行了統(tǒng)計,結果在表2、表3中顯示。

表1 混淆矩陣

在此小節(jié)中,我們會對第一節(jié)中列出的每一個單一屬性集進行測試,測試結果如表2所示。對實驗數(shù)據(jù)進行點線圖分析,從圖2中可以看出,Android權限信息是在使用單一特征的條件下性能表現(xiàn)最好的,能夠達到96%的正確率。此外,操作碼特征和App組件特征在使用單一條件的情況下也能夠達到90%的正確率,本文提出的文件熵、界面布局文件以及方法/指令數(shù)量特征在單一條件情況下正確率也略高于Intent特征和統(tǒng)計學特征。而權限、操作碼、App組件特征雖然正確率高,但本文提出的三個非常規(guī)特征的訓練時間要優(yōu)于其許多,尤其是App組件特征的訓練時間,訓練時間幾乎是非常規(guī)特征的100倍。對于以上以及其他大部分特征都是在Random Forest算法的條件下表現(xiàn)出了最佳的性能。相比較而言,Intent特征和統(tǒng)計學特征在單特征條件下的檢測正確率相對較低。

表2 單特征測試結果

圖2 單一特征測試結果
表中 C1-權限,C2-操作碼,C3-App組件,C4-統(tǒng)計學特征,C5-Intents,U1-文件熵,U2-界面布局文件,U3-方法/指令數(shù)量。
常規(guī)特征的訓練時間要優(yōu)于其許多,尤其是App組件特征的訓練時間,訓練時間幾乎是非常規(guī)特征的100倍。對于以上以及其他大部分特征都是在Random Forest算法的條件下表現(xiàn)出了最佳的性能。相比較而言,Intent特征和統(tǒng)計學特征在單特征條件下的檢測正確率相對較低。
本小節(jié)為測試評估的第二部分,基于單特征值屬性的測試結果下,我們嘗試對不同特征進行組合之后進行測試,測試結果在表3中進行了匯總,在圖3中進行了直觀展示。其中表現(xiàn)最佳的組合正確率超過97%,這些特征均提取自AndroidManifest文件,包括權限信息和Intents,以及本文提出的文件熵特征。在實驗中我們有以下發(fā)現(xiàn):
(1)在使用權限信息為基礎的單一檢測策略上結合文件熵,方法指令特征或者布局特征作為輔助時能夠提升檢測正確率。
(2)當結合Intents特征進行檢測時,會成倍增加訓練消耗的時間。這與對Intents進行單一特征測試時表現(xiàn)一致,究其原因在于Intents文件是用于組件之間的意圖通信,并不直接表現(xiàn)為行為,因而在判別到具體行為時,是需要根據(jù)其文件進行分析之后才能判定,故而耗時。
(3)權限信息與非常規(guī)特征的組合正確率與最佳組合相差不大,但訓練耗時卻并未顯著增加,說明非常規(guī)特征在分辨惡意軟件方面具有一定的辨識度。

表3 組合特征測試結果

圖3 組合特征測試結果
表中 C1-權限,C2-操作碼,C3-App 組件,C4-統(tǒng)計學特征,C5-Intents,U1-文件熵,U2-界面布局文件,U3-方法/指令數(shù)量。
根據(jù)以上實驗結果數(shù)據(jù),我們根據(jù)從正確率、誤報率和訓練耗時三個方面對結果進行分析。從圖4、圖5、圖6可以看出,無論是單特征測試還是組合特征測試,從AndroidManifest文件中提取的權限特征相比從實際代碼中提取的方法指令特征而言擁有更佳的性能表現(xiàn)。究其原因應該是Android權限的性質(zhì)很大程度上能夠準確說明一個App可能執(zhí)行的行為是否存在安全問題或潛在的安全隱患。更重要的是,在不使用靜態(tài)分析或動態(tài)分析的情況下,AndroidManifest文件特征能夠為惡意軟件檢測提供一個簡單有效的方法。
本文提出的非常規(guī)特征在單一特征檢測時整體正確率略低于AndroidManifest文件中提取的特征,但高于統(tǒng)計特征和Intents特征。雖然表現(xiàn)平庸,但其在訓練時耗上無論是單一測試還是組合測試都表現(xiàn)良好。在和權限特征組合之后,則優(yōu)勢發(fā)揮的更加明顯,無論是正確率、誤報率還是訓練時耗都表現(xiàn)很好,依然在時耗方面的表現(xiàn)最出色。究其原因,一方面是因為文件熵特征摘取的信息過程中壓縮了信息量,減少了模型訓練的訓練負荷,另一方面是界面布局文件種類有限,比AndroidManifest文件易于訓練。理論上,惡意行為都較隱蔽,其方法指令也相對復雜,而方法指令特征的提取由于排除了指令數(shù)小于3的方法,也更加便于模型識別惡意行為。

圖4 單一/組合特征正確率對比

圖5 單一/組合特征誤報率對比

圖6 單一/組合特征訓練耗時對比
在本文中,我們對基于機器學習的Android惡意檢測方法中5個已知特征和3個新特征分別在單特征和組合特征條件下的性能表現(xiàn)做了測試。結果證明,在單特征模式下基于權限信息的檢測正確率最高達到了96%左右,但存在較高的誤判率;而在組合模式下,基于權限、Intents、文件熵構成的組合性能最佳能夠達到97%左右的正確率和惡意App識別率的同時保證較低的誤判率,因此可以被用來單獨實現(xiàn)一個完整的靜態(tài)檢測方案,或者將其嵌入已有的動態(tài)Android惡意軟件檢測工具從而使其達到更高的檢測正確率。而權限與本文提出的非常規(guī)特征的組合雖然在正確率上略低于最佳組合,但在訓練時耗上遠低于最佳組合,這在實際檢測中是個非常重要的指標。但無論在單模式還是組合模式,最佳正確率都是在Random Forest聚合算法下實現(xiàn)的。未來我們會增加測試樣本并對Androguard框架進行改進,增加非常規(guī)特征在其他分類算法中的檢測,進一步驗證其有效性。