【 摘 要 】 近年來,Android手機由于其出色的用戶體驗,吸引了大量的用戶,同時也因為它的開源特性,也極易受到惡意軟件的攻擊,其中本地惡意軟件尤為惡劣。論文針對Android平臺上本地惡意應用軟件,提出了基于代碼基本塊控制流比較的鑒別方法。通過代碼中基本塊的分離,控制流圖的構造及其信息的抽象比較,設計實現(xiàn)了一套Android平臺上本地代碼惡意應用鑒別系統(tǒng)。
【 關鍵詞 】 安卓;本地代碼;控制流圖
【 Abstract 】 In recent years, Android smart phone attracts many users owing to its brilliant user experience. Meanwhile, its vulnerable to malware because of its open-source characteristic, especially native code. A method was proposed to detect native malware based on the comparison of control flow graph of basic blocks. By the separation of basic blockscode, the construction of control flow graph and the comparison of the abstract of it, a detection system is designed and implemented that can identify native malware on Android platform.
【 Keywords 】 android; native code; control flow graph
1 引言
近年來,移動終端發(fā)展迅速,2011年,全球移動掌上設備數(shù)量達到了16億,單單蘋果系統(tǒng)和Android系統(tǒng)的用戶在2011年到2012年間就從3800萬漲到了8400萬。2013年初,Android系統(tǒng)的用戶的數(shù)量超越了包括蘋果、塞班和黑莓在內的多種系統(tǒng)的用戶數(shù)量。NetMarketShare網站2016年2月統(tǒng)計結果,Android系統(tǒng)占市場份額第一,為58.75%,iOS第二位為32.93%,而第三位的Windows Phone只有2.86%。
隨著智能手機的普及,手機病毒也隨之得到快速發(fā)展。McAfee的一份調查報告顯示,其實驗室2015年第一季度收集的手機病毒比2014年第四季度增長了13%,總共已經包含了4億個病毒樣本。而2015年第一季度出現(xiàn)的新型手機病毒比2014年第四季度增長了49%。 G DATA發(fā)布的《移動惡意軟件報告-2015年3季度》顯示,2015年第三季度發(fā)現(xiàn)惡意軟件574,706例,與2014年同期相比,發(fā)現(xiàn)的新型Android系統(tǒng)惡意軟件增長了50%。
而在各式各樣的惡意軟件之中,將惡意功能隱藏在本地代碼中的惡意軟件尤為惡劣。它的惡意功能由C/C++代碼實現(xiàn)并編譯成.so鏈接庫,無法像Java源碼一樣被還原分析,給識別帶來較大困難,所以某些不法人士對它青睞有加。目前惡意本地代碼這一領域是Android平臺應用安全一個不可忽視的環(huán)節(jié),對其的研究分析具有極大的挑戰(zhàn)性,有利于全面提高Android平臺應用的安全性。
2 研究現(xiàn)狀
目前主流的惡意軟件分析主要還是對Java代碼的研究分析,少有人真正去關注本地代碼級別的惡意軟件。而相對可行的鑒別本地代碼惡意軟件的方法是利用沙盒軟件,將目標APP放入其中運行,觀測其輸入輸出流有無可疑信息。但是這樣的方法對于計算機資源的消耗量比較大。文獻[5]提出了另外兩種試行方法,本地代碼隔離(Native Code Separation)和本地代碼權限管理(Managing Native Code Permissions),并且制作出了原型,但是并未公開,并且這種方法難度比較大。文獻[6]制作了將機器學習(Machine Learning)與傳統(tǒng)手段相結合的病毒檢測系統(tǒng),在面對大量樣本時,系統(tǒng)可以通過機器學習一定程度上自動識別新的病毒。實驗表明其病毒檢測成功率超過90%,但需要大量后臺資源的支持。
另一類有效的方法是利用基本塊控制流之間的異同進行檢測,對控制流分析的分析研究已經有較長的一段時間,其在計算機的各個領域內都有重要作用。但是,對高級語言的控制流分析已趨近成熟,而對于匯編語言的控制流分析尚在摸索之中。文獻[7]對不同類型的處理器的匯編指令進行了統(tǒng)一歸類,創(chuàng)造性地提出了一種能夠繪制匯編代碼子程序流程圖的通用算法,但其算法只能適用于單個基本塊的控制流構造,未涉及基本塊之間的控制流構造。文獻[8]彌補了文獻[7]的缺陷,為基本塊之間的控制流構造提供了有效的思路和方法,但是并未屏蔽匯編代碼中的數(shù)據(jù)部分,且控制流的構造過于繁瑣復雜,對于本項目目標來說不完全適用。文獻[9]利用其制作的gSpan系統(tǒng)進行代碼惡意行為的控制流圖形挖掘,然后通過比較其圖形來計算其相似性,不足之處是其系統(tǒng)是針對JavaScript,且并未給出具體實現(xiàn)方式。Cyber Security實驗中心的研究人員提出一種利用控制流圖優(yōu)化比較的方式來檢測惡意軟件,對于相同而多余的步驟合并之后生成控制流圖,收集惡意代碼控制流圖并與目標比較從而判斷其是否為惡意軟件,雖然其方法依然是針對Windows平臺的病毒,但對本系統(tǒng)來說有很相當大的借鑒意義。
本文結合以上方法,提出一種基本塊控制流散列函數(shù)用于安卓本地惡意代碼之間的比較,方便可用,高效便捷,并能有效的抵抗病毒的混淆攻擊。
3 鑒別系統(tǒng)流程
目前對于原生惡意代碼的研究很少,沒有開發(fā)出高效率的能有效針對原生惡意軟件的系統(tǒng)。盡管有些散落在各個角落里的走在行業(yè)前端的工程師已經在著手分析原生惡意代碼,但大多只是基于ARM匯編語言的對匯編代碼的靜態(tài)分析,效率較低,不具普適性。一旦出現(xiàn)新的惡意軟件,又要重新進行代碼分析。現(xiàn)在常用的監(jiān)測方式是基于沙盒(Sandbox)的動態(tài)監(jiān)測方式,將目標APP置于沙盒之中模擬其運行環(huán)境,同時觀測記錄其輸入輸出信息,配合一定的靜態(tài)分析,得到目標的函數(shù)調用列表,數(shù)據(jù)流向和行為信息。這是一種有效而廣泛的監(jiān)測方式。但是唯一的缺點是需要消耗大量的計算機資源,還需要對相關的知識有相當?shù)睦斫庖约耙欢ǖ木幊趟?。相較于以上兩種檢測手段,本文提出基于基本塊控制流比較的本地惡意代碼鑒別系統(tǒng)的實現(xiàn)方法,如圖1所示。
鑒別體系首先將目標APK反編譯,得到其中本地代碼鏈接庫,再利用此鏈接庫反編譯之后得到的.gdl文件提取基本塊控制流信息,之后將提取出的信息與病毒庫中已存的病毒控制流信息相對比來判斷其是否是一個惡意軟件。
3.1 本地代碼鏈接庫
Android NDK全稱是Android Native Development Kit,Android程序是運行在Dalvik虛擬機中的,而NDK則使得用戶能夠使用C/C++原生代碼執(zhí)行部分程序功能。隨著Android行業(yè)的發(fā)展,對Android程序安全性的要求越來越高,而Android中的Java層代碼很容易被反編譯并破解分析,NDK中提供的C/C++代碼則相反,極難反編譯。目前大部分的開源庫也是使用C/C++代碼編寫,使用NDK調用這些第三方庫能夠較少程序員自身的負擔并且方便移植共享。
由C/C++編寫的程序在Android NDK提供的交叉編譯工具鏈中的gcc編譯器編譯之后,就變成了.so文件。.so文件是Linux下的共享函數(shù)庫,對應于Windows下的.dll文件,它存在于APK反編譯文件夾下的LIB文件夾中,根據(jù)處理器型號的不同又會存放在不同的子文件夾下。本病毒檢測系統(tǒng)重點關注的就是此.so文件。
3.2 控制流圖
本系統(tǒng)的病毒檢測主要是依靠基本塊以及由基本塊生成的控制流圖。
基本塊(Basic Block)是一段線性代碼序列,除了入口和出口以外不含任何的分支??刂屏鲝幕緣K的開始處進入,從其出口離開,控制流在其內不會停滯亦不會出現(xiàn)分支,直到離開本基本塊?;緣K的劃分規(guī)則為:2條相鄰的指令若在同一基本塊中,當期僅當前一條指令被執(zhí)行后,后一條指令才會被執(zhí)行。
控制流圖(Control Flow Graph,CFG)是基于基本塊而畫出的表示程序流動向的有向圖,每個函數(shù)的控制流圖只有一個入口,但可以有多個出口。如圖2所示,圖中每個圓圈代表一個基本塊,箭頭則表示控制流的變化方向。
下一個任務就是將.so文件中所包含的各個函數(shù)的CFG信息抽象出來成為一個集合,作為其基本塊信息,并進一步連接操作碼序列以實現(xiàn)基本塊信息的壓縮存儲。收集多種病毒的基本塊信息之后存儲在本地作為病毒庫,在面對未知APK時則將其中的.so文件進行同樣的操作,然后與病毒庫中包含惡意功能的樣本進行對比,在相似率達到預設閾值時即可認為其也包含惡意功能。
3.3 構建塊控制流圖并生成塊信息
整個流程的關鍵是如何生成函數(shù)的CFG以及如何抽象其中的結點信息。ida pro這個工具直接提供了函數(shù)CFG生成的方法。圖3是ida中的匯編源碼及其生成的CFG。
利用IDA自帶的IDC腳本語言將函數(shù)CFG保存在本地,再用文本格式打開發(fā)現(xiàn)其中包含了此圖中所有的結點構造信息和匯編級代碼:
將基本塊中每條操作碼的前三位提取出來集合作為這個基本塊的抽象信息。ARM匯編語言中大多出操作碼為三位,少部分操作條件復雜的為五位,以及幾個跳轉操作為一位或者兩位。若單純的提取操作碼會冗余出許多不必要的信息,而將截取的位數(shù)降低過多,操作碼的區(qū)分度將大幅度降低。取三位也能很好的將需要特別關注的跳轉指令與數(shù)據(jù)操作指令區(qū)分開。
3.4 判別檢測
對于一個未知APK,使用Apktool工具對其進行反編譯,在LIB文件下可以找到對應的目標.so文件。將IDAPro打開,導入libnative.so。在這里使用自己編寫的IDC小腳本導出此實例內所有函數(shù)的CFG,之后會在so文件同一目錄下生成所有函數(shù)的.gdl文件。
接下使用基本塊信息提取程序對這些CFG文件進行操作。得到一個sample.txt,其中內容如圖5所示。每一行都是一個基本塊的抽象信息。接著使用基本塊信息比較程序比較目標樣本和病毒庫中樣本。比較算法采用的是字符串匹配算法,對于每一條基本塊信息,遍歷病毒比較樣本中所有基本塊信息,直到找到相同的為止。記錄下有相同基本塊信息的基本塊數(shù),最后與基本塊總數(shù)相除得到該樣本與病毒庫中特定樣本的相似度。
4 實驗結果
實驗采用AndroidMalShare官網49個家族共1260個惡意病毒樣本,其中8個家族大范圍使用了本地代碼作為惡意功能的載體。統(tǒng)計結果如表1:
在這8個家族之中,DroidDream是AnserverBot和BaseBridge的升級版,他們使用的本地代碼完全一致。同樣,KungFu家族4個版本的本地代碼也幾乎完全一樣。于是,基于本地代碼惡意功能即可簡單分為三類:DroidDream、KungFu和zHash。表2是幾個樣本的對比結果。
對于相似值(Similarity-a, Similarity-b),定義如下:
Similarity-a = 目標樣本與病毒基本塊控制流信息相似條數(shù)/目標樣本基本塊控制流信息條數(shù)*100%;
Similarity-b = 目標樣本與病毒基本塊控制流信息相似條數(shù)/病毒基本塊控制流信息條數(shù)*100%;
因此每個樣本與每個病毒相互之間有一對數(shù)據(jù)。
假設病毒中的代碼功能為集合v,目標樣本功能為集合t:
(1)若t=v,那么Similarity-a=Similarity-b=100%;
(2)若v∈t,那么Similarity-a
(3)若t∈v,那么Similarity-b 綜上所述,?。⊿imilarity-a,Similarity-b)中的Similarity-b作為判斷目標樣本是否為病毒的數(shù)值依據(jù)。由此,表2可以簡化為表3。 可以看到,Sample1與KungFu家族病毒樣本有極高的相似性,顯然是KungFu病毒家族的一員。而余下樣本與三種家族的病毒相似率均不高,并不是病毒。事實是,Sample1正是在AndroidMalShare官網所下載的KungFu病毒的一種,而余下病毒則是在Android應用官網首頁上下載的幾個普通APP。實驗證明病毒檢測系統(tǒng)運行良好。 5 結束語 本文提出的Android本地惡意代碼檢測系統(tǒng),基于匯編級代碼基本塊控制流的抽象散列函數(shù)的比較。抽取了基本塊控制流的基本特征,忽略了函數(shù)內部數(shù)據(jù)定義運算細節(jié),能夠有效對抗病毒代碼的混淆等一系列抗檢測手段。作為輕量型病毒檢測系統(tǒng),可提高企業(yè)或組織內的病毒檢測的效率。 參考文獻 [1] Market Share Statistics for Internet Technologies.http://www.netmarketshare.com/. [2] McAfee Labs Threats Report,May 2015.http://www.mcafee.com/us/resources/reports/rp-quarterly-threat-q1-2015.pdf. [3] G DATA移動惡意軟件報告-2015年3季度.https://www.gdata-china.com/news/article/article/mobile20160219. [4] 豐生強.Android軟件安全與逆向分析[M].北京:人民郵電出版社,2015. [5] Mengtao Sun,Gang Tan.NativeGuard: protecting android applications from third-party native libraries.WiSec '14: Proceedings of the 2014 ACM conference on Security and privacy in wireless & mobile networks.July,2014.165-176. [6] Zhenlong Yuan,Yongqiang Lu,Yibo Xue.Droiddetector: android malware characterization and detection using deep learning.Tsinghua Science and Technology,2016,21(1):114-123. [7] 周博,蔣烈輝,費勤福.匯編子程序流程圖繪制算法研究[J].計算機應用與軟件,2007,24(1):160-171. [8] 竇增杰,王震宇,陳楠,王瑞敏,田佳.基于可執(zhí)行代碼中間表示的控制流分析[J].軟件技術與數(shù)據(jù)庫,2010,36(21):31-36. [9] Chang Choi,Xuefeng Piao,Junho Choi,Mungyu Lee,Pankoo Kim,Malicious behavior pattern mining using control flow graph.RACS Proceedings of the 2015 Conference on research in adaptive and convergent systems.October,2015.119-122. [10] S. S. Anju,P. Harmya,Noopa Jagadeesh,R. Darsana.Malware detection using assembly code and control flow graph optimization.A2CWiC '10: Proceedings of the 1st Amrita ACM-W Celebration on Women in Computing in India.September 2010.Article No.65. [11] AndroidMalShare, http://andromalshare.androidmalware.org:8080/#home. [12] Rafael Fedler,Marcel Kulicke,Julian Schütte.Natice Code Execution Control for Attack Mitigation on Android.SPSM '13: Proceedings of the Third ACM workshop on Security and privacy in smartphones & mobile devices.November,2013,15-20. 基金項目: 江蘇省大學生科技創(chuàng)新訓練計劃(stitp)資助(項目編號:SZD2015008)。 作者簡介: 廖元之(1995-),男,江蘇南京人,南京郵電大學,本科在讀生;主要研究方向和關注領域:Android平臺病毒防治。