郗 桐金 昊徐根煒周金嶺
1(中國科學院信息工程研究所 北京 100089)2(信息安全共性技術(shù)國家工程研究中心 北京 100080)(xitong@iie.ac.cn)
隨著Android移動智能終端的普及,Android應用市場迅猛發(fā)展.但與此同時,Android惡意應用的數(shù)量也呈現(xiàn)了爆炸式的增長,給正常的Android應用生態(tài)環(huán)境造成了巨大的破壞,也給Android終端用戶帶來了一系列經(jīng)濟損失和信息泄露的風險.工信部中國信息通信研究院發(fā)布的《2017年中國手機安全生態(tài)報告》顯示,2017年上半年,360互聯(lián)網(wǎng)安全中心共截獲Android平臺新增惡意程序樣本483.9萬個,平均每天截獲新增惡意應用近2.3萬個[1].Sophos等信息安全企業(yè)在報告中指出,Android平臺惡意應用的數(shù)量在過去4年呈現(xiàn)穩(wěn)步增長的趨勢.2013年只有50多萬的惡意應用程序,到2015年這一數(shù)字已經(jīng)上升到了大約250萬,再到2017年,這個數(shù)字已經(jīng)高達近350萬[2].針對Android惡意應用的檢測研究關(guān)乎個人切身利益甚至國家的信息安全,具有較大的研究意義.
Android惡意應用檢測方法大體可以分為2個步驟:第1步從待檢測的Android應用程序中提取能夠區(qū)分良性應用與惡意應用的應用特征;第2步根據(jù)第1步提取的特征,對Android應用進行判別分類.根據(jù)應用特征的獲取方式不同,可以將Android惡意應用檢測方法分為動態(tài)檢測方法和靜態(tài)檢測方法.動態(tài)檢測是指在Android虛擬機中通過自動化測試工具自動運行Android應用程序,通過觀察其執(zhí)行流程與信息流動路徑等信息,判斷其是否為惡意應用.動態(tài)檢測能夠較好地應對代碼混淆、加密等隱藏惡意行為的方法,但是其檢測效率極低,運行一個應用花費的時間往往是幾分鐘甚至幾十分鐘,且應用執(zhí)行路徑無法保證完全覆蓋,有較大的可能性漏檢惡意代碼片段,因此其檢測準確率也不盡人意.與動態(tài)檢測技術(shù)不同,靜態(tài)檢測技術(shù)并不需要運行應用程序,而是通過反編譯等手段獲得Android應用的源代碼,從代碼中提取惡意行為特征,然后交給分類器判斷應用是否為惡意應用.通過總結(jié)以往的研究成果,研究人員通常將Android應用申請的權(quán)限以及調(diào)用的應用程序接口(application programming interface, API)序列等信息作為特征,并通過分類器進行分類識別.靜態(tài)檢測技術(shù)消耗的資源較少,分析效率較高.從代碼中能夠更深層次地挖掘惡意行為特征,因此相較動態(tài)檢測方法,其具有更高的檢測準確度.
從應用程序中提取特征后,需要對這些特征進行分析以判定其安全性.因為機器學習算法能夠從大量的數(shù)據(jù)中學習有意義的信息,研究者提出利用機器學習算法從應用程序中提取分類特征,從而判斷其安全性的技術(shù)方案.深度學習作為機器學習的分支,從2006年開始受到學術(shù)界的廣泛關(guān)注,已經(jīng)成為互聯(lián)網(wǎng)大數(shù)據(jù)和人工智能的一個研究熱潮.區(qū)別于傳統(tǒng)的淺層學習,深度學習強調(diào)了模型結(jié)構(gòu)的深度,通常有5層、6層、甚至10多層的隱層節(jié)點;同時,深度學習明確突出了特征學習的重要性,通過逐層特征變換,將樣本在原空間的特征表示變換到一個新特征空間,從而使分類或預測更加容易.
基于此,本文提出了一種基于深度學習的Android惡意應用檢測方法.與以往檢測方法不同的是,本方法簡化了人工特征選擇部分,直接將最能完整反映應用特征的Opcode操作碼作為模型的輸入,并采用卷積神經(jīng)網(wǎng)絡模型作為特征選擇、提取、分類模型,從而能夠有效地減少因為人工特征選擇給樣本信息量帶來的破壞.實驗結(jié)果表明,相比傳統(tǒng)方法,本方法能夠獲得更高的分類準確度,具有較高的可行性和可操作性.
根據(jù)選擇的分類器種類,可以將Android惡意應用檢測方法分為基于規(guī)則匹配的檢測方法、基于傳統(tǒng)機器學習分類器的檢測方法以及基于神經(jīng)網(wǎng)絡的檢測方法.
基于規(guī)則匹配的檢測方法是目前比較成熟的檢測方法,通常應用在各大信息安全公司.其方法是通過人工選擇或者借助較為簡單的機器輔助方式,建立一個較為完整的惡意應用庫,將待檢測的樣本與惡意應用庫中的樣本進行比較,如果待檢樣本存在于惡意應用庫則判定其為惡意應用,反之則判定其為良性應用.其具有檢測效率高、誤報率低的優(yōu)點,但是需要較多的人力、物力來建立與維護惡意樣本庫,且對新型的惡意應用以及惡意應用變種反應遲緩,無法作出迅速識別.
隨著機器學習的發(fā)展,有的研究人員嘗試采用機器學習的方法對提取到的特征進行分類.截至目前,研究人員已采用支持向量機(support vector machine, SVM)、樸素貝葉斯(Naive Bayesian, NB)、決策樹(decision tree, DT)等主流的機器學習方法對提取的特征進行分類,并取得了不錯的分類效果.2015年,Cen等人[3]提取應用申請的權(quán)限以及API調(diào)用函數(shù)作為分類特征,使用信息增益法和卡方校驗法作為特征選擇方法,通過SVM,DT等分類器進行分類,最終得到95.13%的分類準確度,驗證了特征選擇有利于提高分類器的分類準確度.Samra等人[4]獲取了網(wǎng)絡上18 174個惡意應用和電子市場的188 389個良性應用作為分析對象,使用反編譯之后的字節(jié)序列作為特征,使用k-means分類算法進行分類,最終得到71%的準確度以及71%的召回率.
隨著硬件計算能力的迅速提高以及單位計算成本的下降,神經(jīng)網(wǎng)絡逐漸被應用到惡意應用檢測領(lǐng)域.目前已有研究人員使用卷積神經(jīng)網(wǎng)絡(convolutional neural network, CNN)、深度置信網(wǎng)絡(deep belief network, DBN)等模型替代傳統(tǒng)的機器學習方法.2016年,Yuan等人[5]首次將深度學習算法應用于Android惡意應用檢測,提出一種新型的惡意應用檢測方法.該方法首先提取應用程序的權(quán)限和API調(diào)用等特征,然后將特征數(shù)據(jù)處理后輸入深度信念網(wǎng)絡中進行訓練得到最終的檢測模型,檢測準確度高達96.3%.2017年,Wang等人[6]提出了基于深度學習算法DBN的Android惡意應用檢測方法.該方法能夠提取Android應用程序的權(quán)限和API函數(shù)作為特征,并采用DBN對特征進行分析.實驗結(jié)果表明,隱藏層數(shù)為2層時,能夠取得最高的準確度93.96%,優(yōu)于基于SVM分類器的檢測性能.同年,Nix[7]采用卷積神經(jīng)網(wǎng)絡檢測Android應用程序,并構(gòu)建深度學習分類器,取得了高達99.4%的正確率.但是其測試樣本量較少,只對幾個惡意家族的樣本進行訓練與測試,而針對其他惡意家族的樣本沒有詳細的說明.盡管如此,這些研究均表明,相比傳統(tǒng)的機器學習方法,深度學習模型由于能夠更深層次地挖掘特征的內(nèi)部信息,在特征選擇方法相同的條件下具有更高的分類準確度.
通過對以往研究進行總結(jié)分析,本文發(fā)現(xiàn),在圖像識別領(lǐng)域應用較廣的卷積神經(jīng)網(wǎng)絡在惡意應用檢測領(lǐng)域也具有較好的檢測效果.原因在于卷積神經(jīng)網(wǎng)絡能夠較好地提取上下文信息,而Android應用代碼具有較為明顯的空間、時間局限性,能夠發(fā)揮卷積神經(jīng)網(wǎng)絡的優(yōu)勢.因此相比于其他的深度學習模型,卷積神經(jīng)網(wǎng)絡具有更高的分類準確度.
當前應用廣泛的Android應用特征通常包括應用申請的權(quán)限、調(diào)用的API序列、數(shù)據(jù)流向圖和應用消耗的電量等信息,其中權(quán)限和API序列是研究人員最常用的2種特征.
2.1.1權(quán)限
Android惡意應用要想實現(xiàn)惡意行為(比如竊取用戶信息或發(fā)送付費短信)必須調(diào)用系統(tǒng)接口,此時就必須申請相應的權(quán)限,比如發(fā)送付費短信就必須申請SEND_SMS等權(quán)限.這些惡意行為必須申請的權(quán)限被稱為敏感權(quán)限.通常情況下,惡意應用會申請較多的敏感權(quán)限,也正是因為這樣,敏感權(quán)限可以作為Android惡意應用檢測的一個常用特征.本文根據(jù)前人的研究成果,總結(jié)出常用的10種敏感權(quán)限,如表1所示.根據(jù)應用是否申請以上的敏感權(quán)限或組合,可以作為判斷Android應用程序是否為惡意應用的衡量標準.
表1 常用的10種敏感權(quán)限
2.1.2API調(diào)用序列
除了敏感權(quán)限,應用程序調(diào)用的API序列也可以用于Android惡意應用檢測.惡意應用想要完成相應的功能必須通過調(diào)用操作系統(tǒng)的API實現(xiàn).因此研究人員可以根據(jù)應用程序調(diào)用的API序列推算出該應用程序完成了什么類型的操作,比如是否泄露了敏感信息等行為.
目前針對API的研究主要分為2種方法:一種是將完整的API序列通過n-gram或API調(diào)用子樹的形式分割成多個API子序列,然后分析子序列中相鄰API之間的上下文關(guān)系.應用程序想要完成某個惡意行為必須連續(xù)調(diào)用多個API才可以完成,因此這種結(jié)合上下文的檢測方法相比于單獨分析應用程序是否調(diào)用過某個API,可以提高惡意應用的檢測準確度.另一種方法是借鑒了信息安全中的污點傳播技術(shù).研究人員提前從所有API中選擇可以向外傳遞數(shù)據(jù)信息的API作為終端節(jié)點,將敏感數(shù)據(jù)標記為污點,跟蹤數(shù)據(jù)的流向,如果敏感數(shù)據(jù)流向這些終端節(jié)點,則可認為敏感數(shù)據(jù)流向了智能終端之外的設備,該應用存在泄露敏感數(shù)據(jù)的可能.這種方法對惡意泄露用戶私密信息、發(fā)送付費短信等惡意應用較為有效,但是針對那些沒有數(shù)據(jù)流流出的惡意應用,比如勒索程序、以損壞智能設備為目的的木馬病毒等惡意應用效果并不明顯.
2.1.3Opcode操作碼
Opcode操作碼是一種介于高級語言與機器語言之間的指令,是谷歌公司設計的一種虛擬機指令,可以通過反編譯Android應用程序得到.相比于API調(diào)用序列,Opcode操作碼可以從底層解釋應用程序的行為,每一條指令都指向寄存器的操作.由于其劃分程度更加細致,因此比API調(diào)用序列能夠顯示出Android應用程序更多的行為特征.基于此,本文將Opcode操作碼作為主要的分析對象.與之前研究人員使用Opcode操作碼作為分析對象的檢測方法不同,本文沒有使用n-gram等方法對原始的操作碼序列進行切分,而是將全部的操作碼序列作為模型輸入,利用卷積神經(jīng)網(wǎng)絡自動提取更深層的特征.因此相較于以往的方法,本方法具有更高的分類準確度.
卷積神經(jīng)網(wǎng)絡是受到貓視覺皮層電生理研究的啟發(fā)而提出的一種人工神經(jīng)元網(wǎng)絡模型.它是一種多層前饋神經(jīng)網(wǎng)絡,主要應用在圖像視頻、自然語言處理等領(lǐng)域,并取得非常不錯的效果.卷積神經(jīng)網(wǎng)絡由卷積層和池化層構(gòu)成,卷積層相當于建立多個濾波器,每個濾波器是一個2維特征平面,通過濾波器和輸入向量作卷積運算,能夠提取到輸入向量的一種特征,每個特征平面由多個神經(jīng)元組成.池化層的輸入一般為卷積層的輸出,根據(jù)池化的方式不同可以分為最大池化、平均池化等,池化層可以降低參數(shù)的數(shù)量,使得訓練速度得到提高,同時也可以起到降低特征圖的維度,避免過擬合的效果.當經(jīng)過多個卷積層之后,特征基本被提取出來,這時卷積層的末端連接一個全連接層和一個Softmax分類器,完成最后的預測任務.以往的研究成果表明,卷積網(wǎng)絡的深度越深隱藏層數(shù)越多,就能夠提取越多的抽象特征,最終的分類準確度也越高.但是,隨著網(wǎng)絡層數(shù)增多,訓練模型消耗的計算資源以及時間都將大幅度提高.因此,選擇一種較為適中的卷積網(wǎng)絡層數(shù)也是本文需要研究的一個方面.
本方法首先使用反編譯工具對Android應用程序反編譯,得到Opcode操作碼;然后對Opcode操作碼進行預處理,并將處理之后的操作碼映射到向量空間;再將空間向量作為卷積神經(jīng)網(wǎng)絡的輸入,實現(xiàn)神經(jīng)網(wǎng)絡的學習和分類.其流程圖如圖1所示:
圖1 實驗流程圖
3.1.1實驗環(huán)境
本文使用的實驗樣本包括以下2個部分:1)從VirusTotal等Android惡意應用庫下載的6 351個Android惡意應用,標記為惡意樣本;2)從豌豆莢等常用Android應用市場上下載的5 996個Android應用,標記為良性樣本.將這些實驗樣本按照4∶1的比例劃分為樣本訓練集和測試集.本文使用反編譯工具apktool以及dex2Jar將實驗樣本反編譯為Opcode操作碼形式,將其作為實驗的主要分析對象.
然后,本文在TensorFlow框架下完成基于卷積神經(jīng)網(wǎng)絡的分類器的訓練和預測分類的任務.TensorFlow是谷歌公司發(fā)布的一款基于數(shù)據(jù)流圖計算的開源人工智能學習系統(tǒng),其支持卷積神經(jīng)網(wǎng)絡(convolutional neural network, CNN)、循環(huán)神經(jīng)網(wǎng)絡(recurrent neural network, RNN)、長短期記憶網(wǎng)絡(long short-term memory, LSTM)等在圖像、音頻、自然語言處理領(lǐng)域應用較廣的深度神經(jīng)網(wǎng)絡模型.并提供了一系列的實用接口供用戶調(diào)用,用戶可以方便快捷地創(chuàng)建、訓練、測試模型,提高研究效率.
3.1.2Opcode操作碼預處理
反編譯出的原始Opcode操作碼形式比較多樣,據(jù)統(tǒng)計,經(jīng)過反編譯環(huán)節(jié)產(chǎn)生的Opcode操作碼總共有1萬余種形式(包含大量噪聲、冗余).如果將原始Opcode操作碼直接作為輸入訓練神經(jīng)網(wǎng)絡會造成矩陣稀疏的問題,嚴重降低訓練效率.更為重要的是,卷積神經(jīng)網(wǎng)絡無法有效挖掘其中的隱藏特征,不利于模型分類的準確度.因此,對原始Opcode操作碼進行預處理十分必要.
根據(jù)粒度的不同,可以將Opcode操作碼劃分為6類、24類和256類.本文根據(jù)不同的劃分方法,對Opcode操作碼進行預處理,并將其分別輸入到卷積神經(jīng)網(wǎng)絡中訓練.實驗結(jié)果表明,當操作碼劃分為256類時,分類準確度最高,具體實驗結(jié)果在3.2節(jié)中詳細說明.這也在一定程度上說明將操作碼劃分得越精細,卷積神經(jīng)網(wǎng)絡越能夠挖掘其內(nèi)部的細微特征,得到的分類器準確度也會越高.但是當操作碼劃分顆粒度過小時,反而會影響特征提取部分的性能,造成分類準確度下降.
3.1.3操作碼向量空間
由于卷積神經(jīng)網(wǎng)絡的輸入為空間矩陣形式,因此還需要將操作碼從字節(jié)形式映射為空間向量形式.本文首先建立一個操作碼字典,為每一個操作碼賦予一個唯一的編號,然后通過詞向量轉(zhuǎn)換工具wordtovector,將操作碼轉(zhuǎn)換成詞向量的形式.本文使用的詞向量長度為8,即將每一個操作碼映射為一個8維的空間向量.假設樣本應用由N個操作碼組成,則可將該樣本應用轉(zhuǎn)換成總長度為8×N的空間向量.由于各個樣本的操作碼數(shù)量不等,這里采用填充的方法保證樣本向量的長度相同.首先,設置規(guī)范長度L,如果樣本的空間向量長度小于L,則在空間向量的末端添加0,直至向量長度達到L;如果樣本的空間向量長度大于L,則截斷L之后的向量,保留前長度為L的空間向量作為樣本的空間向量.通過統(tǒng)計不同應用樣本的空間向量長度,本文以訓練樣本的平均長度作為規(guī)范長度,L的值設置為250 000.然后將樣本的一維空間向量轉(zhuǎn)換成500×500的2維矩陣的形式,作為卷積神經(jīng)網(wǎng)絡的輸入部分,轉(zhuǎn)換過程如圖2所示:
3.1.4卷積神經(jīng)網(wǎng)絡訓練
本文使用卷積神經(jīng)網(wǎng)絡作為特征提取和分類模型,卷積層和池化層的不同排列方式都會影響最終的分類效果.本文使用不同層數(shù)的卷積神經(jīng)網(wǎng)絡作為實驗模型,驗證卷積層數(shù)對分類準確度的影響.借鑒卷積神經(jīng)網(wǎng)絡在圖像處理領(lǐng)域的應用,本文在卷積神經(jīng)網(wǎng)絡的末端使用全連接層和Softmax分類器進行分類.
本文在TensorFlow框架下建立卷積神經(jīng)網(wǎng)絡計算圖,將長度為L的樣本空間向量作為模型輸入,順序進入卷積層、池化層、卷積層、池化層、全連接層,最后使用Softmax分類器對樣本進行分類.由于樣本數(shù)量很大,如果在訓練過程中每一次迭代過程都使用全部的樣本進行訓練,時間復雜度將特別大,因此,我們隨機選取50個樣本作為一次迭代的訓練樣本,總共迭代次數(shù)為500,模型如圖3所示:
圖3 卷積神經(jīng)網(wǎng)絡模型圖
3.2.1分類器性能評估
本文使用機器學習領(lǐng)域流行的混淆矩陣作為分類器分類性能的評估方法.混淆矩陣是一種特定的矩陣,用來呈現(xiàn)算法性能的可視化效果,通常用于監(jiān)督學習.其每一列代表實際的類別,每一行代表預測的類別.混淆矩陣的形式如表2所示:
表2 混淆矩陣
其中TP(true positives)表示被正確識別為惡意應用的惡意應用數(shù);TN(true negatives)表示被正確識別為安全應用的安全應用數(shù);FP(false positives)表示被錯誤識別為惡意應用的安全應用數(shù);False Negatives(FN)表示被錯誤識別為安全應用的惡意應用數(shù).由混淆矩陣可以計算得到以下的分類器評估參數(shù):
3.2.2Opcode操作碼多粒度劃分實驗結(jié)果分析
在本節(jié)中,本文驗證不同粒度的Opcode操作碼對最終分類準確度的影響.我們分別將Opcode操作碼劃歸為6類、24類以及256類,并將其映射到空間向量,使用相同的卷積神經(jīng)網(wǎng)絡模型訓練樣本,得到的分類準確度如圖4所示.由圖4可知,將原始Opcode操作碼劃分為6類時,分類的準確度為80.46%,將原始Opcode操作碼劃分為24類時,分類準確度為92.16%,將原始Opcode操作碼劃分為256類時,分類準確度為94.12%,而不對原始Opcode操作碼進行劃分時,分類準確度僅為70.12%.
圖4 Opcode操作碼多粒度劃分分類效果圖
從圖4我們可以看出,Opcode操作碼劃分得越細致,卷積神經(jīng)網(wǎng)絡獲得的信息量越多,分類準確度也有一定程度的提升.而當Opcode的劃分過于細致時,分類器雖然能夠獲取更多的信息量,但是由于輸入數(shù)據(jù)變得異常稀疏,特征提取的難度也變得更大,分類的準確度反而降低.
3.2.3卷積神經(jīng)網(wǎng)絡深度對分類準確度的影響
在本節(jié)中,我們參考卷積神經(jīng)網(wǎng)絡在圖像識別領(lǐng)域的應用,選取了幾種卷積網(wǎng)絡模型進行實驗.首先是單卷積層、單池化層的卷積神經(jīng)網(wǎng)絡.這種網(wǎng)絡模型的優(yōu)點是訓練參數(shù)少,訓練速度快,但同時網(wǎng)絡沒有深度挖掘輸入的內(nèi)部特征,因此分類準確度低.然后,我們使用卷積層、池化層、卷積層、池化層的神經(jīng)網(wǎng)絡,相比于第1種模型,這種模型加深了卷積網(wǎng)絡的深度,因此在分類準確度上有了較大程度的提高.最后我們使用卷積層、卷積層、池化層、卷積層、池化層這種網(wǎng)絡深度更深的模型進行訓練,具體的分類準確度如圖5所示:
圖5 卷積神經(jīng)網(wǎng)絡不同層數(shù)分類效果圖
由圖5可知,當使用單卷積層時分類的準確度為81.10%;當使用2層卷積層時,分類的準確度為94.12%;當使用3層卷積層時,分類的準確度為94.03%,與使用2層卷積層的分類準確度大致相同,但是時間消耗大幅度提升.因此結(jié)合準確性和計算代價2方面進行權(quán)衡,本文最終選取2層卷積層的卷積神經(jīng)網(wǎng)絡作為目標模型.
本文提出了一種基于卷積神經(jīng)網(wǎng)絡的Android惡意應用檢測方法.首先,通過對Android應用程序進行反編譯,提取其Opcode操作碼;然后,在預處理環(huán)節(jié),本文使用不同的細粒度對操作碼進行合并操作,并探討了不同粒度對分類準確度的影響;最后,在模型訓練階段,本文探討了不同深度的卷積網(wǎng)絡對分類準確度的影響.本文提出的方法簡化了人工處理Opcode操作碼的工作,通過直接將操作碼向量輸入到神經(jīng)網(wǎng)絡模型,由網(wǎng)絡自動挖掘其中特征,最終準確度達到94.12%,說明該方法能夠?qū)W習到更好的分類特征,具備一定的先進性.
下一步工作將從以下幾個方面展開:首先,由于應用樣本的大小存在較大程度的差異,本文使用填充的方法以保持樣本向量長度的一致,這種操作導致很多長度較長的大樣本被人為截斷,損失了一定的信息量,會對分類的準確度造成一定的影響;其次,在研究過程中發(fā)現(xiàn),某些良性應用實現(xiàn)的功能與惡意應用實現(xiàn)的功能極度相似,比如自動發(fā)送短信以及獲取聯(lián)系人信息等功能,極易使分類器產(chǎn)生誤判,這也是今后需要研究解決的問題.