張雄冠,邵培南
(中國電子科技集團公司第三十二研究所,上海 201808)
近10年來,伴隨著互聯網技術的迅猛發展,以及智能移動終端的普及,傳統的計算機軟件也開始向基于智能終端的應用市場轉移.根據360 互聯網安全中心發布的《2019年手機安全狀況報告》展示[1],2019年截獲的新增Android 惡意程序樣本約為180.9 萬個,平均每天截獲的新增惡意程序樣本個數約為0.5 萬個.觀察新增樣本的類型,還是以惡意扣費、資費消耗和隱私竊取這3 種類型為主.由此可見,Android 操作系統的安全形勢依然刻不容緩,為了減少惡意程序對用戶造成的損失,Android 惡意程序檢測也就成為一個值得深入研究的課題.
目前,Android 惡意程序檢測技術主要分成兩種:基于簽名的檢測技術[2]和基于行為的檢測技術.基于簽名的檢測技術實際上利用了模式匹配的思想,使用這種方法進行檢測需要對比已知的惡意代碼簽名庫,因此這種方法無法識別未知的惡意程序.而基于行為的檢測技術因為不需要依賴簽名的特性逐漸成為目前研究與應用的主流方法之一.基于行為的檢測技術又可依據是否需要實際運行目標程序進一步分為靜態行為分析方法和動態行為分析方法.
靜態行為分析法是目前應用相對廣泛的惡意代碼檢測方法.其優勢在于可以直接利用反編譯技術提取代碼本身的特征,不必在指定檢測環境下運行代碼,從而能夠在應用安裝前完成分析.文獻[3]就提出了一種組合靜態行為分析方法,該方法使用API 調用、API時間序列及API 使用頻率作為3 種靜態特征,再結合C4.5、DNN、LSTM 三種模型進行訓練,最后采用投票法確定測試樣本的結果.盡管應用廣泛,但靜態行為分析法還是具有一定的局限性.隨著互聯網安全技術的提高,越來越多的Android 應用為了抵抗未知的反編譯分析而采用了代碼保護技術.與此同時,惡意程序也在不斷地進化,比如采用代碼混淆技術來隱藏和加密自身的惡意代碼.面對這樣的情況,使用靜態行為分析技術的檢測效率也是越來越低.
動態行為分析法則是要求在沙箱或隔離環境中安裝并運行程序,這樣做的目的是盡可能監控程序執行過程中所產生的行為,并判斷是否存在惡意行為.這種方法不需要反編譯目標程序,且不受代碼混淆技術的影響,因此具有較高的檢測效率.目前,動態行為分析法從原理上可以分為以下兩類.
第1 類是基于污點跟蹤技術[4]的分析方法,這類方法首先標記程序對資源數據的訪問范圍,然后依據程序對被標記的污點數據的使用情況來判斷該程序的行為是否具有合法性.采用污點跟蹤技術的檢測方法可以有效地識別出惡意程序所產生的隱私泄露、數據篡改甚至漏洞利用等問題.文獻[5]介紹了一個基于污點追蹤技術的惡意軟件數據流分析模型TaintART,該模型采用多級污點分析技術把污點標簽存儲在寄存器中,從而減少污染標簽的存儲量,可以改善傳統污點分析效率較低的問題.盡管基于污點跟蹤技術的檢測方法能夠更細粒度地分析惡意程序的行為屬性,但是這種分析通常只能在Android 虛擬機層進行,因而無法檢測惡意程序在其他層(例如Native 層)存在的惡意行為.
第2 類則是基于系統函數調用情況的分析方法,這類方法主要是通過檢測程序對系統函數的調用行為來判斷程序是否具有惡意性.惡意程序往往需要利用系統提供的函數接口來實現其惡意行為,因此這類方法可以通過分析程序的系統函數調用情況來識別惡意程序.文獻[6]就介紹了一種監控目標軟件對Android Native 層系統函數和框架層API 的調用情況的方法,然后通過分析函數的調用序列及調用函數所傳遞的參數來檢測惡意軟件.
隨著機器學習技術的日漸成熟,將機器學習算法應用到Android 惡意代碼檢測中也逐漸成為了研究的主流趨勢.文獻[7]就提出了一種基于機器學習的動態監測框架用來監控軟件行為,并通過實驗分別對SVM、k近鄰等多種機器學習算法進行了評價.文獻[8]的研究則是采用隨機輸入和人工交互輸入來提取Android系統調用,并使用兩種特征選擇方法來共同構建特征矩陣,最后使用RandomForest、RotationForest 及AdaBoost 三種機器學習模型分別進行實驗.盡管目前機器學習在Android 惡意代碼檢測的應用中取得了較好的效果,但是其面對新增的、變種的惡意軟件的檢測能力依然有待提高.同時基于傳統機器學習的方法往往需要手動工程來判斷一個文件的行為是否具有惡意,但手動工程一般不僅時間消耗較長,而且需要人為確定特征、參數、變量等.
針對靜態行為分析方法與基于污點跟蹤技術的分析方法在Android 代碼行為特征提取上的不足,以及傳統機器學習方法在惡意程序檢測中存在的問題,本文提出了一種在動態行為分析的基礎上利用textCNN神經網絡模型的Android 惡意程序檢測方法.本方法的主要思路是首先采用多種觸發機制相結合的行為誘導方法來觸發Android 程序潛在的惡意行為;接著通過hook 技術掛鉤關鍵函數接口,進而對程序的各種行為數據進行采集并構建行為日志;然后基于行為日志提取行為特征數據作為模型輸入;最后使用textCNN神經網絡對行為數據集進行訓練、參數優化得到最終的分類模型,并通過實驗與傳統機器學習方法SVM、RandomForest 以及傳統循環神經網絡進行比較,證明了本方法具有較好的檢測效果.
任何Android 程序所產生的行為實際上都具有特定的行為模式,即這些行為可以分解為由原子行為組成的時間序列.而這些原子行為往往需要調用系統提供的函數接口來實現,因此可以采用基于系統函數調用的動態行為分析方法從程序對Android 框架層API和Native 層函數的調用情況中提取行為特征,再通過對比惡意程序的行為來判斷程序的合法性.基于這個原理,本文提出了一種以監測系統函數調用為基礎的動態行為采集方法,該方法主要包含兩個模塊:行為觸發模塊和行為采集模塊.行為觸發模塊的作用是采用多種觸發機制盡可能多地觸發程序的行為,使得采集模塊可以盡可能全面地采集到軟件的所有行為數據.行為采集模塊的作用是通過hook 技術來監控并記錄程序對Android 系統函數的調用情況以形成行為日志.
已知動態行為檢測方法是在沙箱或隔離環境中運行程序,其中第一個關鍵的步驟就是要能夠觸發程序的行為.倘若無法觸發惡意程序的全部行為,則后續的行為采集模塊很可能就無法提取到有效的惡意行為數據,繼而一定會影響檢測模型最后的檢測效率.因此,為了提高程序行為觸發的覆蓋率,首先需要明確的是被觸發的行為所發生在Android 系統中的層面,主要包含以下3 類:(1)系統層面,當系統層面的事件(例如開機、連接網絡等)執行后會立即觸發惡意程序的惡意行為,比如當系統接入互聯網后,惡意程序會開始傳輸系統中隱私數據.(2)Service 層面,許多惡意程序會將其惡意行為隱藏在后臺服務中,這樣就可以在用戶未知的情況下執行操作.(3)UI 及Activity 層面,當用戶對惡意程序的UI 進行操作時,往往就會觸發惡意的Activity 活動.針對不同系統層面的行為需要采取不同的觸發機制,具體的流程與框架如圖1所示.
本模塊通過使用Android 模擬器模擬各種系統事件發生的方式來觸發程序系統層面的惡意行為.已知在Android 系統中,軟件若要監聽系統事件就必須在Manifest 文件中注冊廣播組件.因此本模塊通過解析目標程序的Manifest 文件來獲取已注冊的廣播組件信息,然后利用ADB 調試橋與telnet 遠程控制命令在模擬器中模擬廣播組件相對應的各種事件,從而觸發程序系統層面相對應的行為.

圖1 行為觸發模塊框架流程圖
針對程序在Service 層面的惡意行為,本模塊采用啟動所有Service 事務的方式來觸發潛在該層面的惡意行為.因為任何應用想要在Android 系統中使用Service 事務就必須在Manifest 的文件中注冊Service組件,所以本模塊通過解析目標程序的Manifest 文件來獲取已注冊的Service 組件,然后利用ADB 工具啟動這些Service 事務,進而觸發執行在這些Service 中的惡意行為.
針對UI 及Activity 層面的惡意行為,本模塊所采用的方法相對復雜一些.首先,通過靜態分析目標程序來獲取軟件中Activity 之間的跳轉路徑信息;接著,針對每一個Activity,在啟動之后利用UI 獲取部件提取當前Activity 的UI 層次信息;然后,本模塊會利用系統自動化測試工具MonkeyRunner[9]針對這些UI 信息來模擬各種UI 事件觸發程序的行為;當遍歷完當前Activity 的所有UI 元素后,即可按照Activity 的跳轉路徑信息繼續下一個Activity 的遍歷.
考慮到目前Android 平臺的應用軟件都會使用混淆、加殼技術來保護自身的程序代碼,因此本模塊采用了一種基于動態分析的多層次的行為數據提取方法以應對該問題.本模塊所采用的方法主要以Android 逆向技術和Android 安全框架為理論基礎,分別對Android的應用框架層和Native 層的程序行為進行采集.
針對Android 應用框架層的行為數據,本模塊主要通過Android 注入技術以及Java hook 技術進行采集的.已知Android 系統一般采用虛擬機對應用層的軟件程序進行隔離和管理,其中4.4 版本之前采用的是Dalvik 虛擬機,而4.4 版本之后采用的是Android Runtime.在Dalvik 虛擬機進行Hook 的原理是:首先將虛擬機里面的Java 方法的Method 標識字段改為nativeMethod;接著自己編寫一個Native 方法,在這個Native 方法中,再自定義一個Java 方法,并在這個方法里調用了原方法;然后在調用前后分別通過注入技術插入鉤子,從而可以記錄原方法的調用情況了;最后把原Java 方法的nativeFunc 字段指向這個Native 方法.當原方法被調用時,首先會調用到自定義的Native 方法,在調用過程中,原函數的調用數據就被采集.對于Android Runtime 進行hook 的原理實際上是類似的,已知Java 層的每一個方法在Android Runtime 實現中都對應一個ArtMethod 結構體,只要把原方法的結構體內容通過注入方式替換為新的結構體內容,當然原方法被調用的時候,真正執行的就是注入的新方法的指令.為了兼容不同版本的Android 虛擬機,本模塊采用了同時支持Dalvik 虛擬機和ART 虛擬機的Xposed[10]框架對Android 應用框架層API 進行hook 工作.
對于Android Native 層的行為數據,本模塊則采用基于Inline hook[11]的動態注入技術進行采集.對比基于全局偏移表的hook 方法,Inline hook 的優勢在于不會受到表的限制,能夠修改重寫內存中任意一處的指令,從而實現對系統函數的掛鉤.Inline Hook 的實現原理是首先獲得被hook 系統函數的入口地址,然后在入口地址處插入強制跳轉指令,使進程跳轉到特定函數中,在該函數中執行監聽并記錄程序的行為數據,從而就實現了對Android 底層接口函數調用情況的監測.
當目標程序的一系列操作行為被成功觸發之后,各種操作行為必然依靠應用框架層或系統Native 層的函數接口來實現,此時行為采集模塊就可以利用上述方法對函數接口的調用情況進行監測與記錄,根據記錄結果即可生成程序的行為日志.本實驗所生成的行為日志的條目及相關含義如表1所示.

表1 目標程序行為日志條目說明
卷積神經網絡CNN 曾被廣泛應用于計算機視覺領域,隨著深度學習研究的不斷深入,不少學者也開始使用CNN 模型來處理自然語言處理問題.textCNN[12]即是由Yoon Kim 提出的一種用于處理文本分類問題的卷積神經網絡模型.textCNN 的主要思想是使用多個通道以及多個不同大小的卷積核,并通過一維卷積的方式提取詞向量矩陣的特征,然后使用最大池化層從特征矩陣選出每個通道中的最大值,與其他通道的最大值進行拼接,組合成最終的特征向量,最后通過全連接層計算分類的概率.經過動態行為觸發模塊和采集模塊后,程序的行為數據實際上轉換為了文本數據,因此可以采用textCNN 模型來進行處理.
對于文本類數據,首先需要將自然語言數值化,以方便后續處理.對于動態行為日志文本,其中每一行的函數調用記錄代表一個動態行為,本文將每一行視為一個行為詞匯,然后分別對每個詞匯構建相應的詞向量.將文本中的詞匯表征成詞向量最簡單的方式就是采用one-hot 編碼方法,但是這種方法也存在比較明顯的缺點,比如生成的向量長度過大以及無法準確表達詞匯之間的相似關系.而textCNN 模型提供一個隱藏的嵌入層,可以將one-hot 向量投影到低維空間里,在指定維度中編碼語義特征.本文在嵌入層采用的向量表示方法為fastText[13].fastText 實際上是Word2Vec中跳字模型[14]的一種改進,使用子詞嵌入的方法將構詞信息引入到了模型中.
在fastText 中,往往使用子詞集合來表示中心詞,假設一個中心詞w,將其長度在一定范圍內的子詞及特殊子詞的并集記為Gw.已知fastText 中詞典由所有詞的子詞集合的并集構成,假設w的子詞y在詞典中的向量表示為zy,則中心詞的向量vw就表示成:

對比跳字模型,fastText 訓練的詞向量可以更加準確地描述動態行為詞匯之間相關性.當在檢測過程中即便遇到詞典中未曾出現的行為詞匯,fastText 模型也可以從與其結構類似的其他詞匯中獲得對該詞匯更好的向量表示.
textCNN 模型的核心結構是卷積神經網絡,其基本結構包括輸入層、卷積層、池化層、全連接層和輸出層.卷積神經網絡用于行為分類的模型結構圖[15]如圖2所示.

圖2 textCNN 行為分類模型圖
從圖2中可以看到,在textCNN 模型的卷積層,卷積核的寬度與詞向量的維度是一致的,表明模型在提取特征的時候,將行為詞匯作為日志文本的最小粒度.在Android 動態行為日志中,往往惡意行為是由多個連續的動態行為詞匯組成,因此可以通過設置卷積核的高度來提取日志中相鄰行為詞匯的關聯性,不僅考慮了動態行為文本中的詞義而且兼顧了詞序以及上下文.圖2中卷積核的高度分別設置為2、3、4,對應提取文本中的2-gram、3-gram、4-gram 特征.對比傳統機器學習中的n-gram 模型,使用卷積核的優勢在于,只考慮連續詞匯的組成,不會使訓練集詞表爆炸式增長.
在卷積層中模型使用了不同大小的卷積核,卷積得到的feature maps 會具有不同的向量維度.因此在池化層中,可以使用1-max-pooling 方法通過提取每個feature map 中的最大值來表征該特征向量.池化層的主要作用是下采樣,通過不斷降低數據維度來減少網絡中的參數和計算次數.最后模型將每個特征向量經過1-max-pooling 池化得到的值拼接起來,即為池化層最終的輸出向量.
textCNN 模型最后一層為全連接層,池化層的輸出結果在進入全連接層之前,需要進行Dropout 操作來避免過擬合.全連接層設置可以參照傳統卷積神經網絡,第1 層采用ReLU 作為激活函數,第2 層則使用Softmax 分類函數來進行分類.
本文的實驗環境與相關配置如表2所示.

表2 實驗環境與配置
本文實驗所需的Android 惡意軟件樣本均來自于VirusShare 網站[16],其中樣本的數量為1500 個.同時,實驗所需的1000 個正常樣本均下載于Android 官方應用市場Google Play.對于1500 個惡意樣本和1000個正常樣本,分別使用其中的70%作為本文模型的訓練樣本,剩下的30%作為測試樣本.
對于每一個樣本,經過動態行為采集框架處理后會得到一個行為日志.原始的行為日志是json 數據格式,為了便于后面textCNN 模型的處理,實驗需要通過Python 爬取日志中關鍵信息,將其轉換為txt 文檔表示.文檔中的每一行即為一個行為API,每一行分為3 個部分,由空格分隔,每個部分的說明如表1所示.
為了充分評估模型的性能,本文在驗證模型訓練結果的時候采用了k折交叉驗證技術.在本實驗中,k的取值設定為10,即將訓練集劃分為10 個規模相等且無交集的子集,在每次訓練過程中依次選擇1 個子集作為測試集,剩余9 個子集作為訓練集,最終以10 次計算結果的平均值作為模型評價指標的最終結果.
本實驗使用3 個通用的評價指標即準確率PPrecision、召回率PRecall以及F1值來對實驗結果進評價.本實驗采用的樣本分類混淆矩陣如表3所示.

表3 樣本分類結果混淆矩陣
表3中,TP表示實際為正常樣本,被預測為正常樣本的樣本數目;FP表示實際為惡意樣本,被預測為正常樣本的樣本數目;FN表示實際為正常樣本,被預測為惡意樣本的樣本數目;TN表示實際為惡意樣本,被預測為惡意樣本的數目.實驗評價指標的計算公式如下所示:

由于實驗結果在很大程度上會受到實驗參數的影響,因此在實驗中將會對模型的參數進行設置.首先實驗將行為日志轉換后的文本最大長度設置為400,超過長度的部分將直接進行截斷操作.本實驗使用fastText模型訓練詞向量時所設置的參數值如表4所示.

表4 fastText 模型訓練參數設置
在textCNN 模型的訓練過程中,本實驗將卷積核的高度固定設置為3、4、5.對于其他參數,分別設置了幾組對照實驗,其中卷積核數量分別對比了64、128、256 三組值,Dropout 參數分別對比了0.3、0.4、0.5 三組值,激活函數對比了ReLU 和tanh 兩種函數.通過對比上述幾組參數值對實驗結果的影響,最終確定模型的參數如表5所示.

表5 textCNN 模型訓練參數設置
為了驗證本文提出的對于Android 應用程序的動態行為采集框架的有效性,本文設置了3 組對照實驗,分別采用不同的方法來提取Android 軟件的行為特征.第1 組采用傳統的靜態行為分析法來提取程序的靜態行為文本數據,實驗中具體參考文獻[3]提出的方法;第2 組采用基于污點跟蹤技術的分析方法來提取程序的行為文本數據,實驗中具體參考文獻[5]中方法;第3 組就采用本文的基于系統函數調用的動態行為采集方法來提取實驗數據.3 組實驗均使用相同的Android樣本數據集,然后將3 組實驗得到的3 組文本數據集都經過fastText 模型預處理以及textCNN 模型進行訓練,最后相同模型在不同數據集上的實驗結果如表6所示.

表6 不同數據集實驗結果對比
從表6中數據可以看出,本文提出的動態行為采集框架可以更有效的提取出Android 程序中行為特征.第一組數據集的檢測準確率相對較低,原因在于現在的Android 應用程序都添加了代碼混淆和代碼保護殼等對抗反編譯的措施,對比而言本文方法幾乎沒有受到這些措施的影響.第2 組與第3 組實驗結果的對比證實了基于污點跟蹤技術分析方法存在的局限性,即無法檢測惡意程序在Android Native 層的惡意行為.
為了對比textCNN 模型與傳統機器學習模型及傳統深度學習模型在Android 惡意程序上的檢測能力,本文設置了4 組對照實驗,將textCNN 模型與SVM 模型、RandomForest 模型以及循環神經網絡LSTM 模型進行了對比.SVM 與RandomForest 均是機器學習中比較成熟的分類模型,LSTM 也是一種可以高效處理文本問題的神經網絡模型.對于SVM、RandomForest和LSTM 模型中使用的詞向量,本實驗均采用傳統Word2Vec 模型預處理行為數據集來得到.不同模型在相同測試集上的實驗結果對比如表7所示.

表7 不同模型實驗結果對比
從表7中可以看出,對比SVM 與RandomForest這兩種機器學習模型,textCNN 模型的準確率、召回率和F1值分別高出了6.73%、5.48%、6.08%和3.39%、5.04%、4.2%,同時LSTM 模型的實驗結果較兩種機器學習模型而言也有明顯的提升.這說明采用神經網絡模型較傳統機器學習方法而言確實可以提高Android惡意程序的檢測準確率.對比textCNN 與LSTM,可以看到在相同測試集上textCNN 模型的檢測準確率還是有所提升的,雖然這種提升是有限的,但是應該考慮到textCNN 具有模型復雜度更小且訓練速度更快的先天優勢.圖3展示的是4 種模型在相同數據集上損失函數值隨迭代次數變化而變化的情況.從圖中可以看出,textCNN 模型的損失值相對于其他3 種模型不僅下降速度較快,而且最終收斂到一個更低的穩定值.
綜合兩部分的實驗結果可以表明本文提出的基于textCNN 模型的利用動態行為分析方法的Android 惡意程序檢測模型是切實可行的方案,能夠有效提升Android 惡意程序檢測的準確性和有效性.

圖3 不同模型損失值變化圖
本文提出了基于textCNN 模型的Android 惡意程序檢測方法.該方法實現了包含多種觸發機制的行為觸發系統,有效提高了程序動態行為的檢測覆蓋率;通過hook 技術動態采集程序系統函數接口和應用層API 的調用情況來生成動態行為日志;通過fastText 算法對行為日志進行詞嵌入處理,將文本數據轉換為詞向量數據;使用textCNN 模型對程序的行為數據進行檢測與分類.在實驗環節,本文使用1500 個惡意樣本和1000 個正常樣本,分別對動態行為采集模塊和基于textCNN 的檢測模塊設置了對照實驗,實驗結果證實了本文提出的這兩個模塊是切實可行的且能夠有效提高Android 惡意軟件檢測的準確性.
在下一步工作中,針對動態行為采集模塊,將研究更加智能的動態行為觸發機制,以提高行為檢測的覆蓋率;針對動態行為檢測與分類模塊,將繼續研究分類模型的優化問題,并嘗試將捕捉行為詞匯前后依賴關系的機制以及注意力機制引入到模型中,使模型能夠更高效地檢測Android 程序是否存在惡意性.