王亞洲,王 斌
(中國航天科工集團第二研究院 北京計算機技術(shù)及應(yīng)用研究所,北京 100854)
安卓誕生的數(shù)年來憑借其平臺的開放性獲得了巨大的市場滲透率,同時針對安卓的各類惡意應(yīng)用數(shù)量急劇增加。從卡巴斯基首次發(fā)現(xiàn)短信特洛伊木馬程序以來,安卓惡意軟件不斷發(fā)展,通過增加代碼混淆、隱蔽的命令和控制通信通道等方式來加強躲避檢測的能力[1]。而無論是廣泛使用的簽名和特征碼技術(shù)、對于應(yīng)用內(nèi)容進行分析的靜態(tài)檢測技術(shù),還是沙箱動態(tài)檢測技術(shù)都有其弊端。
最早出現(xiàn)基于簽名和特征碼技術(shù),優(yōu)點是檢測速度快、誤報率低,仍被當(dāng)前安全廠商采用,但是無法檢測短時間爆發(fā)的未知惡意應(yīng)用,并且隨著惡意軟件數(shù)量的不斷增長,很難維持龐大的特征庫[2]。并且傳統(tǒng)的基于靜態(tài)檢測方法檢測準(zhǔn)確率不高,而動態(tài)檢測方法需要占用大量的檢測時間,越來越難以適應(yīng)惡意應(yīng)用數(shù)量快速增長的情況。從以上得出惡意應(yīng)用的檢測需要更精準(zhǔn)的信息提取能力和更好的分類算法。
本文在分析了典型惡意應(yīng)用檢測方法的基礎(chǔ)上,針對以上方法的問題,提出一種基于深度學(xué)習(xí)的惡意應(yīng)用檢測方法。首先構(gòu)建了一個包含較大樣本量的數(shù)據(jù)集,將Android應(yīng)用處理后提取出關(guān)鍵信息,采用適用于文本分類的卷積神經(jīng)網(wǎng)絡(luò),應(yīng)用深度學(xué)習(xí)算法相比傳統(tǒng)機器學(xué)習(xí)算法有更強的學(xué)習(xí)特征的能力,提高了檢測效果。
對于安卓惡意應(yīng)用檢測,最直接接觸到的原始分析素材便是Android應(yīng)用程序包(Android application package,APK),而對安裝包中文件的靜態(tài)分析對本文提出的方法尤其重要。本節(jié)將針對安卓應(yīng)用進行解析,研究典型惡意應(yīng)用檢測方法。
安卓應(yīng)用安裝采用的是后綴名為APK的安裝文件,是一個包含各種數(shù)據(jù)的壓縮包。
如圖1所示,APK文件中包含工程屬性文件、代碼文件、應(yīng)用程序資源文件和第三方庫。其中對本文的方法比較重要的是AndroidManifest.xml文件和classes.dex文件。AndroidManifest.xml包含用來描述應(yīng)用的各個組件,包括構(gòu)成應(yīng)用的 Activity、服務(wù)、廣播接收器、ContentProvi-der、聲明應(yīng)用必須具備的權(quán)限等,其中權(quán)限用來規(guī)定應(yīng)用可以訪問API中受保護的部分,可以作為判定安卓應(yīng)用是否惡意的一個重要特征。classes.dex(dex:dalvik executable)文件是可以直接在Dalvik VM虛擬機上執(zhí)行的文件執(zhí)行格式,該文件含有Java源代碼編譯后的各個類,但是人工很難閱讀,因此需要經(jīng)過反編譯處理后才能提取其中有用的信息。Dalvik是Google公司在Android4.4版本之前專門為Android操作系統(tǒng)設(shè)計的一個基于寄存器的虛擬機,在此之后Google推出ART作為新的虛擬機,但是運行的仍是dex格式的代碼,因此對dex的分析不受影響。
圖1 典型應(yīng)用安裝包組成
現(xiàn)有的安卓惡意代碼檢測技術(shù)主要為基于靜態(tài)檢測技術(shù)和基于沙盒的動態(tài)行為檢測技術(shù),或者同時使用兩者的混合檢測技術(shù)。
一般的靜態(tài)分析內(nèi)容有簽名信息分析、代碼語義分析、控制流分析、數(shù)據(jù)流分析等。典型的靜態(tài)檢測方法在沒有運行應(yīng)用或者安裝應(yīng)用的情況下,通過對應(yīng)用程序中的代碼內(nèi)容采用源代碼的靜態(tài)分析工具進行檢測分析,然后匯總分析代碼在執(zhí)行過程中對資源的使用。秦中元等[3]提出一種多級簽名匹配算法,以MD5哈希算法與反編譯生成的smali文件為基礎(chǔ),生成API簽名、Class簽名、Method簽名、APK簽名和已知惡意應(yīng)用樣本庫進行對比。王兆國等[4]提出來一種抗混淆的Android應(yīng)用檢測方法,通過提取不同應(yīng)用的某些特定文件內(nèi)容特征,與作為對比標(biāo)準(zhǔn)的正版應(yīng)用、已知惡意應(yīng)用進行對比來識別惡意應(yīng)用。王志強等[5]提出用控制流序列即調(diào)用某個類方法的序列和有限長度的API函數(shù)調(diào)用序列在一定程度上表征安卓應(yīng)用程序的行為。
動態(tài)行為檢測方法運用虛擬機環(huán)境(也稱沙箱),將未知待檢測的代碼運行其中,通過檢測相應(yīng)軟件是否產(chǎn)生惡意行為作為判斷依據(jù)來判斷是否是惡意代碼[6]。同時代碼加密和混淆不會輕易影響基于行為的檢測方法,但是需要收集如函數(shù)調(diào)用、運行行為、文件使用等應(yīng)用產(chǎn)生的大量相關(guān)動態(tài)運行信息。該類方法與靜態(tài)檢測方法相比,對未知的惡意應(yīng)用檢測效果方面優(yōu)于基于特征代碼的檢測方式,可以減少漏報,但是速度較慢,其計算資源和時間是很難承受的,并且有些應(yīng)用檢測到沙箱運行后會針對性地改變其行為,躲避檢測。
近年有研究人員采用收集應(yīng)用API序列、調(diào)用函數(shù)序列,或者操作碼應(yīng)用樸素貝葉斯[7]、隨機森林等機器學(xué)習(xí)算法進行檢測,對未知惡意應(yīng)用的檢測取得了一定的效果。蔣晨等將惡意軟件轉(zhuǎn)化為灰度圖像,通過深度卷積神經(jīng)網(wǎng)絡(luò)來提取圖像紋理特征,從而檢測惡意軟件[8]。由靜態(tài)分析方法速度較快,資源占用少的特點和卷積神經(jīng)網(wǎng)絡(luò)提取特征的能力,本文提出運用應(yīng)用靜態(tài)信息通過卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練來識別其惡意行為邏輯,進而實現(xiàn)惡意應(yīng)用的檢測。
由第1節(jié)可知對于安卓惡意應(yīng)用,APK文件中包含可表征安卓應(yīng)用惡意行為的信息,并可利用深度學(xué)習(xí)技術(shù)自動提取特征的能力檢測惡意應(yīng)用。下面將闡述所提方法需提取的靜態(tài)信息及深度學(xué)習(xí)中卷積神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)。
APK文件中有很多可以用于惡意應(yīng)用靜態(tài)檢測方法的特征信息,但是直接將不經(jīng)處理的應(yīng)用輸入模型會給神經(jīng)網(wǎng)絡(luò)輸入過多冗余信息,造成模型難以訓(xùn)練或者擬合效果差。因此需要選擇適當(dāng)?shù)奶卣餍畔⑤斎刖W(wǎng)絡(luò)以實現(xiàn)較好惡意應(yīng)用檢測效果:
(1)權(quán)限類:Android系統(tǒng)有一個權(quán)限控制系統(tǒng),用戶可在安裝或者使用的過程中對某應(yīng)用的權(quán)限進行合理控制,限定控制權(quán)限在用戶手中,并且可在安裝過程中提示用戶從而開啟應(yīng)用功能所需的權(quán)限,在一定程度上可保護用戶的隱私數(shù)據(jù)并保護系統(tǒng)安全。然而惡意應(yīng)用會采用各種隱瞞策略誘騙用戶打開超出程序功能所需的權(quán)限,通過統(tǒng)計分析發(fā)現(xiàn),大量的惡意應(yīng)用會使用敏感權(quán)限如短信相關(guān)權(quán)限、監(jiān)控電話是否進行的權(quán)限和安裝應(yīng)用的權(quán)限[9]。大量惡意應(yīng)用會通過權(quán)限漏洞進行惡意行為:安裝其它非授權(quán)應(yīng)用、惡意消耗資費、偷取用戶通訊錄、相冊文件、監(jiān)控用戶電話活動等等;
(2)API類:現(xiàn)今很多正常應(yīng)用也會存在過度授權(quán)現(xiàn)象,使得僅通過其權(quán)限的使用來判斷惡意應(yīng)用缺乏充分性。需要從另一個角度看應(yīng)用的行為,Android系統(tǒng)通過系統(tǒng)框架層提供了供應(yīng)用使用的各種API去調(diào)取系統(tǒng)的各種資源,隱私數(shù)據(jù)也包括在其中。因此可以通過應(yīng)用API的使用來表征應(yīng)用的行為,即使惡意應(yīng)用繞開了權(quán)限管理控制。但是傳統(tǒng)的API特征只觀察系統(tǒng)是否調(diào)用某個API,用0/1標(biāo)志出現(xiàn)與否得到特征向量,這樣無法得出應(yīng)用的整體行為。根據(jù)這個思路,本文考慮提取安卓應(yīng)用API的使用順序API以及它們之間的關(guān)聯(lián)得到一種重要特征,用來識別應(yīng)用的敏感操作;
(3)ACTION類:Android系統(tǒng)運行過程中會產(chǎn)生一些事件,應(yīng)用如需獲取這類消息,則需要在應(yīng)用的AndroidManifest.xml文件中或應(yīng)用代碼中注冊ACTION組件,如此應(yīng)用便可收到其它應(yīng)用產(chǎn)生的事件或者系統(tǒng)狀態(tài)改變的事件從而監(jiān)控它們的運行狀態(tài)。而惡意應(yīng)用常常為了實現(xiàn)某些隱藏功能而注冊一些ACTION組件,比如檢測到電池狀態(tài)低的時候掛起程序以免引起懷疑的情形。
以往用到權(quán)限特征的方法只是簡單地提取了權(quán)限特征,利用機器學(xué)習(xí)方法來檢測應(yīng)用程序[10]。本方法綜合采用權(quán)限信息、API類和ACTION類,可以一定程度避免輸入冗余信息,降低模型運算量,同時不丟失區(qū)分惡意應(yīng)用和正常應(yīng)用的重要參考信息。
本文提出的方法將應(yīng)用靜態(tài)信息表示為文本形式,輸入深度卷積網(wǎng)絡(luò)模型即可從特征信息序列中學(xué)到指示惡意軟件的功能[11],從而使文本分類神經(jīng)網(wǎng)絡(luò)適于本方法。深度學(xué)習(xí)模型一旦經(jīng)過訓(xùn)練,就可以有效地在GPU上執(zhí)行,迅速的大量掃描檢測應(yīng)用。
深度學(xué)習(xí)算法的最大優(yōu)勢在于其逐層從數(shù)據(jù)中學(xué)習(xí)特征的特點,網(wǎng)絡(luò)越深,學(xué)到的特征越抽象,即可以自動學(xué)到表征惡意應(yīng)用的特征,這消除了大量的領(lǐng)域?qū)I(yè)知識和手工特征提取的需要。神經(jīng)網(wǎng)絡(luò)模型通常采用反向傳播(back propagation,BP)進行訓(xùn)練。BP算法是“誤差反向傳播”的簡稱,為一種使用梯度下降法監(jiān)督學(xué)習(xí)人工神經(jīng)網(wǎng)絡(luò)的方法。對于給定的人工神經(jīng)網(wǎng)絡(luò)和一個誤差函數(shù),該算法根據(jù)輸出與標(biāo)簽計算出誤差函數(shù)的值,之后計算誤差相對于神經(jīng)網(wǎng)絡(luò)中每個權(quán)重的梯度,根據(jù)該梯度更新各個權(quán)重的值。通過算法可快速更新權(quán)重,即更新神經(jīng)網(wǎng)絡(luò),經(jīng)過大量數(shù)據(jù)訓(xùn)練后生成可快速檢測惡意應(yīng)用的模型。同時模型還具有可更新性,通過不斷“投喂”新的惡意應(yīng)用可實現(xiàn)對新型惡意應(yīng)用變種的檢測能力。
如圖2所示,為本文所用的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。
圖2 卷積神經(jīng)網(wǎng)絡(luò)組成
(1)輸入層:模型的輸入層由每個應(yīng)用提取的特征信息的詞向量組成的矩陣組成,輸入矩陣大小為N*K,其中K為詞向量的長度,N為序列的長度。
(2)卷積層:在輸入層的基礎(chǔ)上,使用卷積核進行卷積操作得到特征圖。實驗中使用的3種大小的卷積核,分別是3*K,4*K,5*K,K表示詞向量的長度。其中每種類型大小的卷積核有100個含有不同值的Filter。每一個過濾器都能從輸入的矩陣中抽取出一個特征圖,在自然語言處理中稱為文本特征。
(3)池化層:對特征進行進一步提取,實驗中對特征圖的池化操作方式是取最大值池化的方式,即將每個特征圖向量中最大的一個值抽取出來,組成一個一維向量。
(4)全連接層:該層的輸入為池化操作后形成的一維向量,經(jīng)過激活函數(shù)輸出,再加上Dropout層防止過擬合。最后,將所得向量f傳遞到多層感知器(MLP,包括完全連接的隱藏層和全連接的輸出層)。帶有隱藏層的MLP提取的特征之間的高階關(guān)系可以被檢測從而用于分類。
(5)輸出分類結(jié)果:softmax層會使正確的分類獲得更大的概率,使錯誤的分類得到更小的概率,輸出當(dāng)前樣本二分類結(jié)果。然后和樣本標(biāo)簽做對比,通過BP算法進行誤差反向傳播調(diào)整神經(jīng)網(wǎng)絡(luò)的參數(shù)。
卷積神經(jīng)網(wǎng)絡(luò)不僅在圖像領(lǐng)域有優(yōu)異的效果,在文本分類上表現(xiàn)同樣優(yōu)異。對于文本卷積網(wǎng)絡(luò),和圖像中的處理稍不同的是卷積核通常是對圖像的一小塊區(qū)域進行計算,卷積核的寬度不與輸入矩陣相同,而在輸入矩陣中每一行代表一個詞的詞向量,構(gòu)成一句話的詞向量作為輸入。因此在處理文本時,每個卷積核就會覆蓋連續(xù)的幾個詞,此時卷積核的寬度需與矩陣的詞向量長度相同。通過這樣的方式,卷積神經(jīng)網(wǎng)絡(luò)便可捕捉連續(xù)出現(xiàn)的多個詞之間的特征,然后利用池化層減小表示空間的大小,以減少網(wǎng)絡(luò)中的參數(shù)和計算量,最終通過全連接層實現(xiàn)對APK的分類。
根據(jù)上述思路,本文設(shè)計了安卓惡意應(yīng)用檢測系統(tǒng)框架,實現(xiàn)提出的深度卷積神經(jīng)網(wǎng)絡(luò)的安卓惡意應(yīng)用檢測方法,可驗證提出的檢測方法的有效性。
如圖3所示,數(shù)據(jù)集獲取模塊獲取檢測系統(tǒng)所需的應(yīng)用素材,安卓應(yīng)用特征提取及預(yù)處理模塊對應(yīng)用進行提取信息和加工,深度卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練模塊將加工完成的序列信息輸入網(wǎng)絡(luò)進行訓(xùn)練,輸出優(yōu)化后的模型,最后采用生成的模型進行惡意應(yīng)用檢測驗證效果。主要模塊如下。
圖3 基于深度學(xué)習(xí)的惡意應(yīng)用檢測系統(tǒng)
利用爬蟲方法從公開的市場獲取良性應(yīng)用樣本,惡意應(yīng)用樣本則來自VirusShare平臺的2018年度樣本集,并隨機劃分80%的樣本為訓(xùn)練數(shù)據(jù)集,20%為驗證集。之后對APK文件反編譯,得到AndroidManifest.xml和smali文件,如圖4從AndroidManifest.xml中提取出權(quán)限類、ACTION類,從smali文件中提取API序列。將提取到的原始特征信息經(jīng)過詞向量編碼后形成特征序列。
圖4 安卓應(yīng)用特征提取
經(jīng)過統(tǒng)計良性、惡意應(yīng)用數(shù)據(jù)集中的安卓系統(tǒng)共有135種權(quán)限可以供應(yīng)用申請,應(yīng)用API經(jīng)過統(tǒng)計分析共有8432個,然而惡意應(yīng)用和良性應(yīng)用數(shù)據(jù)集中的API按頻率統(tǒng)計卻有不同的情況。例如良性應(yīng)用和惡意應(yīng)用API頻率統(tǒng)計中排名靠前的重合項很多,這是因為大多數(shù)應(yīng)用都需要用到一些系統(tǒng)API,如字符串類函數(shù)、文件類函數(shù),但是這類API不具有較強的區(qū)分能力,因此本文的方法,采用在良性應(yīng)用和惡意應(yīng)用中頻率差較高前1500個API作為所需的特征。
特征信息轉(zhuǎn)化為序列的方式本文采用隨機化初始化的詞向量嵌入方法。在詞嵌入之前往往采用 1-of-N Encoding(獨熱編碼)的方法,這種編碼方法會使得碼字很長,若一共有2000個單詞,就需要一個長度為2000的串進行編碼,對計算資源是一種浪費。所以在本方法使用的特征信息不超過2000種的情況下,采用隨機初始化為詞向量的編碼方式生成特征信息對應(yīng)為詞向量的詞典,每類信息編碼長度僅為11位。
最后將每個應(yīng)用的權(quán)限類、API類、ACTION類信息根據(jù)統(tǒng)一隨機初始化為詞向量的編碼方式進行編碼,以此種編碼方式將應(yīng)用特征信息表示為二值化序列,從而便于輸入神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練。權(quán)限類、ACTION類信息放到最前面,API類信息在其后3種,3種信息用英文句號分隔,然后每個smali文件都是同一個類的,將每個smali文件中的API放到用句號結(jié)尾,即每一類文件可作為一句話。如圖5所示為某APK經(jīng)過預(yù)處理后的APK文本的樣式。
圖5 經(jīng)過預(yù)處理后的APK文本
每一個樣本的特征信息經(jīng)過提取后按照權(quán)限信息、ACTION信息和API信息的順序進行排列,形成一個n*m大小的矩陣序列。
最后是卷積網(wǎng)絡(luò)訓(xùn)練過程。由于預(yù)處理我們從中把含有權(quán)限信息和API類,ACTION類序列的所有類連接在一起,用單個序列代表整個應(yīng)用程序的特征信息。卷積神經(jīng)網(wǎng)絡(luò)的輸入序列長度一般是固定的,然而不同的應(yīng)用生成的序列長度是不一致的,此時需將較短的序列后面補充零值詞向量。
卷積網(wǎng)絡(luò)訓(xùn)練之前需要進行參數(shù)初始化,初始設(shè)置見表1。
其中學(xué)習(xí)率是對權(quán)值修改的幅度,值越大對各層網(wǎng)絡(luò)的權(quán)值的修改幅度越大,網(wǎng)絡(luò)收斂速度越快。之后將應(yīng)用特征信息形成的序列輸入文本卷積神經(jīng)網(wǎng)絡(luò),通過誤差反向傳播算法自動更新網(wǎng)絡(luò)權(quán)重,對網(wǎng)絡(luò)進行微調(diào),自動學(xué)習(xí)特征,生成分類模型。
表1 卷積網(wǎng)絡(luò)參數(shù)初始化設(shè)置
把經(jīng)過參數(shù)優(yōu)化的模型用驗證集進行檢測、記錄、分析檢測結(jié)果,并和傳統(tǒng)機器學(xué)習(xí)方法對比。
相比于現(xiàn)有的惡意軟件檢測方法,所提方法可以克服動態(tài)檢測方法時間長、依賴于特定工具的缺點。本方法只需要少量的數(shù)據(jù)預(yù)處理工作,即可自動學(xué)習(xí)數(shù)據(jù)的特征表示,相比于傳統(tǒng)機器學(xué)習(xí)方法可以在更大的數(shù)據(jù)集上使用,并且通過向系統(tǒng)輸入標(biāo)記過的新樣本,還可自動更新檢測系統(tǒng)。
本文所用的數(shù)據(jù)集分別來自360應(yīng)用市場和VirusShare平臺,良性樣本和惡意樣本分別為2160個和1342個,分別隨機劃分其中的80%作為訓(xùn)練集,20%作為驗證集。實驗平臺配置見表2。
表2 實驗平臺配置
本文中的良性、惡意應(yīng)用數(shù)據(jù)集,根據(jù)樣例的真實類別與深度神經(jīng)網(wǎng)絡(luò)預(yù)測類別的組合劃分為真正類(TP)、假正類(FP)、真反類(TN)、假反類(FN)4種情形。分類結(jié)果見表3。
表3 分類結(jié)果混淆矩陣
TP:真正類,惡意應(yīng)用被預(yù)測為惡意應(yīng)用
FN:假負類,惡意應(yīng)用被預(yù)測成良性應(yīng)用
FP:假正類,良性應(yīng)用被預(yù)測成惡意應(yīng)用
TN:真負類,良性應(yīng)用被預(yù)測成良性應(yīng)用
根據(jù)以上分類情形,便于評價檢測效果的準(zhǔn)確率,漏報率和誤報率的定義如下所示
本文的數(shù)據(jù)預(yù)處理中的反編譯工具為Apktool,深度學(xué)習(xí)框架為Tensorflow,編程語言為Python。經(jīng)過深度學(xué)習(xí)模型訓(xùn)練后,采用數(shù)據(jù)集的20%進行檢測,得到實驗結(jié)果見表4。
表4 同基于隨機森林算法的方法的比較
本實驗結(jié)果和采用機器學(xué)習(xí)的隨機森林算法[12]的結(jié)果對比來看,本方法的精確度略高于隨機森林算法,這是因為本方法將權(quán)限、API類、ACTION類等信息合理運用,采用適宜的特征信息向量化方式,運用深度學(xué)習(xí)可獲得應(yīng)用深層特征的能力,實現(xiàn)了較好檢測的效果。
本文提出了一種基于深度學(xué)習(xí)的安卓惡意應(yīng)用檢測方法,創(chuàng)建了一個較大的包含惡意、良性應(yīng)用的數(shù)據(jù)集,通過提取應(yīng)用較少的靜態(tài)信息,運用深度學(xué)習(xí)算法的能力表征應(yīng)用的行為,實現(xiàn)了高效迅速的檢測未知惡意應(yīng)用。本文的方法相比于動態(tài)檢測方法也可節(jié)省較多的時間,但是漏報率較高,下一步將研究在更大的數(shù)據(jù)集上進行實驗,不同良性、惡意應(yīng)用樣本的比例下,降低漏報率,進一步提高檢測效果。