余東豪 李 濤
(武漢科技大學計算機科學與技術學院湖北省智能信息處理與工業實時系統重點實驗室 湖北 武漢 430065)
隨著移動智能終端的高速發展與迅速普及,人們越來越習慣在手機、智能手環及PDA等設備上進行網上沖浪、業務處理和信息存儲。根據CNNIC第44次《中國互聯網絡發展狀況統計報告》[1],截至2019年6月,我國上網人數達到8.54億,而使用手機上網的比例達到99.1%,人均手機App數量在33個以上。與此同時,互聯網惡意程序數量仍大幅度增長,其中出現在安卓平臺上的惡意程序占比達到99.6%以上,安卓惡意軟件檢測成為了研究熱點。
Android應用的惡意性檢測是個不確定性問題。針對惡意軟件的研究主要有靜態、動態以及動靜融合等三種檢測方法。但是隨著機器學習和數據挖掘技術的興起,越來越多的研究人員選擇將之前的動靜態檢測方法與機器學習技術結合起來。
目前,應用于Android應用惡意檢測的檢測器主要是由支持向量機(SVM)、隨機森林(RF,Random Forest)、K-means等機器學習方法訓練而成。文獻[2]提出權限頻繁模式樹算法挖掘出關聯權限的惡意性及關聯權限相互間的作用對檢測軟件惡意性的影響,提高了對安卓惡意軟件檢測的準確率。文獻[3]在構建森林過程中對每個節點分裂時選取的特征子集進行優化從而達到較高的檢測精確度。文獻[4]使用概率統計和特征抽取的策略對檢測特征進行降維處理,在縮短SVM模型訓練時間的同時還提高了準確率。文獻[5]構建了自動化API調用數據收集工具,使用SVM和最大相關最小冗余的方法,分析判斷出軟件性質。文獻[6]在Android平臺上實現了一個具體行為檢測系統,檢測Android系統的各種特征和事件,利用決策樹和回歸分析等方法對軟件進行分類。可是由于手機系統資源和電池的局限性,該方案實施起來較為復雜。文獻[7]采用多級集成的檢測模型,選取Dalvik指令、權限信息等作為屬性特征,使用J48決策樹三層集成分類器,分類過程較為復雜,不適合檢測大規模數據。文獻[8]選取權限和意圖信息為特征,利用加權投票機制實現了一種改進隨機森林分類模型,具有較高的檢測精度,但檢測效率較低。文獻[9]通過將應用程序的權限使用情況進行量化后使用K-means算法聚類分析,然后將良性應用與惡意應用分類。文獻[10]提出了基于深度置信網絡的DeepDroid安卓惡意軟件檢測算法,具有較好的檢測效果,但是數據集較小,可能有過擬合的情況。這些研究針對Android應用檢測問題提出了各種不同的檢測方法,為Android檢測做出了貢獻,但是也存在一些不足:由于Android應用的多樣性,對隱私權限的使用是個典型的不確定性問題,很難去區分正常權限與隱私權限之間的關系。用同一個檢測器實現所有種類應用的檢測仍然存在著一定的不足。
不同類型的應用對權限的需求不同,不應只針對權限本身或者某一應用個體,而是應該根據App的實際功能來判斷應用的用途。舉個例子,很多社交類應用為了保證應用的正常運行,都會申請讀取通信錄權限。這是因為用戶大多通過手機號碼來注冊賬號,應用可以通過用戶的通信錄為用戶進行好友關聯。但是對于手電筒、閱讀器等工具類應用,讀取通信錄權限就越界了,違反了“最小特權”原則。針對以上方法的局限性,提出了一種基于模型庫的Android惡意軟件檢測方法。首先對應用軟件信息進行權限提取與種群劃分,得到不同種群的數據。接著將多種算法使用不同種群的數據進行訓練,得到不同屬性的識別器,根據數據類型合并為識別器池,所有識別器池融合為模型庫。最后對應用進行檢測,并根據檢測結果對模型庫進行更新與演化。
本文通過實驗對2 225個應用進行了檢測。實驗結果表明,本文提出的方法是有效可行的,優于其他Android惡意應用檢測系統。
本文的主要創新點與貢獻如下:
1)實現了自動化的檢測工具AMLD(Android Model Library Detection),在同一時間可以自動地檢測大量的應用程序。
2)提出模型庫概念,解決了單一算法對不同種群應用的識別效果差的問題。對應用程序檢測時,依據應用程序的類別,在模型庫中找到對應的種群識別器,使識別效果都能達到最優。
3)可以通過增加約束條件,篩選出最符合條件的識別器,使識別效果變成用戶期望的結果。
4)對模型庫進行維護更新。采用克隆選擇算法對模型庫中的模型進行淘汰更新,使模型的識別能力不斷增強,對未知應用也能有較好識別效果。
本文提出了一種基于模型庫的Android惡意軟件檢測方法,可以自動地檢測未知惡意應用。整個研究框架主要由數據獲取、權限提取、軟件分類以及模型庫模塊四部分組成,如圖1所示。

圖1 模型架構
(1)獲取數據。通過編寫腳本從360應用市場與安智應用市場批量下載應用程序,并使用殺毒軟件進行掃描,確保樣本的正確性。被檢測為惡意軟件的標記為負樣本,其余的為正樣本。為了平衡正負樣本,從VirusShare[11]獲取惡意軟件作為負樣本,使數據集正負達到平衡。
(2)權限提取。下載的APK文件是一種壓縮文件,并不能直接用于檢測軟件性質,需要進一步從其中提取出信息。通過腳本,自動化地反編譯文件并進行解析,構造出權限矩陣。
(3)軟件分類。將提取的權限矩陣劃分為兩部分:訓練集與測試集。訓練集作為SMO分類器的輸入,使分類器通過不斷學習能夠通過權限將應用分類。測試集則對分類器進行測試,驗證分類器的分類效果并對應用進行類別標注,得到特征數據集。
(4)模型庫模塊,包括模型庫的建立、檢測與維護。Android種群惡意軟件檢測模型庫封裝了多個種群的識別器池。每個識別器池均由多種算法經過訓練生成的識別器構成,并且每個識別器具有統一的輸入輸出格式。通過將種群信息輸入,在模型庫中找到該種群對應的識別器池,根據約束條件,用最符合約束條件的識別器對應用進行檢測,判斷應用的惡意性。并將每次的識別結果進行記錄更新,通過演化規則對模型庫進行維護,保證識別效果越來越好。
從APK文件中提取權限信息分為三個步驟:反編譯、文件解析和構造權限矩陣。
(1)反編譯。用Python代碼獲取應用文件,結合APKTool命令,完成應用的反編譯,得到APK文件中所有文件。
(2)文件解析。Android的權限信息都存儲在AndroidManifest.xml文件中,因此編寫Python程序提取“uses-permission”標簽來獲得應用程序權限信息。
(3)構造應用權限信息矩陣。列出所有安卓權限作為表頭,將所有值賦值為0,把提取的權限信息進行對比并保存。若權限存在將對應值賦值為1。
定義1應用權限信息
Permissions={Pi|Pi∈Android}
根據查閱的資料顯示,現在Android系統中有144種權限。因此,應用權限信息為一個1×144的一維矩陣。若對應權限存在,則Pi為1,否則為0。
同一類型的應用具有相同的功能特征,而相同的功能往往會申請相同的權限,因此,可按照應用的權限特征將應用劃分為不同種群。
定義2類別標簽
Class={C1,C2,…,Cx}
Cx是每個種群的類別標簽,比如手電筒、閱讀器等。
定義3種群
Population={Cx,PermissionMatrix}
PermissionMatrix為所有Cx類應用的權限信息組成的n×144的矩陣。
定義4權限矩陣
PermissionMatrix=
{Pij|i=1,2,…,m;j=1,2,…,n}
機器學習算法模型分為兩部分:訓練與測試。對算法模型的訓練就是通過大量數據使模型不斷積累經驗,使模型再接收到相似數據之后能快速給出結果。測試就是來驗證該模型給出的結果是否正確。應用程序分類模塊如圖2所示。將處理的種群數據分為訓練集與測試集。訓練集用于訓練SMO分類器,之后測試集進行驗證。

圖2 應用程序分類模塊
是否能準確地識別出應用屬于哪個種群是影響后續檢測結果的關鍵。
經過統計分析,一般應用程序最多申請20多種權限[14],并不會同時使用144種權限。因此,根據本文對權限矩陣的定義可以知道,權限矩陣是個稀疏矩陣,而SMO對稀疏矩陣有著很好的分類效果[15]。因此本文使用SMO對應用進行處理,將應用數據集識別成不同種群。
假設有N個訓練數據(Ci,PermissionMatrixi),其中Ci為應用程序的分類標簽,PermissionMatrixi為Ci類應用程序的權限矩陣。SMO對這N個數據兩兩比較。按照權限矩陣和分類標簽學習之后得到權限與類別的函數關系式。使用Weka工具中的SMO進行實驗,建立分類模型,利用模型檢測測試集中應用的類別,得到測試結果。
至此,得到了按種群劃分的特征數據集DataSet。并將DataSet按8∶1∶1劃分為TrainSet、TestSet1與TestSet2用于后續實驗。其中TrainSet用于訓練算法,TestSet1用于檢測識別器的效果,TestSet2用于驗證本文方法。
模型庫由算法集中算法生成的識別器組成的識別器池構成。
定義5算法集
Algorithm={SVM,RF,FC}
其中,SVM算法運行效果穩定,而隨機森林算法具有運行速度快的優點,全連接則是對任意情況都可以很好的分類。因此,選擇SVM、RF、FC三種算法作為算法集進行模型庫的建立。
使用TrainSet對算法集中的算法進行訓練,并用TestSet1對得到的識別器進行效果檢測。
定義6識別器
Classifier={Classifier(Pi,Ai)|
Pi∈Population,Ai∈Algorithm}
Classifier(Pi,Ai)為機器學習算法Ai用Pi種群的數據訓練后生成的識別器,如手電筒SVM識別器、閱讀器隨機森林識別器等。
定義7識別器池
ClassifierPopulation=
{Classifier(P,Ai)|Ai∈Algorithm}
ClassifierPopulation為算法集中所有算法用種群P的數據訓練后生成的所有識別器。
種群作為本文實驗的基礎,是最為必要的一環。將APK文件轉換為種群數據,成為模型庫檢測的統一輸入格式。種群信息如表1所示。

表1 種群
Class字段對應應用的類別。下面的字段為安卓系統144個權限,應用有相應權限則對應的值為1,否則為0。
模型庫由多個模型組成,而模型的運算單元是各類種群識別器池,識別器池中包含手電筒識別器、照相機識別器、閱讀器識別器和其他識別器,每種識別器又分為3大類型,例如SVM手電筒識別器、隨機森林手電筒識別器和神經網絡全連接手電筒識別器。下面以手電筒種群為例,進行模型運算介紹。
模型運算中的數據為數據集TestSet2_Flash。TestSet2_Flash為從TestSet2中分出的手電筒類應用,其值域為{Malicious,Benign}。
輸入:數據集D。
輸出:檢測結果R。
(1)根據數據集D中應用的種群類型,在模型庫中找到對應類型的種群識別器池,在本例中即為手電筒識別器ClassifierPopulation。
(2)根據約束條件,在手電筒識別器中找到最符合條件的識別器Classifier。
(3)將D中應用的種群信息作為輸入,提供給Classifier進行分類,輸出結果R。
識別器池中的識別器都是由識別器生成池生成,同一種算法用不同數據集也會生成不同識別器,而演化機制就在于對生成池的維護。最初的識別器生成時直接根據數據訓練而成,經過測試集篩選,識別率達到85%以上的識別器進入識別器池,按照種群合并為種群識別器池,并記錄在種群-識別器池對應表中,方便之后惡意軟件檢測使用。在之后的使用過程中,生成池會根據上一次的檢測結果進行演化,從而使系統具備自適應性。識別效果好,則用上一次的數據集生成對應算法識別器;識別效果不好,則降低該識別器的權重,當識別器的權重低于一定值后,從識別器池中剔除。
演化規則的選取上,本文使用克隆選擇算法,其思想是淘汰與抗原結合能力差的抗體,對優質抗體變異,增加抗體的多樣性。本文演化規則是淘汰識別率差的識別器,對識別率高的識別器進行變異。
演化規則的實現步驟如下:
輸入:檢測內容及檢測結果。
輸出:新的種群識別器池。
(1)根據檢測內容,將涉及種群的種群識別器ClassifierPopulation,按照種群-識別器記錄中的識別率由高到低排序。選取每個種群中的所有識別器作為抗體樣本Pn。
(2)對Pn進行克隆操作,識別率越高,克隆的個數越多。生成臨時抗體集C。
(3)對C進行變異操作,其中識別率越高,變異率越小。生成抗體集C*。
(4)重新用上一次的數據集測試C*,取其中識別率最高的子集,并保存在記錄中;并用C*中其他改進型個體替換ClassifierPopulation中一些識別率低的個體。
(5)隨機產生d個新識別器,替換ClassifierPopulation中識別率最低的識別器,增加識別器池的多樣性。
其中提到的克隆操作與變異操作定義如下:
定義8克隆操作是指使用與克隆對象相同的訓練集、相同的算法、相同的參數生成的完全一樣的識別器的行為。
定義9變異操作是指通過修改算法的參數和訓練集而生成與原本不同的識別器的行為,變異率越高,參數與訓練集變化越大。
通過模型演化,使整個模型的識別能力不斷增強,且由于高識別率的識別器被保留,對相應種群的識別可以快速響應并且得到優異的結果。在增加變異操作后,使得模型庫中的識別器可以在局部范圍內發生變化時提高識別能力。
實驗運行環境為:Windows 7操作系統,3.4 GHz 四核心處理器,8 GB內存。
360應用市場與安智市場共有98類應用,本文利用數據捕獲工具從中爬取了283 328個應用,并提取出權限矩陣。使用騰訊安全管家對所有應用進行掃描,被檢測為惡意軟件的標記為負樣本,其余為正樣本。為了平衡正負樣本,從VirusShare獲取惡意軟件作為負樣本,使數據集正負達到平衡。
本文選擇照相機、手電筒和閱讀器三個種群作為實驗對象,原因為:1)三個種群的應用功能邊界清晰,易于將應用分類標記;2)三個種群的應用是工具類應用,被廣泛使用,若是存在惡意應用,影響巨大。
實驗使用照相機、手電筒和閱讀器三類應用,共2 225個,這些應用組合成訓練集,其中有855個照相機應用、502個手電筒應用和868個閱讀器應用。通過權限提取模塊得到應用的權限信息。使用Weka的SMO分類器進行十折交叉驗證的結果如表2所示。

表2 不同類別軟件分類結果(%)
可以看出,SMO分類器的準確率與AUC值都比較高,證明SMO分類器能夠用于軟件類別的劃分。
至此,照相機、手電筒和閱讀器三個種群通過權限提取模塊和分類模塊分別得到三個種群的訓練集合trainset與測試集合testset2。
為了證明實驗的真實性與準確性,選擇算法的評價標準即準確率與運行時間作為約束條件,但由于隨機森林算法具有高效性,本實驗設準確率比運行時間更重要。準確率越高表示算法對該種群的應用識別率越高;而運行時間越短意味著算法對該種群的識別效率越快。
(1)使用trainset中的三種數據集對SVM、RF、FC三種算法進行訓練,使用testset2中相應種群的數據集對生成的識別器與模型庫進行測試。
(2)使用testset2中相應種群的數據集對演化后的模型庫進行測試。
(3)將trainset、testset2去掉種群標簽得到權限矩陣rawtrain與rawtest 作為MIXTURE的訓練集和測試集,使用rawtrain訓練三種算法,使用rawtest對生成的識別器與模型庫進行測試。
(4)使用rawtest對演化后的模型庫進行測試。
(5)重復進行以上步驟,對結果求平均值。
實驗采用十折交叉法對實驗進行有效性驗證,最終結果匯總在表3。

表3 惡意識別結果

續表3
可以看出,對于照相機種群,隨機森林算法在運行時間與準確率上都比另外兩種算法表現優秀;對于手電筒和閱讀器種群來說,雖然隨機森林算法在運行時間上表現優秀,但是準確率卻不如支持向量機和神經網絡全連接;三種算法在CEMARE、FLASH、READER三個數據集上效果比在數據集MIXTURE上好;本文提出的模型庫方法在照相機、手電筒、閱讀器和混合數據集上,運行時間及識別率與三種算法最好的效果相近,但是經過演化后,運行時間與識別率比三種算法都高。
可以得出這樣的結論:1)同一種算法,經過種群分類后的數據集訓練得到的識別器的檢測效果比不分類的數據集訓練的效果好;2)即使是同一種群,識別器之間的檢測效果也存在差異;3)經過模型庫方法對各種數據集都能有較好的識別效果;4)演化方法對模型庫的檢測效果有較大提升。
以上實驗證明了SMO在對應用種群的劃分上具有一定可行性,劃分應用種群能提升應用惡意性檢測的效果,且本文提出的模型庫方法是有效可行的。
本文提取出應用的權限,使用SMO根據權限信息將應用進行分類并標注種群,通過約束在模型庫中找到對應的識別算法模型,最終得到較好的識別結果。通過簡單的實驗,驗證了本文提出的方法是有效可行的,且有以下優點:1)在對應用程序進行分類時,采用具有較高效率的序列最小優化算法對應用程序進行分類,每個類別的分類結果準確率到達85%以上;2)在對應用程序檢測時,依據應用程序的類別,自動在模型庫中找到對應的種群識別器,使識別效果提升;3)可以通過增加約束條件,篩選出最符合條件的識別器,使識別效果變成用戶期望的結果;4)對模型庫進行演化維護,使模型庫檢測效果增強。本文提出的方法不僅可以同時檢測大量的應用程序,且易于實現,使用簡單方便,還能通過修改約束得到用戶想要的結果,為解決安卓惡意軟件的識別提供了一種新思路。接下來嘗試將多個種群的分類池進行融合,構建一種能對多種群數據分類有更好效果的分類池,并能自適應地解決現有應用具有多種群屬性而導致分類結果對惡意檢測的影響。