吳 帆,陸濟湘,曹文靜
(武漢理工大學 理學院,武漢 430070)
2016年9月8日,諾基亞發布了《諾基亞威脅情報報告——2016上半年》[1].該報告顯示:2016年上半年感染惡意軟件的智能手機大幅增加,與2015年下半年相比,1~7月份感染惡意軟件的智能手機數量增長了近一倍.
目前市場流行的兩大惡意軟件檢測方法主要分為特征碼[2]檢測法和啟發式[3]檢測法.特征碼檢測需要不斷收集新的惡意軟件樣本MD5特征碼,然后建立MD5特征數據庫,最后通過比對數據庫中的特征碼來檢測惡意軟件.該技術被當前360、金山、騰訊等安全軟件開發商廣泛使用.這種方式輕便快捷,雖然能夠快速清除已知惡意軟件,但一旦遇到經過代碼混淆和加殼處理的惡意軟件時,檢測率便會大打折扣,因此該方法具有滯后性.啟發式檢測法通過獲取已出現的惡意行為的統計信息,然后建立分類模型,將未知應用程序的行為分類到已知的檢測類別中,以此來分析程序的惡意行為,該技術需要使用靜態分析[4]與動態分析[5].靜態分析無需運行代碼,速度快、輕量級,但無法處理經過代碼混淆和加密處理的應用程序.動態分析是在程序運行時收集程序的行為信息,需要在模擬器上運行,耗時且重量級,檢測過程復雜.迄今為止,針對啟發式掃描法采用什么樣的分類算法,提取什么樣的特征,如何提取,提取多少等問題還沒有一個完美的答案.本文的主要貢獻如下:
1)使用動、靜結合技術收集程序的函數調用和系統調用特征,避免了以往單靜態分析或單動態分析的局限性;
2)對于龐大的特征數據采用卡方統計處理,剔除對分類影響較小的數據,提高分類器的效率和檢測精度;
3)使用多種分類算法檢測不同特征,增強了不同特征對于不同算法的適應性.在檢測函數調用特征時,將屬性值按相同的比例映射到區間[0,1]上,這樣可以降低屬性間距離間參差不齊的影響.
一開始,Android以權限機制[6]為研究出發點.Android系統為了安全,設立“先申請權限再實現功能”模式,軟件開發者根據功能為程序申請相應權限.過去研究者通常先定義不能同時申請的權限集合[6],然后提取程序中清單文件中申請的權限,二者進行比對,以此來檢測具有潛在威脅的惡意程序.但Android權限存在粒度過粗等問題,因此權限分析存在不確定性.針對細化授權機制,研究者提出許多權限分組改進方案,彭凌[7]和Geneiatakis[8]等人利用Android權限隔離機制構建敏感行為集合.但在安卓安全問題中,權限機制只是一部分,需要與其他安全問題解決方案攜手共進.
權限機制面臨的問題主要表現在:
1)惡意軟件可以利用系統漏洞或提升權限等方法,突破最小特權法則[6],從而不申請敏感權限.從而導致權限檢測方法誤報率增高,可用性降低.
2)溢權問題,安卓機制很難發現程序申請過多權限,研究表明大約60%的程序具有溢權問題.
由此可見,傳統的權限分析已經不能滿足惡意軟件檢測的需要,需要結合靜態、動態分析技術才能做出更準確的檢測.
靜態分析[4]的優點是不需要運行程序,只需利用分析工具對程序安裝包(Android Package,APK)中的文件和代碼進行分析.通常將APK反編譯成Java源代碼和jar文件,然后對清單文件(AndroidManifest.xml)進行分析.靜態檢測技術主要分為數據流分析、控制流分析和語義分析.
國內外研究者秦中原[9]、Sato R[4]和Junaid[10]等人研究了惡意程序的靜態分析技術.和動態行為檢測相比,靜態分析無需運行代碼,也無需像動態分析那樣去改寫安卓系統源代碼,因此速度快、輕量級,具有檢測能耗低的優勢,風險也更低;缺點是無法真實模擬程序的功能,無法識別漏洞攻擊,也無法處理經過代碼混淆和加密處理的應用程序,因此容易產生誤報,準確率低.
動態分析[5]是在程序運行時收集程序的行為信息如:監測系統調用、網絡訪問、文件和內存修改等,因此不受靜態分析中代碼混淆技術的影響.早期將電池消耗作為檢測的主要依據,這樣缺乏惡意程序的行為模式.如今研究者以Linux研究為基礎,開始關注內核層的系統調用.監控系統調用雖然被認為是最準確的檢測方法之一,但底層信息的操作難度更大,隨后研究者開始采用API調用分析和信息流跟蹤等方法,以全面掌握程序運行時的數據信息.系統調用和上層API調用的流程如圖1所示:
系統調用屬于內核層,它能夠體現應用層和底層系統之間的交互特征,能夠收集程序在底層的執行信息,因此不易被干擾,結果準確.張曉璐[11]等人采用動態分析技術研究了惡意程序,動態分析的優點是無需分析代碼,只需觀察程序執行的狀態,因此克服了代碼混淆和加密等問題,檢測精度高;缺點是需要改寫系統源碼,需要在模擬器上運行,耗時且重量級,檢測過程復雜.加之,某些異常軟件在大部分情況下運行是正常狀態,一旦在某個時刻接收到由遠程網絡端發送的惡意指令后,便會將移動客戶端(手機或平板電腦上)的敏感信息發送出去,這樣就巧妙的逃過了動態行為監測.因此動態分析也需要結合靜態分析,將程序中隱藏的發送指令代碼塊識別出來.

圖1 API調用與系統調用關系Fig.1 Relationship between API call and system call
惡意軟件檢測的實質其實就是,首先分析已知惡意樣本獲取分類經驗,再利用這種經驗去檢測未知程序.如今研究者開始采用數據挖掘分類算法對程序的行為進行分類,最終實現對惡意、正常應用程序的分類.
靜態和動態行為特征是數據挖掘的起點,其中,靜態特征可以從反編譯Dalvik字節碼得到的結果中抽取,動態特征則憑借程序運行時的行為進行收集.楊歡[12]等采用權限頻繁模式挖掘算法檢測惡意程序,Shabtai A[13]等人使用動態方法獲取API函數調用特征,并自己編寫了少量惡意程序,然后使用分類算法對進行監測,但缺少現實中大量惡意應用程序作為樣本測試,樣本數量太少,誤報性較高,因此該方法只能算作輕量級的檢測方法.周曉[14]采用了K-means聚類算法識別同一惡意或正常應用程序改寫的代碼,該方法只限于檢測同一應用程序的變種,無法精確識別多種惡意程序.迄今為止,采用什么樣的分類算法,提取什么樣的特征是數據挖掘效果優良的至關因素,這些問題目前一直在不斷優化過程中,至今還沒有一個完美的答案.
由于靜態分析無法處理經過代碼混淆和加密處理的惡意程序,容易產生誤報準確率低;動態分析需要改寫系統源碼,需要運行程序,檢測過程耗時且復雜,所以單動態分析或單靜態分析都具有片面性,應該動靜結合分析,揚長避短.針對數據挖掘檢測技術,由于有些特征之間存在冗余,有些特征對分類的結果影響很小,如果不處理這些特征,會降低分類器的正確率,增加執行時間和誤報率,因此本文采用卡方統計處理這些特征;同時,考慮到不同特征對同一算法具有不同的適應性,如果用同一算法檢測不同特征,效果不一定全部最優,應該將特征分類檢測.
綜上所述,本文提出基于多類特征的混合算法,大致流程如下頁圖2所示.
特征提取之前需要創建正常和惡意程序庫,惡意程序庫的創建參考周婭瑾[15]等人使用的惡意應用,正常程序可以從Google Play上批量下載,然后再使用多種檢測軟件檢測以確保準確性.

圖2 檢測流程Fig.2 Testing process
3.2.1 函數調用特征的提取
首先使用Android工具包SDK(SoftBware Develop-ment Kit)中的工具AAPT對應用程序進行解壓,然后提取清單文件和lib庫文件(.so格式).接著使用NDK工具包中的readelf.exe工具可以提取ELF文件的函數調用序列,其中ELF文件由native代碼編譯后生成.本文對每個程序的lib文件夾下的系統共享庫:libc.so、liblog.so、libm.so、libstdc++.so文件進行合并,然后使用readelf命令工具提取動態符號表中保存的“Symblo Table”,在抽取的信息中選取“Func”.
3.2.2 系統調用特征的提取
首先在模擬器上運行程序,然后使用Android軟件開發工具包(SDK)中strace工具收集每個系統調用執行的次數,因為程序執行各種行為都會與系統調用交互;Linux內核中約有290個系統調用,只有部分系統調用能描述程序行為,為了減少計算量節省時間,同時為了提高準確性,本文提取15個系統調用,它們最能描述程序的行為,具體如表1.
表1 系統調用表
Table 1 System call table

arcess、chmod、chown、open、ioctl、brkread、write、clone、close、execve、sendto、sendmsg、revfrom、recvmsg最常用 access、chown、chmod
其中access、chown 、chmod可以用來篡改權限;最后將執行得到的系統調用數據組成一個向量.
對于分類算法而言,特征的選擇十分重要,選擇的結果直接影響分類結果.在文本特征選擇過程中的方法有卡方統計、互信息、期望交叉熵、信息增益、文檔頻率等,而在文本特征選擇中,卡方統計與信息增益效果相對較好.卡方統計可以表述特征項與類之間相關度,CHI值越高說明相關度越大.本文采用卡方統計處理特征,特征Xi在每個類別中的分布如表2所示.
特征Xi的卡方值計算公式:
表2 特征分類表
Table 2 Feature classification

特 征正 常惡 意總 數 Ximnm+n xixyx+y總數m+xn+yN
(1)
卡方值給出了特征Xi與Cj的關聯程度,某個特征的CHI卡方值越大,代表該特征越接近該判斷類別,當特征的卡方值CHI=0時,則代表該特征與類別相互獨立.
K-最近鄰(K-Nearest Neighbor,KNN)分類算法理論上比較成熟,該算法的總體思路為:在特征空間中,取某樣本的k個最相鄰樣本作為集合,若該集合中的大多數屬于某一類別,則該樣本也屬于這個類別.可以概括為:“近朱者赤,近墨者黑”.由于K-最近鄰方法主要憑借周圍K個鄰近的樣本,不是依賴判別類域來確定所屬類別,因此當待分樣本集中類域重疊較多時,使用KNN方法更佳適合.
本文用向量來表示程序運行蹤跡,向量維數m為函數調用總數.向量屬性值為對應的函數調用出現的次數,n個向量構成向量集合P=(p1+p2+…+pn)T,得到的函數調用向量中的每個特征屬性都是標量,相異度用向量之間的歐幾里德距離表示,則向量X與Y間的距離d(X,Y)為:
(2)
考慮到屬性值越大,對距離產生的影響越大,如此一來屬性間的距離分布太散,不能準確地顯示相異度,因此有必要對屬性值進行格式化處理,這樣可以降低屬性間距離間參差不齊的影響.現將所有屬性值按相同的比例映射到區間[0,1]上,映射公式為:
(3)

本文在WEKA環境下,使用K最近鄰算法取K=1進行試驗,判斷待測向量周圍最近的一個向量的類別.
通俗來講SVM是二類分類模型,本質是對線性可分的情況進行分析,對于線性不可分的情況,可以使用非線性映射算法(核函數)轉化為高維特征空問使其線性可分,如此一來我們就可以在高維特征空間中,采用線性算法對非線性特征的樣本進行線性分析.
SVM 中共有四種核函數可以選擇,但常用的是線性核函數、徑向基核函數(Radial Basis Function,RBF).線性核函數:K(x,y)=x·y,RBF核函數:K(x,y)=exp(-γ‖x-y‖2).
當面臨線性可分問題時,設樣本x是n維向量,即:xi∈Rn,用y表示樣本屬于正類別和負類別時的信息,則yi∈{-1,1},則k個樣本的訓練樣本集可以表示為:(xi,yi)∈Rn×{-1,1},其中i=1,2,…,k.SVM分類器的目標就是:在n維輸入空向上尋找一個多維空間中的超平面,正負兩類數據被該超平面分開,并使得超平面到它兩側最近數據的距離(邊緣)最大.
由于存在一些樣本不能被正確分類,因此需要為這些樣本引入松弛變量ζi與懲罰因子C,然后就可以在原函數上面加一個懲罰函數和限制條件,具體表示如下:
(4)
s.t.yi[wΤ·xi+b]≥1-ζi,i=1,2,…,k,ζi≥0
式中k為數目,C表示對分錯點加入多少懲罰的系數,該系數可以由用戶指定;xi為第i個樣本,yi為第i個樣本的類別,當xi被分在正確一邊時,ζi=0.我們可采用拉格朗日乘子法去解該優化問題,依據KTT條件引入拉格朗日乘子α,將對w和b求解的原問題,轉化為求解α的對偶問題,公式描述如下:
αi≥0,i=1,2,…,k
(5)
求解后得到線性分類函數:
(6)
式中s為支持向量數.當向量x屬性未知時,遍可采用該分類函數來判定其所屬類別.
同理可得,當輸入空間非線性可分時,使用滿足Mercer定理的核函數K(xi·xj)將n維輸入空間變換到更高維特征空間上,其對偶問題為:
(7)

0≤αi≤C,i=1,2,…,n
求得最終分類函數為:

本實驗的惡意樣本來源于AMGP(Android Malware- Genome Project),一共獲取1100個惡意樣本,主要分為49個家族;正常的應用程序可以從安卓市場下載.
表3 混淆矩陣
Table 3 Confusion matrix

檢測輸入正常惡意正常TPFN惡意FPTN
混淆矩陣(confusion matrix) 是分析分類器效果的一種實用工具.本文將正常程序定義為+,惡意應用定義為-.True positives( TP) 指分類器將正常程序正確檢測為正常程序的組;True negatives( TN) 指分類器將惡意程序正確檢測為惡意程序的組;False positives(FP) 指分類器將惡意程序錯誤檢測為正常程序的組;False negatiyes(FN) 指分類器將正常程序錯誤檢測為惡意程序的組.混淆矩陣如表3所示:
為了測試該檢測方法的效果,本文在WEAK平臺中采用十折交叉驗證,實驗結果取10次實驗的平均值.本文從準確率(Accuracy rate)、召回率(Recall rate)、FP rate、精度( Precision)、AUC(Area Under ROC Curve,ROC曲線下的面積)等四個指標進行評價.

圖3 函數調用分類效果Fig.3 Function call classification effect
函數調用特征分類結果如圖3所示,相比其他算法,KNN算法的AUC、準確率、召回率最高,FP rate最低,因此效果最好.
實驗的評價標準如表4.
表4 評價標準公式表
Table 4 Evaluation standard formula table

標 準公式正確率:Accuracy=(TP+TN)/(TP+TN+FN+FP)召回率:TPrate=Recallrate=TP/(TP+FN)FPrate:=FP/(FP+TN)Precision:=TP/(TP+FP)
系統調用特征分類結果如圖4所示,相比其他算法,SVM算法的AUC、準確率、召回率最高,FP rate最低,因此效果最好.

圖4 系統調用分類效果Fig.4 System call classification effect
上述實驗說明,傳統的單一算法檢測多類特征具有片面性,雖然KNN算法在函數調用檢測上優于SVM算法,但針對系統特征SVM卻優于KNN算法.
為了顯示本文檢測方法的有效性,接下來使用著名的Androguard工具,在相同的樣本集和實驗環境下進行對比實驗.Androguard是一款使用Python語言編寫的工具,對Android程序具有分析、檢測和評估等功能,應用廣泛.我們可以發現,當用Androguard工具處理大量應用程序時,無法完全自動化,耗時并存在少量程序不能正確處理,進程卡死停頓甚至退出等問題,測試結果對比如表5所示.
表5 測試結果對比表
Table 5 Test results comparison table

不能處理的app(個)準確率(%) 運行時間(h)本文:094.7645Androguard:2789.2163
對比結果表明:本文所提出的檢測方法在準確率和執行時間效率上高于Androguard,證明了該檢測方法的適用性.
本文提出了基于多類特征的混合檢測算法,在使用KNN算法在檢測函數調用特征時,為了降低屬性距離間參差不齊的影響,將屬性值按相同的比例映射到區間[0,1]上,與其他算法相比,SVM有很多優勢:
1)通常數據挖掘算法得到的是樣本數趨于無窮大時的最優解,而SVM算法得到的是小范圍樣本下的最優解,在本文情況下這種最優解更精確;
2)SVM算法可以將優化問題轉化成凸二次規劃問題,因此理論上可以得到唯一的全局最優解;
3)SVM算法可以通過核函數,巧妙地將原空間中復雜的線性不可分問題轉換到高維特征空間去解決.最后,本文用實例驗證了該檢測方法的可行性和有效性.
[1] Nokia Security Center Berlin.Nokia threat intelligence report[EB/OL].https://networks.nokia.com/products/malware-reports,2016.
[2] Li Y,Jin Z.An android malware detection method based on feature codes[C].International Conference on Mechatronics,Materials,Chemistry and Computer Engineering,2015:2690-2694.
[3] Wu S,Wang P,Li X,et al.Effective detection of android malware based on the usage of data flow APIs and machine learning[J].Information & Software Technology,2016,75(C):17-25.
[4] Sato R,Chiba D,Goto S.Detecting android malware by analyzing manifest files[C].Asia Pacific Advanced Network,2013:23-31.
[5] Mistry N,Padariya N.Review of behavior malware analysis for android[J].International Journal of Engineering and Innovative Technology,2013,2(7):230-232.
[6] Wu Ze-zhi,Chen Xing-yuan,Yang Zhi,et al.Optimal mining on android permission configuration[J].Journal of Chinese Computer Systems,2015,36(10):2354-2359.
[7] Peng Lin,Zeng Fan-ping,Yan Jun,et al.A method to detect implicit permission in android applications[J].Journal of Chinese Computer Systems,2016,37(3):515-519.
[8] Geneiatakis D,Fovino I N,Kounelis I,et al.A permission verification approach for android mobile applications[J].Computers & Security,2015,49(C):192-205.
[9] Qin Zhong-yuan,Xu Yu-qing,Liang Biao,et al.An android malware static detection method[J].Journal of Southeast University(Natural Science Edition),2013,43(6):1162-1167.
[10] Junaid M,Liu D,Kung D.Dexteroid:detecting malicious behaviors in Android apps using reverse engineered life cycle models[J].Computers & Security,2016,59(June 2016):92-117.
[11] Zhang X,Breitinger F,Baggili I Rapid android parser for investigating DEX files (RAPID)[J].Digital Investigation,2016,17(C):28-39.
[12] Yang Huan,Zhang Yu-qing,Hu Yu-pu,et al.A malware behavior detection system of android applications based on multi-class features[J].Chinese Journal of Computers,2014,37(1):15-27.
[13] Shabtai A,Kanonov U,Elovici Y,et al.Andromaly:a behavioral malware detection framework for android devices[J].Journal of Intelligent Information Systems,2012,38(1):161-190.
[14] Zhou Xiao.Friendly analysis on mobile network based on k-means[D].Nanjing:Nanjing University of Posts,2015.
[15] Zhou Y,Jiang X.Dissecting android malware:charact-erization and evolution[C].Institute of Electrical and Electronics Engineers Symposium on Security and Privacy,2012:95-109.
附中文參考文獻:
[6] 吳澤智,陳性元,楊 智,等.面向安卓的權限配置優化[J].小型微型計算機系統,2015,36(10):2354-2359.
[7] 彭 凌,曾凡平,嚴 俊,等.一種檢測Android應用程序隱式權限的方法[J].小型微型計算機系統,2016,37(3):515-519.
[9] 秦中元,徐毓青,梁 彪,等.一種Android平臺惡意軟件靜態檢測方法[J].東南大學學報(自然科學版),2013,43(6):1162-1167.
[12] 楊 歡,張玉清,胡予濮,等.基于多類特征Android應用惡意行為檢測系統[J].計算機學報,2014,37(1):15-27.
[14] 周 驍.基于K-means移動應用網絡友好性分析系統[D].南京:南京郵電大學,2015.