?

一種基于本地代碼特征的Android惡意代碼檢測方法

2018-06-15 01:17
信息安全研究 2018年6期
關鍵詞:控制流字節代碼

何 平 胡 勇

(四川大學電子信息學院 成都 610065) (721247751@qq.com)

智能手機給人們的生活帶來巨大的變化,各種重要信息和業務由手機存儲和處理,使得手機越來越重要,也成為不法分子攻擊的目標.從2010年發現首個Android木馬程序以來,Android下的惡意軟件數量急速增長,給用戶的數據安全帶來難以預測的風險.根據360互聯網安全實驗室發布的報告,僅在2017年第3季度,Android手機的新增惡意軟件數就高達188萬個,平均每天有大約2萬新的Android惡意軟件出現.增長較快的Android惡意代碼主要是資源消耗、惡意扣費和隱私竊取等類型,最近甚至出現了鎖屏和加密等勒索類型的惡意應用.面對如此嚴重的威脅,檢測Android惡意代碼已成為信息安全領域的一個重要研究方向.

1 研究現狀

近年來,各國專家學者提出了多種檢測Android惡意代碼的方法,主要分為靜態分析和動態分析兩大類.

靜態分析是指不運行程序僅對Android應用及其解析生成的文件進行分析的方法.靜態分析的對象主要包括AndroidManifest.xml文件、Java源代碼、Dalvik字節碼和本地代碼,利用從這些文件或代碼中提取出的權限特征、文本特征以及API調用特征等來識別應用是否包含惡意代碼.靜態分析具有快速、高效的優點,但對經過代碼混淆和多態變形后的惡意代碼不太適用,需要做更多的工作.

動態分析是一種基于應用程序運行時行為的檢測技術,通常需要修改Android系統,以監控該應用對網絡、系統調用、文件和內存的訪問,信息的訪問模式及其處理行為等.通過分析這些行為是否正常來判斷其惡意性.動態分析的優點是不受代碼混淆和加密的影響,但需耗費系統資源,對分析人員的技術能力要求也較高,不利于對大規模的應用進行檢測.

從Android應用所包含的代碼中提取相應特征進行惡意代碼檢測,已經有較多的方法和研究.李寅等人[1]將DEX文件反編譯,并分析其Dalvik字節碼中調用的系統函數.通過對每個系統函數分配不同的風險等級,統計整個應用中各系統函數出現的頻次,計算其加權平均值,以其值是否超過閾值判斷這個應用是否是惡意應用.李挺等人[2]通過提取Dalvik指令序列,然后以Smali代碼中的方法為單位將指令序列進行形式化描述,并采用MOSS算法、閔可夫斯基距離以及編輯距離算法計算形式化描述后的代碼與已知惡意特征的相似度,并根據相似度比對結果判斷待測應用是否含有惡意代碼.Kang等人[3]則提出了一種通過分析Dalvik字節碼頻率來對惡意代碼進行檢測的方法.陳鐵明等人[4]從Dalvik字節碼序列中提取N-Gram特征,然后利用隨機森林對惡意代碼進行檢測和分類.李自清[5]提出了一種利用函數調用圖來檢測Android惡意代碼的方法,通過反編譯DEX文件提取出函數調用圖,然后計算出函數調用圖的特征向量,利用得到的特征向量進行惡意代碼的檢測.

上述方法都是從DEX文件中提取Dalvik字節碼的特征進行惡意代碼檢測,主要利用了Dalvik字節碼的文本特征、API調用特征和函數調用圖的特征,然后通過相似度比較或者機器學習的方法對惡意代碼進行檢測,以上方法并沒有提取SO文件包含的本地代碼的相關特征.同時有研究[6]表明現在86%的Android常用應用都包含本地代碼.如果惡意應用將其惡意代碼放入SO文件的本地代碼中,上述靜態檢測手段無法取得較好的檢測結果.

針對上述方法沒有提取SO文件包含的本地代碼特征的問題,本文提出一種基于本地代碼特征的Android惡意代碼靜態檢測方法,將待檢測應用的DEX文件和SO文件轉化為ARM匯編代碼,并提取匯編代碼的控制流圖集合,將其與已知惡意應用的控制流圖集合進行相似性比較,得出它們的相似度.如果相似度大于某個閾值,則可以確定待檢測的Android應用包含了惡意代碼.由于提取了SO文件中包含的代碼的特征,該方法的代碼覆蓋率比傳統的靜態檢測方法高.

2 方法描述

本文提出一種基于本地代碼特征的Android惡意代碼檢測方法,該方法通過提取Android應用的本地代碼的控制流圖特征來檢測和分析惡意代碼,流程如圖1所示:

圖1 檢測方法的流程

2.1 ART虛擬機

Android應用程序包含的代碼通常分為DEX字節碼和預編譯的本地二進制代碼,應用通常運行在Dalvik虛擬機上.Dalvik虛擬機采用和標準的JVM相同的實時編譯方法(JIT)來編譯程序,也就是在應用運行時進行編譯.

從Android4.4開始,Google使用ART(Android runtime)替換了Dalvik虛擬機.ART使用的是提前編譯方法(AOT),即在應用安裝時進行編譯.ART提高了應用的運行效率,并且減少了電量消耗,但是增加了應用的安裝時間和占用的空間.ART將DEX文件中的Dalvik字節碼編譯生成一個后綴.oat的文件,該文件包含了Dalvik字節碼對應的本地代碼.如圖2所示,利用ART的這一功能將Dalvik字節碼轉換成本地代碼.

圖2 DEX文件生成本地代碼

2.2 反匯編

將本地代碼轉化為匯編代碼,需要進行反匯編.常用的反匯編算法有2種:線性掃描算法和遞歸遍歷算法.線性掃描算法就是從第1個字節開始依次進行指令的反匯編,直到最后1個字節.該方法的優點是代碼覆蓋全面,但是如果代碼中混合有數據,該方法不能有效區分代碼和數據,會產生錯誤的反匯編結果.使用線性掃描方式的反匯編工具有Windbg,objdump等.第2種方法是遞歸遍歷算法,以程序的控制流作為參考,只有一條指令被另一條指令引用,才會將這條指令反匯編.其優點是能夠有效區分數據和代碼,但是如果一個分支的目的地址不能靜態確定,就可能無法找到并反匯編有效的指令,結合其他方法來進行反匯編處理可以達到很好的效果.IDA Pro使用了遞歸遍歷算法進行反匯編,比使用線性掃描的反匯編器有更好的反匯編效果.根據需求,本文選擇遞歸遍歷算法進行本地代碼的反匯編處理和程序控制流圖的生成.

2.3 控制流圖匹配

程序的控制流圖可以用來進行源碼的相似性比較[7-8],本文將其應用在惡意代碼的檢測中.將DEX文件通過ART Compiler生成的本地代碼和SO文件包含的本地代碼反匯編生成ARM匯編代碼,再以函數為單位轉化為控制流圖,并利用相應的模式對控制流圖進行注釋,生成經過注釋的控制流圖集合,然后與惡意代碼樣本的控制流圖集合進行相似性比較.

2.3.1子圖同構算法

子圖同構算法用于確定一個控制流圖是否包含另一個控制流圖,或者被另一個控制流圖包含.Garey等人[9]提出子圖同構問題是NP完全問題,通常生成的程序控制流圖是稀疏圖,能在可接受的時間內計算出結果.常用的子圖匹配算法有Ullmann算法[10]和VF2算法[11],在算法的時間復雜度上VF2算法要優于Ullmann算法.

本文采用VF2算法來實現程序控制流圖的子圖同構計算.VF2的基本思想如下:

若圖G1=(V1,E1)與圖G2=(V2,E2)同構,其中V1,V2表示圖G1,G2的節點集合,E1,E2表示邊的集合,則G1與G2必定存在映射M={(m,n)∈V1×V2},其中,m為圖G1的節點,n為圖G2的節點.

該算法用狀態空間表達式(SSR)來表示確定映射函數的步驟.其中M(s)是M的子集,其中s表示每個狀態.用狀態s到狀態s′的轉移來表示1對新的匹配的節點加入到當前的狀態空間表達式.初始狀態為s0,則M(s0)=?.對于每個中間狀態s,算法會計算出可加入當前狀態的候選節點對的集合P(s).對于P(s)中的每個節點對,通過判斷是否滿足可行性規則F(s,n,m),若F(s,n,m)為真,則將節點對加入到M(s),從狀態s轉移到新的狀態s′,然后重復上述步驟.圖3展示了2個匹配的控制流圖,其中虛線表示匹配成功的部分.

圖3 2個子圖同構的控制流圖

2.3.2模式匹配

當一個節點數較少的控制流圖(如只有3個節點)與其他控制流圖作子圖同構匹配時,如果不考慮節點的屬性即節點中包含匯編語句,則會產生錯誤的匹配結果,例如子圖匹配成功的某些節點中的匯編語句不同,所以僅根據子圖匹配的結果無法準確判斷2個控制流圖是否匹配.有2種方法可以解決這個問題:

1) 比較控制流圖中已匹配的各個節點中的每條ARM匯編語句;

2) 以指令和操作數類型為控制流圖節點的每條語句分配對應的模式,然后對控制流圖的節點進行模式匹配.

由于ARM匯編有眾多的指令和不同的操作數,方法1)會耗費大量時間,所以我們使用方法2)按指令類型和操作數類型定義了18種模式,在反編譯生成ARM匯編代碼和控制流圖時注釋其中的匯編語句.該方法不僅能解決節點數較少時控制流圖的子圖同構問題,而且可以提高子圖同構的計算效率,這18種模式如表1所示(操作數類型為空表示不以操作數的類型區分模式):

表1 命令分類與18種模式

在生成控制流圖時,使用這些模式對各個節點模塊中的語句進行注釋,生成帶注釋的控制流圖.圖4為一個經過模式注釋的控制流圖.

在進行子圖匹配時,2個控制流圖已匹配的每個節點中對應的模式也必須完全匹配,才表示2個控制流圖匹配成功.

圖4 模式注釋生成的控制流圖

2.3.3惡意代碼相似性識別

利用上文所述的方法,為匯編程序的每一個函數都生成帶有注釋的控制流圖,這樣就得到了一個Android應用的控制流圖的集合.將這個集合作為Android應用的特征與惡意代碼樣本生成的特征作匹配.如果一個應用的控制流圖的集合中有一定比例的控制流圖和惡意代碼樣本的控制流圖匹配,則可以判斷這個應用包含惡意代碼.

定義待檢測應用A與樣本應用B的相似度SimilarityA,B,其計算公式如下:

(1)

NumofCFGSetB表示應用B中控制流圖的總數,NumofCFGSets表示應用A與應用B匹配的控制流圖總數.如果一個待檢測應用與惡意代碼樣本庫中的某個應用的相似度SimilarityA,B大于某個閾值,則認為這個應用包含惡意代碼.

3 實驗分析

本文使用Android ART提供的Compiler將Dalvik字節碼轉換為本地代碼,使用IDA Pro和編程進行反匯編,最后通過編程實現控制流圖的注釋和匹配.

實驗所采用的Android惡意代碼樣本來自Drebin項目[12],正常樣本來源于Google Play隨機下載.實驗從所有惡意代碼應用樣本中隨機選擇70個組成惡意代碼樣本庫,使用前文描述的方法得到每個樣本的控制流圖集合.然后再從剩余的惡意樣本中隨機選取100個與從正常樣本中隨機選取的200個組成測試樣本集SampleSet1,使用同樣方法組成測試樣本集SampleSet2.處理2個測試樣本集生成每個樣本的控制流圖集合,然后取不同的閾值對SampleSet1進行檢測.圖5顯示了在取不同的閾值(threshold)時,惡意代碼的檢測率TPR以及誤報率FPR.

檢測率TPR定義為正確檢測出的惡意應用的個數與總的惡意應用的個數的比值,檢測率的計算公式如下:

(2)

其中,TP為被正確檢測出的惡意應用的個數,FN為被錯誤地判斷成正常應用的惡意應用的個數.誤報率FPR定義為被誤報為惡意應用的正常應用的個數與正常應用的總數的比值.誤報率的計算公式如下:

(3)

其中,FP表示被錯誤地判斷為惡意應用的正常應用的個數,TN表示被正確檢測出的正常軟件的個數.準確率Accuracy的計算公式如下:

(4)

對圖5進行分析,雖然閾值為20%時,檢測的檢測率達到98%,但同時誤報率高達33%.隨著閾值的增加,發現檢測率和誤報率都呈現下降的趨勢,綜合考慮檢測率和誤報率,采用60%作為本文實驗的閾值.

圖5 SampleSet1檢測結果分析

利用該閾值對測試樣本集SampleSet2進行檢測,其檢測結果如表2所示.

表2 SampleSet2的檢測結果

根據式(2)~(4),計算得到該方法對于測試樣本集SampleSet2的檢測率為92%、誤報率為5%、準確率為94%.實驗結果表明,利用本文提出的方法能有效地檢測Android應用中是否包含已知的惡意代碼,其惡意代碼檢測率能達到90%以上.

使用靜態分析工具Androguard對樣本集SampleSet2進行檢測,將其檢測結果與本文方法的檢測結果作比較.其對比結果如表3所示:

表3 與Androguard的對比結果

使用表3中的檢測結果,計算出Androguard工具在檢測樣本集SampleSet2時的檢測率為67%,誤報率為3%,準確率為87%.可以看出本文方法的檢測率和準確率都要明顯優于Androguard工具,而誤報率也在可接受的范圍內.

4 結 語

本文提出一種基于本地代碼特征的Android惡意代碼檢測方法,該方法將Android中的Dalvik字節碼通過ART提供的Compiler編譯為ARM本地代碼,與SO文件一起進行反匯編生成的ARM匯編代碼和控制流圖,同時根據指令和操作碼的類型定義了18種模式來對控制流圖進行注釋處理,最后以控制流圖為特征利用子圖匹配和模式匹配來進行惡意性檢測.與現有方法相比較,該方法覆蓋了應用中的本地代碼,比現有方法的代碼覆蓋率高,而且提取的是匯編級的特征,能有效應對Java層的代碼混淆.經過實驗驗證,上述方法能夠成功檢測出應用是否包含已知惡意代碼,并且相對于Androguard有更高的檢測率和準確率.

在下一步工作中,需要結合Android應用程序的其他特征,并且利用數據挖掘和機器學習相關方法,進一步提高檢測的準確率,此外還可研究對加固惡意應用的檢測.

[1]李寅, 范明鈺, 王光衛. 基于反編譯的Android平臺惡意代碼靜態分析[J]. 計算機系統應用, 2012, 21(11): 187-189

[2]李挺, 董航, 袁春陽, 等. 基于Dalvik指令的Android惡意代碼特征描述及驗證[J]. 計算機研究與發展, 2014, 51(7): 1458-1466

[3]Kang B, Kang B J, Kim J, et al. Android malware classification method: Dalvik bytecode frequency analysis[C]Research in Adaptive and Convergent Systems. New York: ACM, 2013: 349-350

[4]陳鐵明, 楊益敏, 陳波. Maldetect:基于Dalvik指令抽象的Android惡意代碼檢測系統[J]. 計算機研究與發展, 2016, 53(10): 2299-2306

[5]李自清. 基于函數調用圖的Android惡意代碼檢測方法研究[J]. 計算機測量與控制, 2017, 25(10): 198-201

[6]Sun M, Tan G. NativeGuard: Protecting Android applications from third-party native libraries[C]Proc of the 2014 ACM Conf on Security and Privacy in Wireless & Mobile Networks. New York: ACM, 2014: 165-176

[7]陳新. 基于程序控制流圖源代碼相似程度分析系統[J]. 計算機系統應用, 2013, 22(3): 144-147

[8]呂博然, 吳軍華. 基于路徑序列相似度判別的程序克隆檢測方法[J].計算機工程與應用, 2018, 54(2): 55-61

[9]Garey M R, Johnson D S. Computers and Intractability: A Guide to the Theory of NP-Completeness[M]. San Francisco: W H Freeman, 1983: 208-209

[10]Ullmann J R. An algorithm for subgraph isomorphism[J]. Journal of the ACM, 1976, 23(1): 31-42

[11]Cordella L P, Foggia P, Sansone C, et al. A (sub)graph isomorphism algorithm for matching large graphs[J]. IEEE Trans on Pattern Analysis & Machine Intelligence, 2004, 26(10): 1367-1372

[12]Arp D, Spreitzenbarth M, Hübner M, et al. DREBIN: Effective and explainable detection of Android malware in your pocket[C]Proc of Network and Distributed System Security Symposium. Reston: Internet Society, 2014

猜你喜歡
控制流字節代碼
No.8 字節跳動將推出獨立出口電商APP
抵御控制流分析的Python 程序混淆算法
基于返回地址簽名的控制流攻擊檢測方法
基于控制流的盒圖動態建模與測試
No.10 “字節跳動手機”要來了?
基于MSP430的四旋翼飛行器的S-BUS通信協議的設計與實現
創世代碼
創世代碼
創世代碼
創世代碼
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合