陳紅閔, 胡江村
(中南民族大學 電子信息工程學院, 武漢 430074)
在如火如荼的高科技時期, Android軟件的開發(fā)呈現(xiàn)了爆發(fā)式增長. 根據(jù)日前App Annie發(fā)布的《全球移動應用市場2016年回顧報告》顯示數(shù)據(jù)表明,2015年至2016年兩年全球應用下載量增長率為15%.可惜不幸的是, 這樣的受歡迎程度也會吸引惡意軟件開發(fā)者, 預置應用程序、捆綁下載、過度獲取權限、山寨應用等防不勝防. 惡意應用程序的盛行卻讓用戶的個人隱私逐漸走向透明, 在《2017Q1中國手機安全市場研究報告》[1]中提到, 89.6%的受訪用戶表示曾遭受過個人隱私信息泄露, 詐騙電話等, 如今信息安全成為很多用戶的心腹大患. 360、金山等是深受用戶喜愛的安全廠商也投入到移動安全領域, 而這些軟件進行殺毒基本原理是通過匹配已知的病毒木馬特征來確認入侵行為, 以防火墻、動態(tài)監(jiān)控等方式進行主動防御,但缺點是依賴病毒特征庫的更新, 學習新型病毒能力較弱[2,3]. 本文在前人的基礎上進行進一步研究, 提取不同的特征組合進行檢測. 首先, 通過反編譯提取權限和高危API, 經(jīng)過預處理組成權限——API特征集合, 利用機器學習分類算法進行檢測, 并與單獨特征集合進行分類的準確率進行比較, 得出相應的優(yōu)化檢測方案.并將服務器端的這一靜態(tài)檢測過程整合至開發(fā)的安卓惡意軟件檢測與防御系統(tǒng)中, 以向用戶返回靜態(tài)檢測報告的方式返回檢測結果.
Android是一個“權限分離”的系統(tǒng), 在開發(fā)App過程中, 要想使用Android系統(tǒng)受限資源, 需在Android.xml文件中申請相關資源的權限, 利用唯一字符串來分別表示每一資源的權限. 權限主要由以下組成: 權限的名稱; 屬于的權限組; 保護級別. 每個權限通過protectionLevel來標識保護級別: normal, dangerous,signature, signatureorsystem[4]. 使用該權限時就要根據(jù)不同的保護級別進行認證, 如normal的權限只要申請了就可以使用, 而dangerous權限需要用戶確認才能被使用. 在AndroidManifest.xml中會通過一些標簽如<permission>標簽, <permission-group>標簽<permission-tree>等標簽來指定package的權限信息.為此將所有應用程序的權限提取出來作為特征值, 具有一定的實際意義. 但是不同的App會申請不同的權限, 故使用頻率有一定的差異, 同時惡意軟件和良性軟件在申請權限上也互不相同, 因此將惡意軟件和正常軟件中所申請的權限全部提取出來, 根據(jù)使用次數(shù)分別提取惡意和良性軟件中排名前20的使用權限, 同時進行歸類, 組成相應的權限特征集.
應用程序通過簽名機制唯一區(qū)別APK文件, 這樣就解決了Android程序重名的問題, 因此開發(fā)者必須對開發(fā)的應用程序進行數(shù)字簽名, 通過簽名將應用程序作者和應用程序之間建立一種信任關系. 應用程序的簽名文件和證書兩者缺一不可, 當用戶在安裝應用程序的過程中, 首先會被系統(tǒng)的安裝程序檢查, 確定該應用程序是否被簽名, 未被簽名的應用程序, 系統(tǒng)安裝程序?qū)⒆柚乖搼贸绦虻陌惭b, 同樣的, 在應用程序需要升級時, 新版的應用程序也會被系統(tǒng)安裝程序檢查,確定其簽名與舊版本的應用程序簽名是否一致, 一致則更新, 不一致則被認為是新的應用程序來安裝, 同時也防止了被惡意軟件替換的風險. Android有jarsigner和signapk簽名兩種方式: jarsign對APK簽名, 因其是Java內(nèi)置的一個簽名工具, 所以通過jarsign簽名需要安裝JDK. 而signapk是為Android應用程序簽名專門開發(fā)的工具. jarsigner和signapk簽名的簽名算法大同小異. 通過上面的簽名后會生成一個META-INF文件夾, 這里有三個文件: MANIFEST.MF、CERT.RSA、CERT.SF[5].
惡意軟件分析和檢測技術可以分為三類: 靜態(tài)分析, 動態(tài)分析和混合方法. 靜態(tài)檢測利用相應的反編譯工具提取程序的靜態(tài)特征如語法語義、簽名等特性等進行分析, 評估軟件安全. 在動態(tài)分析技術中, 應用程序被部署在模擬器上或被控制的設備上進行模擬和監(jiān)控[6,7]. 而近年來國內(nèi)外很多學術研究人員及一些商業(yè)軟件公司已經(jīng)意識到傳統(tǒng)的基于簽名的靜態(tài)分析方法很容易受到攻擊, 也無法實現(xiàn)對未知惡意軟件的檢測.特別是, 常見的隱形技術, 例如加密技術, 代碼轉(zhuǎn)換, 以及環(huán)境意識的方法等都具有生成惡意軟件的能力[8]. 文獻[9]提出的基于特征碼的惡意代碼檢測方法利用特征值匹配技術進行檢測與國外著名的Androguard Android惡意代碼檢測工具一樣都是基于簽名的檢測方法, 但不能對未知惡意應用檢測. 在文獻[10]中作者對網(wǎng)絡行為、短信等進行監(jiān)控, 考慮到Android平臺實際資源需求, 一般單獨使用Monkey程序進行動態(tài)測試, 實用性不強. 在大數(shù)據(jù)時代, 數(shù)據(jù)挖掘技術越來越成熟, 云端處理能力越來越強, 很多研究者也將機器學習算法和巨大的惡意樣本量結合起來進行相應的研究[11–13]. Justin Sahs[14]利用 Androguard 提取 APK 包恃征, 利用分類器訓練這些特征來分類Android軟件. 王超[15]設計了基于機器學習算法的Android惡意軟件檢測系統(tǒng), 他將靜態(tài)、動態(tài)、客戶端和云端結合成一體,實行全方位的控制與監(jiān)聽檢測. 解決了Android系統(tǒng)在權限控制的缺點, 實現(xiàn)了細粒度的權限控制. 并通過實驗數(shù)據(jù)比較不同機器學習分類算法, 從而提高檢測效率. 徐欣等人[16]設計并實現(xiàn)了一個惡意軟件動態(tài)分析云平臺, 通過基于虛擬化沙箱機制來判斷目標軟件是否是惡意軟件, 但對網(wǎng)絡的實時性和并發(fā)性要求較高.
本文在邵舒迪等人[17]提出的基于權限和API特征結合的Android惡意軟件檢測方法基礎上進行相應的預處理過程及提取不同的特征集合, 同時運用不同的分類算法提高檢測準確率. 然后將相應的靜態(tài)檢測過程整合至開發(fā)的安卓惡意軟件檢測與防御系統(tǒng)中, 以惡意軟件檢測報告詳情方式返回給用戶, 供用戶知曉.
本文提出的Android惡意軟件檢測與防御系統(tǒng),將靜態(tài)檢測與動態(tài)監(jiān)控相結合, 實現(xiàn)在服務器端利用機器學習算法對已知正常和惡意軟件進行訓練學習,建立相應的分類模型, 對未知的惡意軟件進行靜態(tài)檢測, 并返回相應的靜態(tài)檢測報告. 客戶端通過對未知樣本進行掃描, 與已存在的病毒庫通過MD5值進行比對過濾, 同時通過監(jiān)聽廣播發(fā)送與接收實時監(jiān)聽軟件的行為信息, 并提供給用戶防御與處理措施. 用戶通過上傳本地的APK文件至服務器端進行靜態(tài)檢測, 該系統(tǒng)能有效地用于對已知未知應用的惡意性進行檢測. 整個系統(tǒng)檢測流程如圖1所示.
圖1 系統(tǒng)檢測框架
在權限特征提取階段, 采用靜態(tài)分析方法, 分別收集正常和惡意APK軟件作為訓練樣本庫, 利用Java編寫的解壓應用程序?qū)κ占臉颖具M行批量解壓, 利用Android自帶的aapt(aapt.exe在SDK的platformt o o l s目錄下)工具反編譯A P K同時獲取其AndroidManifest.xml文件中申請的權限信息, 將提取的權限進行格式化處理, 每個樣本抽象為1×(n+1)維向量, 其數(shù)據(jù)格式為其中packagname是應用程序的名稱, 是統(tǒng)計的Android應用程序申請的權限, 并將其存入Oracle數(shù)據(jù)庫中, 為了統(tǒng)計惡意樣本和正常樣本申請權限的使用情況, 分別將得到的權限信息在數(shù)據(jù)庫中存入兩張不同的表permissiondesc和permissiondescmal中, 并分別選擇將排名前20的權限提取出來, 通過程序抽象為1×20維向量該程序使用的權限標記為1, 未使用的則標記為0. 由于在此實驗過程中要引入weka數(shù)據(jù)挖掘工具, 其處理數(shù)據(jù)集格式為Arff格式的數(shù)據(jù), arff格式是weka專用的文件格式, 全稱Attribute-Relation File Format. 它是一個ASCII文本文件, 記錄了一些共享屬性的實例. arff格式文件主要由兩個部分構成, 頭部定義和數(shù)據(jù)區(qū). 頭部定義包含了關系名稱(relation name)、一些屬性(attributes)和對應的類型. 數(shù)據(jù)區(qū)以@data開頭, 故數(shù)據(jù)區(qū)一橫行就代表一個樣本實例, 豎行是作為屬性和變量. 遍歷樣本生成權限特征向量集如下所示:
如圖2和圖3所示, 是正常樣本和惡意軟件排名前20的權限, 對比其使用情況發(fā)現(xiàn), 兩者重合申請的權限比較多, 故將其進行組合生成1×23維共有特征向量生成權限數(shù)據(jù)特征集如表1所示,將其輸入weka中進行訓練. 在預處理模塊中選擇信息增益InfoGainAttributeEval特征選擇算法來衡量各權限在判斷惡意軟件上的貢獻值大小. 在信息增益中, 重要性的衡量標準就是看特征能夠為分類系統(tǒng)帶來多少信息, 帶來的信息越多, 該特征越重要. 即某權限特征的信息增益值越大, 即它為惡意值的貢獻越大. 設置一定的閾值, 選擇相應的特征重新進行訓練, 比較其實驗結果.
表1 權限數(shù)據(jù)特征
圖2 正常樣本權限統(tǒng)計直方圖
在高危API特征提取階段, 參照張銳[4]在其論文Android環(huán)境下惡意軟件靜態(tài)檢測方法研究中提出的通過逆向解析Android軟件安裝包, 獲取代碼級的41種高危API作為另一種檢測特征. 將得到的高危API特征存入數(shù)據(jù)庫dangerousapi表中, 在提取高危API特征時, 將獲取樣本的APK文件進行解壓得到文件如表2所示.
圖3 惡意樣本權限統(tǒng)計直方圖
表2 APK文件
classes.dex是java源碼編譯后生成的java字節(jié)碼文件, 在Dalvik虛擬機上執(zhí)行, 它包含了所有的源碼信息, 利用反編譯工具Baksmali解析APK的classes.dex文件, 即可獲得以smali為后綴的文件, 遍歷所有smali文件獲取每一APK高危API的使用次數(shù)生成特征空間向量. 根據(jù)Android官網(wǎng)提供的API信息及張銳[4]在其論文中統(tǒng)計的具備高危行為的41種API, 根據(jù)smali語法規(guī)則生成相對應的java函數(shù)形式,遍歷所有smali文件得到41種API使用次數(shù),每使用一次count++最后每一樣本便生成1×41維特征向量smali文件中方法的表現(xiàn)形式:Lpackage/name/ObjectName;->MethodName(III)Z Lpackage/name/ObjectName;表示類型, MethodName 是方法名. III為參數(shù)(在此是3個整型參數(shù)), Z是返回類型(bool型). 方法的參數(shù)是一個接一個的, 中間沒有隔開.
代碼實現(xiàn)如下所示:
將其轉(zhuǎn)為arff格式數(shù)據(jù)作為高危API數(shù)據(jù)特征集輸入Weka中進行訓練. 遍歷樣本得到API特征向量集如下所示:
由于單一權限和高危API信息能在一定程度上對惡意軟件進行檢測, 但是正確率不太高, 同時也存在一定的局限性, 所以考慮將其合并在一起作為統(tǒng)一特征集進行檢測, 然后對得到的特征集進行相應的預處理過程選出最優(yōu)特征子集, 提高分類器的正確率.
Weka自帶了許多機器學習算法, 它能夠用來進行模型的訓練和預測. 當使用這些算法來構建模型的時候, 我們需要一些指標來評估這些模型的性能, 為此定義一組相關指標從各方面衡量實驗效果. 針對一個二分類問題, 將實例分成正類(Postive)或者負類(Negative). 但是實際中分類時, 會出現(xiàn)4種情況:
(1) 真正類(True Positive, TP): 被模型預測為正類的正樣本.
(2) 假正類(False Positive, FP): 被模型預測為正類的負樣本.
(3) 假負類(False Negative, FN): 被模型預測為負類的正樣本.
(4) 真負類(True Negative, TN): 被模型預測為負類的負樣本.
1) 正確率(Accuracy)
正確率是我們最常見的評價指標, Accuracy =(TP+TN)/(P+N), 這個很容易理解, 就是被分對的樣本數(shù)除以所有的樣本數(shù), 通常來說, 正確率越高, 分類器越好.
2) 錯誤率(Error Rate)
錯誤率則與正確率相反, 描述被分類器錯分的比例, Error Rate = (FP+FN)/(P+N), 對某一個實例來說,分對與分錯是互斥事件, 所以 Accuracy =1 –Error_Rate.
3) 精度(Precision)
精度是精確性的度量, 表示被分為正例的示例中實際為正例的比例, Precision=TP/(TP+FP).
4) 召回率(Recall)
召回率是覆蓋面的度量, 度量有多個正例被分為正例, Recall=TP/(TP+FN)=TP/P=Sensitivity.
5) 靈敏度(Sensitivity)
靈敏度是將正樣本預測為正樣本的能力, Sensitivity=TP/(TP+FN), 可以看到召回率與靈敏度是一樣的.
6) 特異度(Specificity)
特異度是將負樣本預測為負樣本的能力, Specificity=TN/(TN+FP).
7) ROC曲線
ROC (Receiver Operating Charateristic): ROC的主要分析工具為畫在R O C空間的曲線, 橫軸為1–Specificity, 縱軸為 Sensitivity. 在分類問題中, 一個閥值對應于一個特異性及靈敏度, 一個好的分類模型要求ROC曲線盡可能靠近圖形的左上角.
8) AUC面積
AUC (Area Under roc Curve)值指處于ROC曲線下方的那部分面積大小, 一個理想的分類模型其AUC值為1, 通常其值在0.5至1.0之間, 較大的AUC代表了分類模型具備較好的性能[18].
本次實驗選取了552個正常樣本和475個惡意樣本作為實驗的樣本數(shù)據(jù)集, 為了避免數(shù)據(jù)的不均衡性,正常樣本分別從木螞蟻安卓市場(http://www.mumayi.com/)和安卓市場(http://apk.hiapk.com/)分類別通過自己編寫的爬蟲程序抓取, 包括影音、生活、社交、教育、購物等多個應用類別. 而475個惡意樣本則來自于https://virusshare.com/國外一個共性病毒庫網(wǎng)站上所收集的惡意軟件樣本集, 通過發(fā)郵件聯(lián)系管理員注冊接收邀請獲得樣本來源. 在分類算法的選擇上, 使用基礎分類器NB (NaiveBayes)、IBK (KNNN=1)、MP(MultilayerPerceptron)、J48、ZeroR五種分類器進行分類, 特征采用10折交叉檢驗來評估模型. 其中ZeroR分類器作為基分類器基準衡量其它分類器效果.
步驟1. 只選取權限特征集permission進行訓練,此時樣本數(shù)據(jù)為24×1027維向量, 其中23維為前文所述正常和惡意樣本的組合權限特征, 另一維為分類屬性, 1027為總樣本數(shù)量(后續(xù)實驗相同), 不經(jīng)過特征屬性選擇, 得到實驗結果如表3所示.
表3 五種分類算法檢測結果(permission)
步驟2. 對權限特征集進行特征屬性篩選(InfoGainAttributeEval Ranker -T 0.0 -N -1)得到權限優(yōu)化特征集permissionInfoGain, 此時數(shù)據(jù)集為17×1027向量, 其中16維為經(jīng)過信息增益算法得到各特征風險性評分篩選出的權限特征如圖4所示, 所得實驗結果如表4所示.
表4和表3實驗結果對比可知, 將權限特征集用信息增益選擇算法進行預處理之后, 雖然整體的正確率沒有明顯的改善, 但是ROC Area有明顯提高, 而分類器中ROC指標對分類器預測準確性具有重要意義,故對權限作預處理對分類效果改善具有促進作用.
圖4 權限特征信息增益結果
表4 五種分類算法檢測結果(permissionInfoGain)
步驟3. 對高危API特征集API41, 此時樣本數(shù)據(jù)為42×1027向量, 其中41維為前文所述的41種高危API, 1027為總樣本數(shù)量, 利用上述5種算法進行實驗,得到實驗結果如表5所示.
表5 五種分類算法檢測結果(API41)
步驟4. 將權限和API特征集permission-API組合至至一起進行實驗, 此時樣本數(shù)據(jù)為58×1027向量, 其中57維為16種權限和41種高危API的組合, 102為總樣本數(shù)量得到實驗結果如表6所示.
表6 五種分類算法檢測結果(permission-API)
據(jù)上述4張表的結果均可以看出, 選擇NB、IBK、MP、J48四種分類器效果均比基分類器ZeoR效果好, 說明上述實驗結果是有實際意義的. 同時將表3和表5的實驗結果與表6的實驗結果對比可以看出, 將權限和高危API進行聯(lián)合檢測比單獨使用權限(permission)特征和高危API特征進行檢測的模型有較高的檢測率和準確率. 故后續(xù)實驗過程中選擇經(jīng)過預處理的權限特征和API組合成整體特征集進行訓練具有實際意義.
為了評估本方案的有效性, 本文將提出的方法與近年來的相關工作進行對比, 魏理豪、艾解清等人[5]2016年提出了將Android權限、敏感API調(diào)用、MD5等特征進行分析處理, 共同協(xié)作完成對Android應用程序的安全檢測. 如表7所示是其實驗結果.
由表7結果與本方法中表6中所得到的實驗結果對比可知, 在所選取的分類算法大體相同的情況下, 本文選擇較少的特征得到較好的檢測準確率, 稍顯優(yōu)勢.
由于在weka中得到的ROC曲線圖不夠清晰而且無法導出, 因此通過result對象得到TP Rate和FP Rate數(shù)組, 利用SPSS軟件繪制了其ROC曲線圖. 圖5、圖6和圖7分別是根據(jù)上述實驗結果畫出的ROC曲線.
從上述ROC曲線圖中可以看出, 當選擇單獨權限和API特征時, IBK和J48分類器分類效果明顯好于其他兩類分類器, 而將兩特征結合起來時,Multilayer Perceptron分類效果優(yōu)于另外三種分類器.
圖6 permissionInfoGain ROC曲線
圖7 permission-API ROC曲線
當我們生活越來越依賴手機時, Android平臺安全問題也越來越受大眾關注. 而現(xiàn)有的安全防護軟件缺乏對未知惡意軟件的檢測, 故針對Android移動平臺惡意軟件進行快速有效的分析檢測成為當務之急, 本文提出的將權限和API特征結合起來對APK進行靜態(tài)檢測過程只是作為設計與開發(fā)的安卓惡意軟件防御與檢測系統(tǒng)中的一部分, 后續(xù)會將這部分功能嵌入至自己開發(fā)的系統(tǒng)中使其能實現(xiàn)完整的檢測與防御功能,使惡意行為能防患于未然. 但是本文提出的方案還存在一些待改進的地方: 如在特征集預處理過程中利用多種預處理算法選取子特征集后進然后比較各分類器的準確率, 樣本集數(shù)量不夠多也不夠均衡, 如果收集更多的樣本進行訓練可能會得到更好的分類效果. 后續(xù)將會在更大的樣本空間及提取不同的靜態(tài)特征上進行檢測研究, 提高分類器的檢測率及準確率.