劉 倩 韓 斌
(江蘇科技大學計算機學院 鎮江 212000)
目前Android已經成為使用最廣泛的開源操作系統。Android 系統的快速發展也使得各種Android 應用迅速增長。雖然目前國內有大量的手機應用商店存在,但是這些應用商店的惡意應用檢測機制并不完善。根據2017 上半年移動安全報告顯示,惡意應用總體數量超過1000萬,并預測17年全年將接近2000 萬[1]。惡意應用已經成為當下主流的安全威脅之一。因此,對惡意應用檢測進行研究是一項迫切而有意義的工作。
目前Android平臺的惡意應用檢測方法主要分為靜態檢測[2]和動態檢測[3]。動態檢測是在軟件運行時,通過監聽、攔截等方式來監控應用程序的一些行為特征,并通過模式識別等技術對這些行為特征進行分析以判斷該應用的安全性。靜態檢測是不運行軟件,通過逆向工程技術,抽取權限信息之類的軟件自身特征以判斷軟件是否有惡意性。隨著相關技術的研究發展,以權限為基礎的靜態檢測方法成為了惡意應用檢測的重要方法之一。當前國內外已經出現了不少惡意應用檢測的方法。Enck[4]等提出了一個輕量級的基于權限和事先定義的安全策略的應用安全認證系統Kirin,通過提取程序所申請的權限,并利用已知具有惡意權限組合去匹配以鑒定應用的安全性。Zhou Y[5]等提出了Droid Ranger 系統,通過基于啟發式方法以及基于權限的足跡跟蹤法來識別未知惡意應用。Liang S[6]等提出了一種基于權限的惡意應用檢測方法,通過挖掘出在惡意軟件中經常使用而在正常應用中很少出現的頻繁權限,并建立起權限間的規則來進行惡意應用檢測。Xiangyu-Ju[7]等提出了一種通過分析安裝包和權限實現對Android 惡意應用的靜態檢測的方法;Huang C Y[8]等提出將AdaBoost,SVM 和Naive Bayes 相結合的機器學習算法用到惡意應用檢測上。Sanz B[9]提出一種通過基于權限制造多個分類器并運用數據挖掘算法來檢測惡意應用的方法。
以上方法雖然從不同方面對應用程序的權限進行了分析,但是可能會出現這樣一種情況,某一類應用申請某個權限是不正常的,但是另外一類應用申請這個權限就是正常的,如果把它們當成一類應用進行惡意判斷的話,就可能出現把正常的應用判斷成惡意應用的情況。因為某個特定類別的應用程序所要實現的功能行為相似,而權限在一定程度上反映了這些行為,所以每類應用所要訪問的權限也應該類似。于是,本文就針對以上問題提出了一種基于應用分類和敏感權限的惡意應用檢測方法,在對一個應用程序進行惡意判定之前,首先要對通過SMO 算法對該應用程序進行正確分類,然后通過計算該應用程序的敏感值,并與該類別應用程序的敏感閾值進行比較,以判斷是否為惡意應用。實驗結果表明了該方法的可行性和有效性,在對應用分類的基礎上再進行惡意軟件判定,提高了惡意應用檢測的效率。
權限機制是Android 安全機制的核心[10],開發者按照Android 系統的要求在AndroidManifest.xml配置文件中聲明軟件在運行中所需用到的一系列權限信息,當用戶安要裝軟件時,須接受所有的權限才能完成安裝,以該方式來達到限制危險的或者應用訪問聲明外的系統資源的目的。Android 官網上共有135 種權限信息,其中每一種權限就對應一種系統資源[11]。通常,若一個應用沒有申請訪問任何資源,那么該應用是構不成對用戶的威脅。所以,每個應用所申請的權限可以在一定程度上有效地反應其行為與功能。
總體檢測流程是:當檢測應用程序時,首選要先利用權限提取算法,將每個樣本使用權限的情況變成一個0,1 向量的形式。根據不同應用程序使用權限情況的不同將其進行分類并計算出應用的敏感值,然后與該應用所屬的類別的敏感閾值進行比較。如果大于該值,就認為待測應用中出現的敏感權限與該類別應用程序應該存在的敏感權限情況不符,會造成威脅,是惡意應用。若小于該值,則認為它使用的權限是符合該類別應用程序所使用的敏感權限的情況,是正常應用。惡意應用檢測流程圖如1所示。

圖1 惡意應用檢測流程圖
SMO 算法是基于SVM 算法改進而來的[12]。它是一種解決SVM 訓練過程中產生的優化問題的算法,該算法對于稀疏矩陣來說有更好的分類性能[13]。Android 系統權限共有135 種,但是每個應用并不會申請所有的權限,只會申請其中的幾個或者十幾個,這樣每個應用的權限分布相對于系統權限來說就相當于一個稀疏矩陣。所以采用SMO 算法進行應用分類。
SMO 算法分類思想是用一個二值的SVM 分類器來依次區分每一類與其他所有的類,第k 個SVM分類器把第k 類中的訓練樣本作為正的訓練樣本,而剩下的樣本全部作為負的訓練樣本,這樣k 個類別的樣本就構造出了k個SVM 分類器,這樣分類時具有最大分類函數值的那類就是未知樣本的所屬類別。利用SMO 算法進行應用分類,首先要通過訓練數據集,得到分類模型。訓練數據集是由每一個應用程序的權限使用情況與該應用所屬應用程序的類別構成的。假設統計了K 個應用程序,這樣每個應用程序的權限情況可以記錄為Ni(P1,P2,…P135),其中Ni(1 ≤i≤k)代表應用程序的名字,P1-135代表Android 系統中按英文字母順序排列而成的135個系統權限。訓練數據集可以表示為(Ni,Cj),其中Cj(1 ≤j≤24)代表應用程序的類別,共有24個應用程序類別。SMO 算法會對訓練數據集中的類別兩兩比較,然后對訓練集中應用的權限和類別進行學習,從而得到判定應用程序類別的函數關系式。本文使用Weka 的SMO 算法對數據集訓練建立分類模型。Weka是基于Java環境下的一款融合了機器學習以及數據挖掘的開源軟件[14],然后利用分類模型確定待檢測應用程序的所屬類別。
3.3.1 提取敏感權限特征集
當判斷一個應用是否是惡意的可以通過查看該應用是否申請了一些不必要的權限信息來進行判斷。所以提取出的敏感權限可以在一定程度上反映應用的一些惡意行為。
首先要提取出敏感權限,要采集一定量的惡意應用和正常應用樣本,然后使用APKTool工具對每個Android 應用的APK 進行反編譯,得到Android-Manifest.xml 配置文件。接著通過對配置文件進行分析,提取出權限信息,以構建權限特征集合。最后通過信息增益[15]與皮爾孫相關系數[16]相結合的組合預處理算法對權限特征進行提取得到最優權限特征集合。然后,提取這些最優權限特征,形成敏感權限特征集合,敏感權限的具體說明如表1 所示。

表1 敏感權限列表
3.3.2 類別敏感權限的頻繁模式挖掘
通過將每一類的應用程序的權限使用情況與敏感權限列表進行比對,得出每個類別下的每個應用程序都有哪些敏感權限。然后通過對每個應用程序的敏感權限使用情況進行頻繁模式挖掘算法[17]得出每一類別應用程序的最大頻繁敏感權限項集。這里用到的Apriori 算法是建立在敏感權限這一概念基礎上的。Apriori 算法就是為了挖掘出每一類應用的敏感權限的頻繁項集,即挖掘出每一類應用所申請的敏感權限之間的關聯性,以構建敏感權限關系特征庫。連接和剪枝是Apriori 算法的兩個主要性質,同也是產生頻繁項集的兩個主要步驟[18]。產生最大頻繁類別敏感權限項集數據庫的偽代碼描述如下:
輸入:Di:24 個類別的應用程序的敏感權限特征數據庫,i=1,2,…k,…24,min_support:最小支持度的閾值;
輸出:Database:最大頻繁類別敏感權限項集數據庫;for(i=1;i≤24;i++)
Ak=max_sensitive_permissions_gen(Di,min_support);addAktoDatabase;
procedure max_sensitive_permissions_gen(D,min_support);
A1=find_freq_1_items(D);//找出D 中所有的頻繁1-項集
for(k=2;Ak-1≠φ;k++){CK=Apriori_gen(Ak-1)//產生候選集并進行剪枝
for each sensitive_permission sequences∈D{
for each candidatec∈Cs//得到s的子集
c.count++;}
Ak={c∈Cs|c.count≥min_support}}returnAk;
通過Apriori算法得到24個類別應用的敏感權限的最大頻繁項集[19],即知道了每一類應用的敏感權限使用情況。
3.3.3 類別敏感閾值與應用敏感值的計算
通過Apriori算法得到24 類應用的敏感權限使用的情況后,可以計算出相應的頻率與權值,從而得到每一類應用的敏感閾值。

F(Pi,Cj)表示敏感權限Pi在第j 個類別中出現的頻率,其中,Pi表示每一個類別中的第i 個敏感權限,Cj表示第j 個類別;其中,o(Pi,Cj)代表每一個類別中的第i 個敏感權限在第j 個類別的應用中出現的次數,N代表該類應用的數目,j=1,…,24;接下來計算應用中的敏感權限Pi在第j個類別中的權重值。

這里的敏感權限的使用率越高,則表示該類其他應用使用該敏感權限的安全性就越大。由式(1)也可以看出每個敏感權限的使用頻率和其權重值呈反比,即權重值會隨著敏感權限使用頻率的增大而減小。再去計算各類中每個應用的敏感閾值:

其中,1 ≤k≤N,M(Cjk)代表第j 個類別中的第k 個應用的應用敏感值,1 ≤k≤N,再根據上述的公式,求出第j個類別中的所有應用的敏感閾值然后再取平均,其計算公式為

由于考慮到算出的每個應用的敏感值在求平均數時可能存在最大值比較大的情況,這樣就會超過平均值波動范圍的,導致最后計算的類別敏感閾值不準確,所以定義一個平均值的上下波動的范圍,即算出的平均類別敏感閾值和最小的應用敏感值的差,所以最后的類別敏感閾值H(Cj)計算公式(5)為

當有應用需要檢測是否為惡意,可通過式(3)計算出該應用的敏感值,并與該類應用的敏感閾值比較,若該應用的敏感閾值大于該類應用的敏感閾值,則認為該應用是惡意的。
本文從谷歌商店下載了不同類別的應用程序,這些應用都是按照評分和熱度最高的優先下載,一共收集了1236 個應用程序作為訓練數據集。收集的各類別應用數目如圖2所示。

圖2 各個類別的應用程序數目
實驗中選用了Naive Bayes,J48,SMO,JRip 以及IBK 五種算法對應用進行分類,選出分類效果最好的分類算法用于應用程序分類。五種算法分類結果的比較如圖3所示。

圖3 五種算法分類結果比較
從圖6 中可以看出,SMO 算法的Precision、Re-call,F-measure 和ROC Area 的值均高于其他四個分類算法,因此本文選用SMO 算法對應用進行分類。然后利用Weka 的SMO 算法進行十折交叉驗證,即將正常樣本數據集分成十份,依次將其中的9份作為訓練數據,另外的1份作為測試數據,進行試驗。本文只顯示部分類別應用的分類結果,如表2所示。

表2 部分類別應用的分類結果
從表2可以看出,使用SMO算法進行應用分類時,各個類別的Precision、F-Measure、ROC Area 都較高,說明SMO 算法的整體分類性能較好。F-Measure 與ROC Area(又稱為AUC),是衡量分類器的評價標準[20]。這兩個標準都是越大越好,1 為理想狀態。
對每一類別的應用利用式(5)計算出每一個類別的敏感閾值。部分不同類別應用程序的類別敏感閾值,如表3所示。

表3 部分類別應用的類別敏感閾值
待測的應用樣本集包括惡意樣本和正常樣本,其中惡意樣本是從之前在virusshare.com 上下載好的1000個惡意應用中提取100個惡意樣本,正常樣本是從之前在谷歌商店里下載好的1236 個正常應用里提取50 個正常樣本。部分應用的檢測結果如表4所示。

表4 部分應用程序檢測結果
從表4 可以看出每個應用的敏感值若超過了其所在類別的敏感閾值,將會被判定為惡意應用。這次檢測過程中100 個惡意樣本中有92 個被檢測為惡意應用,正常樣本100個中有91個被檢測為正常應用,本文惡意應用檢測結果如表5所示。

表5 惡意應用檢測結果
從表5 可以看出本文方法的精確率較高,F-Measure 與ROC Area 值的也較大,文獻[9]中的Sanz B 等未將應用按照類別進行分類,只是基于權限的情況來進行惡意應用檢測,實驗結果表明本文的方法較Sanz B等的方法而言準確率更高,更有利于惡意應用檢測。
一個應用被正確分類后再進行惡意應用檢測的準確率會大大提高,但若一個應用被錯誤的分類就可能會影響最后的惡意應用檢測結果。例如,表4 中的Spirly-Live Wallpaper.apk,按谷歌商店的分類應劃分為個性化類,該類別敏感閾值為2.95,但若把Spirly-Live Wallpaper.apk 判定為社交或者是通訊類,這兩類的類別敏感閾值分別為3.24 和3.53,而Spirly-Live Wallpaper.apk 的應用敏感值為3.21,Spirly-Live Wallpaper.apk 就會被判定為正常應用從而造成誤判。又例如:表6 所示為一個正常應用cn.j.hers610.apk,按照谷歌商店的分類應歸為社交類。但是若將其看作是新聞雜志類或是圖書與工具書類,計算其應用敏感值,發現該應用敏感值要大于這兩類的敏感閾值,會被判為惡意應用,也造成了誤判。

表6 cn.j.hers610.apk在不同類別中的檢測結果
因此,應用正確分類是惡意應用檢測中的重要環節,也是判斷應用是否為惡意的重要依據。
本文提出了一種基于應用分類和敏感權限的惡意應用檢測方法。通過建立不同類別應用的樣本集,并在分類的基礎上對應用進行敏感權限分析。首先,對采集的正常樣本數據集利用SMO 算法進行訓練得到分類模型,同時對這些數據集進行頻繁模式挖掘得到每一類應用的敏感權限項集,并根據每個敏感權限在該類別中的使用情況,可計算得出該類別的敏感閾值。在對一個應用程序進行惡意判定之前,要先通過SMO 算法對該應用進行正確分類,然后將該應用的權限使用情況與敏感權限列表比對,得出該應用的敏感權限使用情況,就可以計算出該應用的敏感值,并與該應用所屬類別的敏感閾值進行比較,以判斷其是否為惡意應用。實驗結果表明了該方法是可行且有效的,提高了惡意應用檢測的效率。