張雄冠,邵培南
(中國(guó)電子科技集團(tuán)公司第三十二研究所,上海 201808)
近10年來(lái),伴隨著互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,以及智能移動(dòng)終端的普及,傳統(tǒng)的計(jì)算機(jī)軟件也開(kāi)始向基于智能終端的應(yīng)用市場(chǎng)轉(zhuǎn)移.根據(jù)360 互聯(lián)網(wǎng)安全中心發(fā)布的《2019年手機(jī)安全狀況報(bào)告》展示[1],2019年截獲的新增Android 惡意程序樣本約為180.9 萬(wàn)個(gè),平均每天截獲的新增惡意程序樣本個(gè)數(shù)約為0.5 萬(wàn)個(gè).觀察新增樣本的類型,還是以惡意扣費(fèi)、資費(fèi)消耗和隱私竊取這3 種類型為主.由此可見(jiàn),Android 操作系統(tǒng)的安全形勢(shì)依然刻不容緩,為了減少惡意程序?qū)τ脩粼斐傻膿p失,Android 惡意程序檢測(cè)也就成為一個(gè)值得深入研究的課題.
目前,Android 惡意程序檢測(cè)技術(shù)主要分成兩種:基于簽名的檢測(cè)技術(shù)[2]和基于行為的檢測(cè)技術(shù).基于簽名的檢測(cè)技術(shù)實(shí)際上利用了模式匹配的思想,使用這種方法進(jìn)行檢測(cè)需要對(duì)比已知的惡意代碼簽名庫(kù),因此這種方法無(wú)法識(shí)別未知的惡意程序.而基于行為的檢測(cè)技術(shù)因?yàn)椴恍枰蕾嚭灻奶匦灾饾u成為目前研究與應(yīng)用的主流方法之一.基于行為的檢測(cè)技術(shù)又可依據(jù)是否需要實(shí)際運(yùn)行目標(biāo)程序進(jìn)一步分為靜態(tài)行為分析方法和動(dòng)態(tài)行為分析方法.
靜態(tài)行為分析法是目前應(yīng)用相對(duì)廣泛的惡意代碼檢測(cè)方法.其優(yōu)勢(shì)在于可以直接利用反編譯技術(shù)提取代碼本身的特征,不必在指定檢測(cè)環(huán)境下運(yùn)行代碼,從而能夠在應(yīng)用安裝前完成分析.文獻(xiàn)[3]就提出了一種組合靜態(tài)行為分析方法,該方法使用API 調(diào)用、API時(shí)間序列及API 使用頻率作為3 種靜態(tài)特征,再結(jié)合C4.5、DNN、LSTM 三種模型進(jìn)行訓(xùn)練,最后采用投票法確定測(cè)試樣本的結(jié)果.盡管應(yīng)用廣泛,但靜態(tài)行為分析法還是具有一定的局限性.隨著互聯(lián)網(wǎng)安全技術(shù)的提高,越來(lái)越多的Android 應(yīng)用為了抵抗未知的反編譯分析而采用了代碼保護(hù)技術(shù).與此同時(shí),惡意程序也在不斷地進(jìn)化,比如采用代碼混淆技術(shù)來(lái)隱藏和加密自身的惡意代碼.面對(duì)這樣的情況,使用靜態(tài)行為分析技術(shù)的檢測(cè)效率也是越來(lái)越低.
動(dòng)態(tài)行為分析法則是要求在沙箱或隔離環(huán)境中安裝并運(yùn)行程序,這樣做的目的是盡可能監(jiān)控程序執(zhí)行過(guò)程中所產(chǎn)生的行為,并判斷是否存在惡意行為.這種方法不需要反編譯目標(biāo)程序,且不受代碼混淆技術(shù)的影響,因此具有較高的檢測(cè)效率.目前,動(dòng)態(tài)行為分析法從原理上可以分為以下兩類.
第1 類是基于污點(diǎn)跟蹤技術(shù)[4]的分析方法,這類方法首先標(biāo)記程序?qū)Y源數(shù)據(jù)的訪問(wèn)范圍,然后依據(jù)程序?qū)Ρ粯?biāo)記的污點(diǎn)數(shù)據(jù)的使用情況來(lái)判斷該程序的行為是否具有合法性.采用污點(diǎn)跟蹤技術(shù)的檢測(cè)方法可以有效地識(shí)別出惡意程序所產(chǎn)生的隱私泄露、數(shù)據(jù)篡改甚至漏洞利用等問(wèn)題.文獻(xiàn)[5]介紹了一個(gè)基于污點(diǎn)追蹤技術(shù)的惡意軟件數(shù)據(jù)流分析模型TaintART,該模型采用多級(jí)污點(diǎn)分析技術(shù)把污點(diǎn)標(biāo)簽存儲(chǔ)在寄存器中,從而減少污染標(biāo)簽的存儲(chǔ)量,可以改善傳統(tǒng)污點(diǎn)分析效率較低的問(wèn)題.盡管基于污點(diǎn)跟蹤技術(shù)的檢測(cè)方法能夠更細(xì)粒度地分析惡意程序的行為屬性,但是這種分析通常只能在Android 虛擬機(jī)層進(jìn)行,因而無(wú)法檢測(cè)惡意程序在其他層(例如Native 層)存在的惡意行為.
第2 類則是基于系統(tǒng)函數(shù)調(diào)用情況的分析方法,這類方法主要是通過(guò)檢測(cè)程序?qū)ο到y(tǒng)函數(shù)的調(diào)用行為來(lái)判斷程序是否具有惡意性.惡意程序往往需要利用系統(tǒng)提供的函數(shù)接口來(lái)實(shí)現(xiàn)其惡意行為,因此這類方法可以通過(guò)分析程序的系統(tǒng)函數(shù)調(diào)用情況來(lái)識(shí)別惡意程序.文獻(xiàn)[6]就介紹了一種監(jiān)控目標(biāo)軟件對(duì)Android Native 層系統(tǒng)函數(shù)和框架層API 的調(diào)用情況的方法,然后通過(guò)分析函數(shù)的調(diào)用序列及調(diào)用函數(shù)所傳遞的參數(shù)來(lái)檢測(cè)惡意軟件.
隨著機(jī)器學(xué)習(xí)技術(shù)的日漸成熟,將機(jī)器學(xué)習(xí)算法應(yīng)用到Android 惡意代碼檢測(cè)中也逐漸成為了研究的主流趨勢(shì).文獻(xiàn)[7]就提出了一種基于機(jī)器學(xué)習(xí)的動(dòng)態(tài)監(jiān)測(cè)框架用來(lái)監(jiān)控軟件行為,并通過(guò)實(shí)驗(yàn)分別對(duì)SVM、k近鄰等多種機(jī)器學(xué)習(xí)算法進(jìn)行了評(píng)價(jià).文獻(xiàn)[8]的研究則是采用隨機(jī)輸入和人工交互輸入來(lái)提取Android系統(tǒng)調(diào)用,并使用兩種特征選擇方法來(lái)共同構(gòu)建特征矩陣,最后使用RandomForest、RotationForest 及AdaBoost 三種機(jī)器學(xué)習(xí)模型分別進(jìn)行實(shí)驗(yàn).盡管目前機(jī)器學(xué)習(xí)在Android 惡意代碼檢測(cè)的應(yīng)用中取得了較好的效果,但是其面對(duì)新增的、變種的惡意軟件的檢測(cè)能力依然有待提高.同時(shí)基于傳統(tǒng)機(jī)器學(xué)習(xí)的方法往往需要手動(dòng)工程來(lái)判斷一個(gè)文件的行為是否具有惡意,但手動(dòng)工程一般不僅時(shí)間消耗較長(zhǎng),而且需要人為確定特征、參數(shù)、變量等.
針對(duì)靜態(tài)行為分析方法與基于污點(diǎn)跟蹤技術(shù)的分析方法在Android 代碼行為特征提取上的不足,以及傳統(tǒng)機(jī)器學(xué)習(xí)方法在惡意程序檢測(cè)中存在的問(wèn)題,本文提出了一種在動(dòng)態(tài)行為分析的基礎(chǔ)上利用textCNN神經(jīng)網(wǎng)絡(luò)模型的Android 惡意程序檢測(cè)方法.本方法的主要思路是首先采用多種觸發(fā)機(jī)制相結(jié)合的行為誘導(dǎo)方法來(lái)觸發(fā)Android 程序潛在的惡意行為;接著通過(guò)hook 技術(shù)掛鉤關(guān)鍵函數(shù)接口,進(jìn)而對(duì)程序的各種行為數(shù)據(jù)進(jìn)行采集并構(gòu)建行為日志;然后基于行為日志提取行為特征數(shù)據(jù)作為模型輸入;最后使用textCNN神經(jīng)網(wǎng)絡(luò)對(duì)行為數(shù)據(jù)集進(jìn)行訓(xùn)練、參數(shù)優(yōu)化得到最終的分類模型,并通過(guò)實(shí)驗(yàn)與傳統(tǒng)機(jī)器學(xué)習(xí)方法SVM、RandomForest 以及傳統(tǒng)循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行比較,證明了本方法具有較好的檢測(cè)效果.
任何Android 程序所產(chǎn)生的行為實(shí)際上都具有特定的行為模式,即這些行為可以分解為由原子行為組成的時(shí)間序列.而這些原子行為往往需要調(diào)用系統(tǒng)提供的函數(shù)接口來(lái)實(shí)現(xiàn),因此可以采用基于系統(tǒng)函數(shù)調(diào)用的動(dòng)態(tài)行為分析方法從程序?qū)ndroid 框架層API和Native 層函數(shù)的調(diào)用情況中提取行為特征,再通過(guò)對(duì)比惡意程序的行為來(lái)判斷程序的合法性.基于這個(gè)原理,本文提出了一種以監(jiān)測(cè)系統(tǒng)函數(shù)調(diào)用為基礎(chǔ)的動(dòng)態(tài)行為采集方法,該方法主要包含兩個(gè)模塊:行為觸發(fā)模塊和行為采集模塊.行為觸發(fā)模塊的作用是采用多種觸發(fā)機(jī)制盡可能多地觸發(fā)程序的行為,使得采集模塊可以盡可能全面地采集到軟件的所有行為數(shù)據(jù).行為采集模塊的作用是通過(guò)hook 技術(shù)來(lái)監(jiān)控并記錄程序?qū)ndroid 系統(tǒng)函數(shù)的調(diào)用情況以形成行為日志.
已知?jiǎng)討B(tài)行為檢測(cè)方法是在沙箱或隔離環(huán)境中運(yùn)行程序,其中第一個(gè)關(guān)鍵的步驟就是要能夠觸發(fā)程序的行為.倘若無(wú)法觸發(fā)惡意程序的全部行為,則后續(xù)的行為采集模塊很可能就無(wú)法提取到有效的惡意行為數(shù)據(jù),繼而一定會(huì)影響檢測(cè)模型最后的檢測(cè)效率.因此,為了提高程序行為觸發(fā)的覆蓋率,首先需要明確的是被觸發(fā)的行為所發(fā)生在Android 系統(tǒng)中的層面,主要包含以下3 類:(1)系統(tǒng)層面,當(dāng)系統(tǒng)層面的事件(例如開(kāi)機(jī)、連接網(wǎng)絡(luò)等)執(zhí)行后會(huì)立即觸發(fā)惡意程序的惡意行為,比如當(dāng)系統(tǒng)接入互聯(lián)網(wǎng)后,惡意程序會(huì)開(kāi)始傳輸系統(tǒng)中隱私數(shù)據(jù).(2)Service 層面,許多惡意程序會(huì)將其惡意行為隱藏在后臺(tái)服務(wù)中,這樣就可以在用戶未知的情況下執(zhí)行操作.(3)UI 及Activity 層面,當(dāng)用戶對(duì)惡意程序的UI 進(jìn)行操作時(shí),往往就會(huì)觸發(fā)惡意的Activity 活動(dòng).針對(duì)不同系統(tǒng)層面的行為需要采取不同的觸發(fā)機(jī)制,具體的流程與框架如圖1所示.
本模塊通過(guò)使用Android 模擬器模擬各種系統(tǒng)事件發(fā)生的方式來(lái)觸發(fā)程序系統(tǒng)層面的惡意行為.已知在Android 系統(tǒng)中,軟件若要監(jiān)聽(tīng)系統(tǒng)事件就必須在Manifest 文件中注冊(cè)廣播組件.因此本模塊通過(guò)解析目標(biāo)程序的Manifest 文件來(lái)獲取已注冊(cè)的廣播組件信息,然后利用ADB 調(diào)試橋與telnet 遠(yuǎn)程控制命令在模擬器中模擬廣播組件相對(duì)應(yīng)的各種事件,從而觸發(fā)程序系統(tǒng)層面相對(duì)應(yīng)的行為.
圖1 行為觸發(fā)模塊框架流程圖
針對(duì)程序在Service 層面的惡意行為,本模塊采用啟動(dòng)所有Service 事務(wù)的方式來(lái)觸發(fā)潛在該層面的惡意行為.因?yàn)槿魏螒?yīng)用想要在Android 系統(tǒng)中使用Service 事務(wù)就必須在Manifest 的文件中注冊(cè)Service組件,所以本模塊通過(guò)解析目標(biāo)程序的Manifest 文件來(lái)獲取已注冊(cè)的Service 組件,然后利用ADB 工具啟動(dòng)這些Service 事務(wù),進(jìn)而觸發(fā)執(zhí)行在這些Service 中的惡意行為.
針對(duì)UI 及Activity 層面的惡意行為,本模塊所采用的方法相對(duì)復(fù)雜一些.首先,通過(guò)靜態(tài)分析目標(biāo)程序來(lái)獲取軟件中Activity 之間的跳轉(zhuǎn)路徑信息;接著,針對(duì)每一個(gè)Activity,在啟動(dòng)之后利用UI 獲取部件提取當(dāng)前Activity 的UI 層次信息;然后,本模塊會(huì)利用系統(tǒng)自動(dòng)化測(cè)試工具M(jìn)onkeyRunner[9]針對(duì)這些UI 信息來(lái)模擬各種UI 事件觸發(fā)程序的行為;當(dāng)遍歷完當(dāng)前Activity 的所有UI 元素后,即可按照Activity 的跳轉(zhuǎn)路徑信息繼續(xù)下一個(gè)Activity 的遍歷.
考慮到目前Android 平臺(tái)的應(yīng)用軟件都會(huì)使用混淆、加殼技術(shù)來(lái)保護(hù)自身的程序代碼,因此本模塊采用了一種基于動(dòng)態(tài)分析的多層次的行為數(shù)據(jù)提取方法以應(yīng)對(duì)該問(wèn)題.本模塊所采用的方法主要以Android 逆向技術(shù)和Android 安全框架為理論基礎(chǔ),分別對(duì)Android的應(yīng)用框架層和Native 層的程序行為進(jìn)行采集.
針對(duì)Android 應(yīng)用框架層的行為數(shù)據(jù),本模塊主要通過(guò)Android 注入技術(shù)以及Java hook 技術(shù)進(jìn)行采集的.已知Android 系統(tǒng)一般采用虛擬機(jī)對(duì)應(yīng)用層的軟件程序進(jìn)行隔離和管理,其中4.4 版本之前采用的是Dalvik 虛擬機(jī),而4.4 版本之后采用的是Android Runtime.在Dalvik 虛擬機(jī)進(jìn)行Hook 的原理是:首先將虛擬機(jī)里面的Java 方法的Method 標(biāo)識(shí)字段改為nativeMethod;接著自己編寫(xiě)一個(gè)Native 方法,在這個(gè)Native 方法中,再自定義一個(gè)Java 方法,并在這個(gè)方法里調(diào)用了原方法;然后在調(diào)用前后分別通過(guò)注入技術(shù)插入鉤子,從而可以記錄原方法的調(diào)用情況了;最后把原Java 方法的nativeFunc 字段指向這個(gè)Native 方法.當(dāng)原方法被調(diào)用時(shí),首先會(huì)調(diào)用到自定義的Native 方法,在調(diào)用過(guò)程中,原函數(shù)的調(diào)用數(shù)據(jù)就被采集.對(duì)于Android Runtime 進(jìn)行hook 的原理實(shí)際上是類似的,已知Java 層的每一個(gè)方法在Android Runtime 實(shí)現(xiàn)中都對(duì)應(yīng)一個(gè)ArtMethod 結(jié)構(gòu)體,只要把原方法的結(jié)構(gòu)體內(nèi)容通過(guò)注入方式替換為新的結(jié)構(gòu)體內(nèi)容,當(dāng)然原方法被調(diào)用的時(shí)候,真正執(zhí)行的就是注入的新方法的指令.為了兼容不同版本的Android 虛擬機(jī),本模塊采用了同時(shí)支持Dalvik 虛擬機(jī)和ART 虛擬機(jī)的Xposed[10]框架對(duì)Android 應(yīng)用框架層API 進(jìn)行hook 工作.
對(duì)于Android Native 層的行為數(shù)據(jù),本模塊則采用基于Inline hook[11]的動(dòng)態(tài)注入技術(shù)進(jìn)行采集.對(duì)比基于全局偏移表的hook 方法,Inline hook 的優(yōu)勢(shì)在于不會(huì)受到表的限制,能夠修改重寫(xiě)內(nèi)存中任意一處的指令,從而實(shí)現(xiàn)對(duì)系統(tǒng)函數(shù)的掛鉤.Inline Hook 的實(shí)現(xiàn)原理是首先獲得被hook 系統(tǒng)函數(shù)的入口地址,然后在入口地址處插入強(qiáng)制跳轉(zhuǎn)指令,使進(jìn)程跳轉(zhuǎn)到特定函數(shù)中,在該函數(shù)中執(zhí)行監(jiān)聽(tīng)并記錄程序的行為數(shù)據(jù),從而就實(shí)現(xiàn)了對(duì)Android 底層接口函數(shù)調(diào)用情況的監(jiān)測(cè).
當(dāng)目標(biāo)程序的一系列操作行為被成功觸發(fā)之后,各種操作行為必然依靠應(yīng)用框架層或系統(tǒng)Native 層的函數(shù)接口來(lái)實(shí)現(xiàn),此時(shí)行為采集模塊就可以利用上述方法對(duì)函數(shù)接口的調(diào)用情況進(jìn)行監(jiān)測(cè)與記錄,根據(jù)記錄結(jié)果即可生成程序的行為日志.本實(shí)驗(yàn)所生成的行為日志的條目及相關(guān)含義如表1所示.
表1 目標(biāo)程序行為日志條目說(shuō)明
卷積神經(jīng)網(wǎng)絡(luò)CNN 曾被廣泛應(yīng)用于計(jì)算機(jī)視覺(jué)領(lǐng)域,隨著深度學(xué)習(xí)研究的不斷深入,不少學(xué)者也開(kāi)始使用CNN 模型來(lái)處理自然語(yǔ)言處理問(wèn)題.textCNN[12]即是由Yoon Kim 提出的一種用于處理文本分類問(wèn)題的卷積神經(jīng)網(wǎng)絡(luò)模型.textCNN 的主要思想是使用多個(gè)通道以及多個(gè)不同大小的卷積核,并通過(guò)一維卷積的方式提取詞向量矩陣的特征,然后使用最大池化層從特征矩陣選出每個(gè)通道中的最大值,與其他通道的最大值進(jìn)行拼接,組合成最終的特征向量,最后通過(guò)全連接層計(jì)算分類的概率.經(jīng)過(guò)動(dòng)態(tài)行為觸發(fā)模塊和采集模塊后,程序的行為數(shù)據(jù)實(shí)際上轉(zhuǎn)換為了文本數(shù)據(jù),因此可以采用textCNN 模型來(lái)進(jìn)行處理.
對(duì)于文本類數(shù)據(jù),首先需要將自然語(yǔ)言數(shù)值化,以方便后續(xù)處理.對(duì)于動(dòng)態(tài)行為日志文本,其中每一行的函數(shù)調(diào)用記錄代表一個(gè)動(dòng)態(tài)行為,本文將每一行視為一個(gè)行為詞匯,然后分別對(duì)每個(gè)詞匯構(gòu)建相應(yīng)的詞向量.將文本中的詞匯表征成詞向量最簡(jiǎn)單的方式就是采用one-hot 編碼方法,但是這種方法也存在比較明顯的缺點(diǎn),比如生成的向量長(zhǎng)度過(guò)大以及無(wú)法準(zhǔn)確表達(dá)詞匯之間的相似關(guān)系.而textCNN 模型提供一個(gè)隱藏的嵌入層,可以將one-hot 向量投影到低維空間里,在指定維度中編碼語(yǔ)義特征.本文在嵌入層采用的向量表示方法為fastText[13].fastText 實(shí)際上是Word2Vec中跳字模型[14]的一種改進(jìn),使用子詞嵌入的方法將構(gòu)詞信息引入到了模型中.
在fastText 中,往往使用子詞集合來(lái)表示中心詞,假設(shè)一個(gè)中心詞w,將其長(zhǎng)度在一定范圍內(nèi)的子詞及特殊子詞的并集記為Gw.已知fastText 中詞典由所有詞的子詞集合的并集構(gòu)成,假設(shè)w的子詞y在詞典中的向量表示為zy,則中心詞的向量vw就表示成:
對(duì)比跳字模型,fastText 訓(xùn)練的詞向量可以更加準(zhǔn)確地描述動(dòng)態(tài)行為詞匯之間相關(guān)性.當(dāng)在檢測(cè)過(guò)程中即便遇到詞典中未曾出現(xiàn)的行為詞匯,fastText 模型也可以從與其結(jié)構(gòu)類似的其他詞匯中獲得對(duì)該詞匯更好的向量表示.
textCNN 模型的核心結(jié)構(gòu)是卷積神經(jīng)網(wǎng)絡(luò),其基本結(jié)構(gòu)包括輸入層、卷積層、池化層、全連接層和輸出層.卷積神經(jīng)網(wǎng)絡(luò)用于行為分類的模型結(jié)構(gòu)圖[15]如圖2所示.
圖2 textCNN 行為分類模型圖
從圖2中可以看到,在textCNN 模型的卷積層,卷積核的寬度與詞向量的維度是一致的,表明模型在提取特征的時(shí)候,將行為詞匯作為日志文本的最小粒度.在Android 動(dòng)態(tài)行為日志中,往往惡意行為是由多個(gè)連續(xù)的動(dòng)態(tài)行為詞匯組成,因此可以通過(guò)設(shè)置卷積核的高度來(lái)提取日志中相鄰行為詞匯的關(guān)聯(lián)性,不僅考慮了動(dòng)態(tài)行為文本中的詞義而且兼顧了詞序以及上下文.圖2中卷積核的高度分別設(shè)置為2、3、4,對(duì)應(yīng)提取文本中的2-gram、3-gram、4-gram 特征.對(duì)比傳統(tǒng)機(jī)器學(xué)習(xí)中的n-gram 模型,使用卷積核的優(yōu)勢(shì)在于,只考慮連續(xù)詞匯的組成,不會(huì)使訓(xùn)練集詞表爆炸式增長(zhǎng).
在卷積層中模型使用了不同大小的卷積核,卷積得到的feature maps 會(huì)具有不同的向量維度.因此在池化層中,可以使用1-max-pooling 方法通過(guò)提取每個(gè)feature map 中的最大值來(lái)表征該特征向量.池化層的主要作用是下采樣,通過(guò)不斷降低數(shù)據(jù)維度來(lái)減少網(wǎng)絡(luò)中的參數(shù)和計(jì)算次數(shù).最后模型將每個(gè)特征向量經(jīng)過(guò)1-max-pooling 池化得到的值拼接起來(lái),即為池化層最終的輸出向量.
textCNN 模型最后一層為全連接層,池化層的輸出結(jié)果在進(jìn)入全連接層之前,需要進(jìn)行Dropout 操作來(lái)避免過(guò)擬合.全連接層設(shè)置可以參照傳統(tǒng)卷積神經(jīng)網(wǎng)絡(luò),第1 層采用ReLU 作為激活函數(shù),第2 層則使用Softmax 分類函數(shù)來(lái)進(jìn)行分類.
本文的實(shí)驗(yàn)環(huán)境與相關(guān)配置如表2所示.
表2 實(shí)驗(yàn)環(huán)境與配置
本文實(shí)驗(yàn)所需的Android 惡意軟件樣本均來(lái)自于VirusShare 網(wǎng)站[16],其中樣本的數(shù)量為1500 個(gè).同時(shí),實(shí)驗(yàn)所需的1000 個(gè)正常樣本均下載于Android 官方應(yīng)用市場(chǎng)Google Play.對(duì)于1500 個(gè)惡意樣本和1000個(gè)正常樣本,分別使用其中的70%作為本文模型的訓(xùn)練樣本,剩下的30%作為測(cè)試樣本.
對(duì)于每一個(gè)樣本,經(jīng)過(guò)動(dòng)態(tài)行為采集框架處理后會(huì)得到一個(gè)行為日志.原始的行為日志是json 數(shù)據(jù)格式,為了便于后面textCNN 模型的處理,實(shí)驗(yàn)需要通過(guò)Python 爬取日志中關(guān)鍵信息,將其轉(zhuǎn)換為txt 文檔表示.文檔中的每一行即為一個(gè)行為API,每一行分為3 個(gè)部分,由空格分隔,每個(gè)部分的說(shuō)明如表1所示.
為了充分評(píng)估模型的性能,本文在驗(yàn)證模型訓(xùn)練結(jié)果的時(shí)候采用了k折交叉驗(yàn)證技術(shù).在本實(shí)驗(yàn)中,k的取值設(shè)定為10,即將訓(xùn)練集劃分為10 個(gè)規(guī)模相等且無(wú)交集的子集,在每次訓(xùn)練過(guò)程中依次選擇1 個(gè)子集作為測(cè)試集,剩余9 個(gè)子集作為訓(xùn)練集,最終以10 次計(jì)算結(jié)果的平均值作為模型評(píng)價(jià)指標(biāo)的最終結(jié)果.
本實(shí)驗(yàn)使用3 個(gè)通用的評(píng)價(jià)指標(biāo)即準(zhǔn)確率PPrecision、召回率PRecall以及F1值來(lái)對(duì)實(shí)驗(yàn)結(jié)果進(jìn)評(píng)價(jià).本實(shí)驗(yàn)采用的樣本分類混淆矩陣如表3所示.
表3 樣本分類結(jié)果混淆矩陣
表3中,TP表示實(shí)際為正常樣本,被預(yù)測(cè)為正常樣本的樣本數(shù)目;FP表示實(shí)際為惡意樣本,被預(yù)測(cè)為正常樣本的樣本數(shù)目;FN表示實(shí)際為正常樣本,被預(yù)測(cè)為惡意樣本的樣本數(shù)目;TN表示實(shí)際為惡意樣本,被預(yù)測(cè)為惡意樣本的數(shù)目.實(shí)驗(yàn)評(píng)價(jià)指標(biāo)的計(jì)算公式如下所示:
由于實(shí)驗(yàn)結(jié)果在很大程度上會(huì)受到實(shí)驗(yàn)參數(shù)的影響,因此在實(shí)驗(yàn)中將會(huì)對(duì)模型的參數(shù)進(jìn)行設(shè)置.首先實(shí)驗(yàn)將行為日志轉(zhuǎn)換后的文本最大長(zhǎng)度設(shè)置為400,超過(guò)長(zhǎng)度的部分將直接進(jìn)行截?cái)嗖僮?本實(shí)驗(yàn)使用fastText模型訓(xùn)練詞向量時(shí)所設(shè)置的參數(shù)值如表4所示.
表4 fastText 模型訓(xùn)練參數(shù)設(shè)置
在textCNN 模型的訓(xùn)練過(guò)程中,本實(shí)驗(yàn)將卷積核的高度固定設(shè)置為3、4、5.對(duì)于其他參數(shù),分別設(shè)置了幾組對(duì)照實(shí)驗(yàn),其中卷積核數(shù)量分別對(duì)比了64、128、256 三組值,Dropout 參數(shù)分別對(duì)比了0.3、0.4、0.5 三組值,激活函數(shù)對(duì)比了ReLU 和tanh 兩種函數(shù).通過(guò)對(duì)比上述幾組參數(shù)值對(duì)實(shí)驗(yàn)結(jié)果的影響,最終確定模型的參數(shù)如表5所示.
表5 textCNN 模型訓(xùn)練參數(shù)設(shè)置
為了驗(yàn)證本文提出的對(duì)于Android 應(yīng)用程序的動(dòng)態(tài)行為采集框架的有效性,本文設(shè)置了3 組對(duì)照實(shí)驗(yàn),分別采用不同的方法來(lái)提取Android 軟件的行為特征.第1 組采用傳統(tǒng)的靜態(tài)行為分析法來(lái)提取程序的靜態(tài)行為文本數(shù)據(jù),實(shí)驗(yàn)中具體參考文獻(xiàn)[3]提出的方法;第2 組采用基于污點(diǎn)跟蹤技術(shù)的分析方法來(lái)提取程序的行為文本數(shù)據(jù),實(shí)驗(yàn)中具體參考文獻(xiàn)[5]中方法;第3 組就采用本文的基于系統(tǒng)函數(shù)調(diào)用的動(dòng)態(tài)行為采集方法來(lái)提取實(shí)驗(yàn)數(shù)據(jù).3 組實(shí)驗(yàn)均使用相同的Android樣本數(shù)據(jù)集,然后將3 組實(shí)驗(yàn)得到的3 組文本數(shù)據(jù)集都經(jīng)過(guò)fastText 模型預(yù)處理以及textCNN 模型進(jìn)行訓(xùn)練,最后相同模型在不同數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果如表6所示.
表6 不同數(shù)據(jù)集實(shí)驗(yàn)結(jié)果對(duì)比
從表6中數(shù)據(jù)可以看出,本文提出的動(dòng)態(tài)行為采集框架可以更有效的提取出Android 程序中行為特征.第一組數(shù)據(jù)集的檢測(cè)準(zhǔn)確率相對(duì)較低,原因在于現(xiàn)在的Android 應(yīng)用程序都添加了代碼混淆和代碼保護(hù)殼等對(duì)抗反編譯的措施,對(duì)比而言本文方法幾乎沒(méi)有受到這些措施的影響.第2 組與第3 組實(shí)驗(yàn)結(jié)果的對(duì)比證實(shí)了基于污點(diǎn)跟蹤技術(shù)分析方法存在的局限性,即無(wú)法檢測(cè)惡意程序在Android Native 層的惡意行為.
為了對(duì)比textCNN 模型與傳統(tǒng)機(jī)器學(xué)習(xí)模型及傳統(tǒng)深度學(xué)習(xí)模型在Android 惡意程序上的檢測(cè)能力,本文設(shè)置了4 組對(duì)照實(shí)驗(yàn),將textCNN 模型與SVM 模型、RandomForest 模型以及循環(huán)神經(jīng)網(wǎng)絡(luò)LSTM 模型進(jìn)行了對(duì)比.SVM 與RandomForest 均是機(jī)器學(xué)習(xí)中比較成熟的分類模型,LSTM 也是一種可以高效處理文本問(wèn)題的神經(jīng)網(wǎng)絡(luò)模型.對(duì)于SVM、RandomForest和LSTM 模型中使用的詞向量,本實(shí)驗(yàn)均采用傳統(tǒng)Word2Vec 模型預(yù)處理行為數(shù)據(jù)集來(lái)得到.不同模型在相同測(cè)試集上的實(shí)驗(yàn)結(jié)果對(duì)比如表7所示.
表7 不同模型實(shí)驗(yàn)結(jié)果對(duì)比
從表7中可以看出,對(duì)比SVM 與RandomForest這兩種機(jī)器學(xué)習(xí)模型,textCNN 模型的準(zhǔn)確率、召回率和F1值分別高出了6.73%、5.48%、6.08%和3.39%、5.04%、4.2%,同時(shí)LSTM 模型的實(shí)驗(yàn)結(jié)果較兩種機(jī)器學(xué)習(xí)模型而言也有明顯的提升.這說(shuō)明采用神經(jīng)網(wǎng)絡(luò)模型較傳統(tǒng)機(jī)器學(xué)習(xí)方法而言確實(shí)可以提高Android惡意程序的檢測(cè)準(zhǔn)確率.對(duì)比textCNN 與LSTM,可以看到在相同測(cè)試集上textCNN 模型的檢測(cè)準(zhǔn)確率還是有所提升的,雖然這種提升是有限的,但是應(yīng)該考慮到textCNN 具有模型復(fù)雜度更小且訓(xùn)練速度更快的先天優(yōu)勢(shì).圖3展示的是4 種模型在相同數(shù)據(jù)集上損失函數(shù)值隨迭代次數(shù)變化而變化的情況.從圖中可以看出,textCNN 模型的損失值相對(duì)于其他3 種模型不僅下降速度較快,而且最終收斂到一個(gè)更低的穩(wěn)定值.
綜合兩部分的實(shí)驗(yàn)結(jié)果可以表明本文提出的基于textCNN 模型的利用動(dòng)態(tài)行為分析方法的Android 惡意程序檢測(cè)模型是切實(shí)可行的方案,能夠有效提升Android 惡意程序檢測(cè)的準(zhǔn)確性和有效性.
圖3 不同模型損失值變化圖
本文提出了基于textCNN 模型的Android 惡意程序檢測(cè)方法.該方法實(shí)現(xiàn)了包含多種觸發(fā)機(jī)制的行為觸發(fā)系統(tǒng),有效提高了程序動(dòng)態(tài)行為的檢測(cè)覆蓋率;通過(guò)hook 技術(shù)動(dòng)態(tài)采集程序系統(tǒng)函數(shù)接口和應(yīng)用層API 的調(diào)用情況來(lái)生成動(dòng)態(tài)行為日志;通過(guò)fastText 算法對(duì)行為日志進(jìn)行詞嵌入處理,將文本數(shù)據(jù)轉(zhuǎn)換為詞向量數(shù)據(jù);使用textCNN 模型對(duì)程序的行為數(shù)據(jù)進(jìn)行檢測(cè)與分類.在實(shí)驗(yàn)環(huán)節(jié),本文使用1500 個(gè)惡意樣本和1000 個(gè)正常樣本,分別對(duì)動(dòng)態(tài)行為采集模塊和基于textCNN 的檢測(cè)模塊設(shè)置了對(duì)照實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果證實(shí)了本文提出的這兩個(gè)模塊是切實(shí)可行的且能夠有效提高Android 惡意軟件檢測(cè)的準(zhǔn)確性.
在下一步工作中,針對(duì)動(dòng)態(tài)行為采集模塊,將研究更加智能的動(dòng)態(tài)行為觸發(fā)機(jī)制,以提高行為檢測(cè)的覆蓋率;針對(duì)動(dòng)態(tài)行為檢測(cè)與分類模塊,將繼續(xù)研究分類模型的優(yōu)化問(wèn)題,并嘗試將捕捉行為詞匯前后依賴關(guān)系的機(jī)制以及注意力機(jī)制引入到模型中,使模型能夠更高效地檢測(cè)Android 程序是否存在惡意性.