董克源 徐 建
(南京理工大學計算機科學與工程學院 南京 210094)
Android的核心代碼是開源的,意味著任何移動設備廠商都可以拷貝一份源碼,去進行加工開發(fā)和適配工作,然后推出自己的Android手機,這導致越來越多的手機和其他設備采用Android系統(tǒng)進行改造,于是Android的市場份額也越來越大。根據(jù)分析機構StatCounter從250個網(wǎng)站綜合的大約150億次訪問數(shù)據(jù),Android設備產(chǎn)生的流量在2017年3月首次超過了Windows PC,從后者的頭上摘走第一大操作系統(tǒng)的王冠,然而,不幸的是,也正是因為Android是開源系統(tǒng),某些不法分子可以通過源碼了解此系統(tǒng)的基本結構和源代碼,通過誘導用戶安裝Android惡意應用,從而攫取不法利益。所以,為了用戶安全,Android惡意應用檢測技術成為了當今熱點問題。
現(xiàn)有的惡意檢測方法主要可以分為三種,分別是基于靜態(tài)分析的方法、基于動態(tài)分析的方法和基于靜態(tài)和動態(tài)結合的方法[1~3]。本文提出的基于Stacking的權限分析方法屬于靜態(tài)分析的范圍。基于權限特征的檢測方法是一種常用的基于靜態(tài)分析的惡意應用檢測方法。這個方法首先提取Android應用的權限特征,然后使用數(shù)據(jù)挖掘、機器學習的方法對其進行分析檢測,建立分類檢測模型,這種方法往往能有效率高的優(yōu)點,所以被廣泛使用。DroidRanger[4]系統(tǒng)和 WHYPE[5]系統(tǒng)等從給定的應用中提取權限特征,并通過應用自然語言處理技術對應用請求的權限進行匹配,以及通過權限的使用情況來識別惡意應用。但是這個方法也存在一些缺陷,比如不同的分類算法針對同一類特征的檢測效果不同,且無法預知哪個算法效果最優(yōu)、使用單一的算法不能充分發(fā)揮權限特征在惡意應用檢測時所起的作用。另外,通過申請的權限直接提取權限特征會出現(xiàn)冗余權限的問題,進而導致分類不夠準確。
為了解決上述問題,本文采用兩個方法。1)采用去除冗余權限的方法提取特征。在以往的方法中,都是分析Manifest中申請的權限作為權限特征[6~9],本文采用分析調(diào)用的api來再次確認權限的真正使用情況,可以更加準確提取權限特征。2)本文研究多種集成方法對惡意檢測模型的作用,本文先后采用少數(shù)服從多數(shù)法、一票否決法、基于Stacking的集成方法[10~12],最后發(fā)現(xiàn)基于Stacking的方法能取的較好的結果。實驗結果表明,本文提出的基于Stacking的Android應用惡意檢測方法的準確率能達到96%左右,具有較好的檢測效果。
圖1是基于Stacking的Android的惡意應用檢測方法的應用框架。將收集到的惡意樣本庫和正常樣本庫的每個樣本的權限特征持久化到數(shù)據(jù)庫,和傳統(tǒng)的權限特征不同,本次研究提取的權限信息是程序?qū)嶋H用的權限,剔除申請到的無用權限,然后用四個分類算法對訓練集進行訓練學習,得到四個基分類器,包括貝葉斯分類器、C4.5分類器、SVM分類器、感知機分類器。接著用訓練得到的四個基分類器分別對訓練集中的每個樣本進行分類,這樣可以組合得到新的特征,用這個特征再次訓練出一個新的分類器模型,可以使用貝葉斯分類器。這樣當我們需要對一個新的未知的應用進行檢測的時候,需要先提取權限特征,然后用四個基分類器分類得到四個分類結果,最后用這個分類結果作為輸入,輸入到第二層分類器得到最終分類結果。

圖1 基于Stacking的Android惡意檢測方法研究
傳統(tǒng)的權限向量提取方法如下,作為對比實驗
1)為樣本文件建立一個n維權限向量(n代表最新安卓版本的權限總量),每一維代表一個權限,值可取true或false,其值代表樣本是否申請該權限;初始化權限向量,每一維初始均取false。

2)使用ApkTool工具對樣本文件進行反編譯工作,得到樣本文件的配置文件AndroidManifest.xml文件。
3)對反編譯得到的AndroidManifest.xml進行解析,提取出其中的uses-permission節(jié)點,得到該樣本所申請使用的權限集合。
4)分析處理樣本文件申請權限集合,修改樣本對應的權限向量,將樣本文件所申請的權限對應位修改為true,得到該樣本的權限特征向量。
5)對每一個apk樣本重復1)~4)步驟,得到樣本集的權限特征。
本文新提出的權限提取方法如下:
1)首先構造“API-權限”之間映射關系,構造過程可以查看Android官方文檔,主要參考現(xiàn)有的PScout成果,找到api和權限之間多對多的映射關系;
2)將映射關系存儲到數(shù)據(jù)庫;
3)按照傳統(tǒng)的權限提取方法提取出樣本文件的權限向量A
4)為該樣本文件建立一個n維權限向量B(n代表最新安卓版本的權限總量),初始化權限向量,每一維初始均取false。檢索反編譯后的文件,查詢所有使用到的api,根據(jù)api-權限映射表,查詢所有可能用到的權限,將對應的權限值置為true;

5)更新權限向量A,每個值等于f(x)&p(x),取A矩陣中B矩陣中相同的權限對應的值進行與運算,都為true保持為true,否則修改為false;
6)對每一個apk樣本重復3)~5)步驟,得到樣本集的權限特征。
對于獲取的樣本權限特征,傳統(tǒng)方式是將其作為單分類器的輸入進行訓練模型,然后用這個模型來對新的安卓apk進行檢測,這樣的好處是方便快速,但是缺點是檢測的效果不是很好。本文采用的方法是使用多個分類器訓練多個模型,包括樸素貝葉斯、C4.5、感知機和SVM,再對多個模型的訓練結果進行集成。本文實驗采用多種集成方式,包括少數(shù)服從多數(shù)、一票否決法、Stacking元學習策略法。最終發(fā)現(xiàn)使用Stacking元學習策略法作為集成方法能大大提高檢測效果。
算法1:Android malicious detection algorithm based on Stacking
2:Output:classifier model
3:Step1:learn base classifiers
4:for i to T do
5: learnModelibase on D
6:end for
7:Step2:construct new training data
8:for i=1 to m do

10: adddhtoDh
10:end for
11:Step3:
12:learnModelNBbased onDh
13:returnModelNB
第一行的訓練數(shù)據(jù)是上述提取的權限特征向量和安卓程序是否是惡意的標簽。輸出是集成分類模型。在第四行到第六行,采用多種分類算法訓練得到基本分類模型,第八行到第十行,根據(jù)學習到的分類模型對訓練集進行分類,得到分類結果,{bayes result,C4.5 result,perceptron result,svm result},再加上真實的分類標簽,組合成為新的特征值。第十二行用新組合得到的特征,訓練出樸素貝葉斯(NB)模型。如此,基于Stacking的Android惡意檢測模型已經(jīng)建立完畢。當拿到新的apk,可以提取權限特征,然后采用Step1得到的多種基本分類器分類,根據(jù)分類結果組合新的特征后,采用Step3得到的樸素貝葉斯分類器進行分類,得到最終檢測結果。
本實驗從第三方應用市場下載了1000款Android應用,包含475款惡意應用和525款正常應用作為的樣本集,樣本集中的這些應用覆蓋了娛樂、教育、體育、衛(wèi)生、新聞、財經(jīng)等多種類型,具有代表性。所有的實驗都在內(nèi)存為8 GB RAM,處理器為Intel(R)Core i7-7500U CPU 2.70GHz 2.90GHZ 的機器上完成,采用ApkTool對樣本進行反編譯,采用了Java語言實現(xiàn)APK樣本的特征提取,采用Java語言實現(xiàn)基于Stacking的集成分類算法。
實驗中采用的是常用的評價標準:正確率、靈敏度、特效度和精度。先介紹幾個常見的模型評價術語:
1)True positives(TP):被正確地劃分為良性軟件的個數(shù),即實際為良性軟件且被分類器劃分為良性軟件的實例數(shù);
2)False positives(FP):被錯誤地劃分為良性軟件的個數(shù),即實際為惡意軟件但被分類器劃分為良性軟件的實例數(shù);
3)False negatives(FN):被錯誤地劃分為惡意軟件的個數(shù),即實際為良性軟件但被分類器劃分為惡意軟件的實例數(shù);
4)True negatives(TN):被正確地劃分為惡意軟件的個數(shù),即實際為惡意軟件且被分類器劃分為惡意軟件的實例數(shù)。
正確率:表示分對的樣本數(shù)除以所有的樣本數(shù),通常來說,正確率越高,分類器越好。

式中,Ntotal代表總樣本數(shù),也等于TP+FP+FN+TN。
靈敏度:表示的是所有Android良性軟件中被分對的比例,衡量了分類器對良性軟件的識別能力。

特效度:表示的是所有Android惡意軟件中被分對的比例,衡量了分類器對惡意軟件的識別能力。

精度:表示被分為Android良性軟件中的實際為良性軟件的比例,是精確性的度量。

為了驗證本文提出的算法的有效性,分別與僅采用單一分類器:樸素貝葉斯、C4.5、感知機和SVM算法檢測方法進行了比較分析,并且采用不同方式提取權限特征表示應用樣本的情況,實驗結果如表所示。

表1 實驗結果
從表1中可以看出,1)和傳統(tǒng)的直接分析Manifest文件提取權限特征相比,本文提出的根據(jù)api調(diào)用來剔除沒有使用過的權限的權限特征提取方法訓練出來的分類器有更好的性能;2)同種特征值情況下,基于Stacking的集成方式相對于單分類器和其他兩種集成方法有更好的分類器性能。總的說來,更為精確的特征提取能帶來更好的訓練效果,基于Stacking集成分類算法的檢測精度也要優(yōu)于采用單一分類器的分類效果。
本文對現(xiàn)有的基于權限特征的惡意應用的檢測技術上進行了分析和改進,采用更加準確的特征提取方法,并設計基于Stacking的集成方式提高安卓程序檢測的性能,但是也存在著將合法應用判定為惡意應用的誤差,這是算法需要進一步改進的地方。未來工作中,可以從兩方面進行進一步研究:1)除了采用權限特征作為分類的特征輸入,還可以采用動態(tài)分析的方法獲取系統(tǒng)運行時的特征,如系統(tǒng)函數(shù)調(diào)用特征、文件讀寫操作特征、數(shù)據(jù)庫操作特征、網(wǎng)絡流量、電池消耗等,更豐富的特征將進一步提高檢測效果[13~16]。2)單一的分類算法不能充分發(fā)揮特征在惡意應用檢測時所做的貢獻,所以本文基于Stacking的集成方法中第一層分類器采用4種基分類器,未來我們可以嘗試添加更多不同的分類器,也可以嘗試使用深度學習來訓練分類器,更多的算法成果集成會有更好的結果。