吳俊昌,羅圣美,巫 妍,程紹銀,蔣 凡
(1.中國科學技術大學信息安全測評中心,安徽合肥230027;2.中興通訊,江蘇南京210012)
近年來,移動互聯網迅猛發(fā)展,對智能終端的需求也在與日劇增。根據Gartner提供的數據,智能終端數量在2011年第三季度已達1.49億[1],并且在今年其總量已經超過個人電腦的數量[2]。Google Android[3]已經成為移動終端[4~6]最主流的操作系統,其市場占有率為52.5%[1],已經超過其他智能終端系統占有率的總和。
豐富的智能終端應用程序也是智能終端流行的一大原因。為了便于應用程序開發(fā)者發(fā)布應用程序和用戶下載安裝應用程序,出現了很多應用程序商店,其中最著名的兩個應用程序商店為Google的Android Play[7]和蘋果的App Store[8]。同時還存在諸多第三方應用程序商店,比如機鋒市場等。相比較蘋果應用程序的管理,Android的應用程序就顯得十分混亂,這也導致Android系統上的惡意應用程序頻發(fā),讓用戶能夠放心安全地使用應用程序成為亟待解決的問題。
PiOS[9]使用程序切片的技術檢測iOS上應用程序中的隱私泄漏問題,該方法只針對隱私泄漏問題,沒有涉及其他惡意行為。SCanDroid[10]對Android應用程序的源碼和Android Manifest文件進行分析,生成應用程序的證書,以此來描述應用程序權限的使用情況,但是在一般情況下很難得到應用程序的源碼,對于只有二進制代碼的應用程序不適用。Enck W等人[11]實現了Dalvik字節(jié)碼反匯編工具ded,將字節(jié)碼轉換為源碼,通過現有的Java源碼分析工具,分析應用程序中存在的安全問題,該方法需要兩次代碼轉換,轉換過程會導致信息丟失,不利于應用程序的安全性分析。Droid-MOSS[12]計算應用程序模糊散列值,與官方的應用程序比較,檢測在第三方應用商店上被重新打包的應用程序,并沒有檢測應用程序是否為惡意的,對重新打包的應用程序沒有分析其是否增加了惡意行為。與上述方法相比,本文方法不需要應用程序的源碼,直接通過對應用程序字節(jié)碼指令進行模擬執(zhí)行,構建出函數的摘要,在函數摘要上使用污點傳播算法,分析出存在惡意行為的路徑。
針對使用Android系統提供的內部機制所開發(fā)的惡意應用程序,本文提出一種基于程序分析的方法,對未知的應用程序進行惡意行為檢測,進而分析應用程序的安全性。通過對應用程序在不同粒度上的模擬執(zhí)行,對應用程序進行分析。在指令級別上的模擬執(zhí)行計算函數摘要,針對不同的函數設計原子函數摘要和組合函數摘要來滿足分析需要。在函數級別上的模擬執(zhí)行進行應用程序的惡意行為檢測,通過惡意行為檢測完成對應用程序的安全性評估。
Android系統為了簡化應用程序的開發(fā)以及各種軟硬件資源和權限的管理,設計了很多的機制,例如廣播與監(jiān)聽機制、服務機制等等。從開發(fā)和管理的角度上說,這些機制的確使開發(fā)和管理變得簡單;但是,從用戶安全的角度上說,這些機制卻將使用應用程序的用戶暴露于極大的安全隱患之中。
在Android系統中存在各種各樣的廣播,比如電池的使用狀態(tài)的改變、電話的接聽和短信的接收都會產生一個廣播,應用程序開發(fā)者可以監(jiān)聽這些廣播并做出相應的處理。應用程序在安裝時便會向Android系統注冊所使用的廣播監(jiān)聽器,Android系統接收到廣播時便通知注冊了該廣播的應用程序執(zhí)行相應的廣播監(jiān)聽器。
惡意應用開發(fā)者可以在開發(fā)的應用程序中注冊比較常用的廣播監(jiān)聽器,比如電話和短信的廣播,當監(jiān)聽到Android系統發(fā)送這類廣播時,就可以在廣播處理事件中做一些有害于用戶的行為,例如獲取用戶的通訊錄信息,并通過網絡發(fā)送出去。使用這種方法的應用程序的惡意行為比較隱蔽,只有在監(jiān)聽到特定廣播才會觸發(fā),而此時已對用戶造成了損失。
服務是不可見的,主要是在后臺運行。服務機制一般用于支持比較耗時或者長時間運行的操作。服務分為兩種:本地服務和遠程服務。本地服務一般用于應用程序內部一些耗時的任務,比如查詢升級信息等,并不占用應用程序比如Activity[13]所屬線程,而是單開線程后臺執(zhí)行。遠程服務一般是用于Android系統內部的應用程序之間的,可以被其他應用程序復用,比如天氣預報服務,其他應用程序不需要再寫這樣的服務,直接調用已有的即可。相比于本地服務,遠程服務更具危險性。
服務可以提供很多方式供惡意應用程序開發(fā)者開發(fā)惡意應用。例如,一個惡意應用程序在運行時并不需要任何與外界交互的權限,比如發(fā)送短信或訪問網絡的權限,而只要通過一個具有以上權限的服務,就可以將非法收集到的用戶隱私信息發(fā)送出去。
在Android系統中主要存在三種本地代碼:shell命令、本地庫文件(.SO)以及字節(jié)碼文件(.JAR和.DEX)。Android系統為shell命令提供了exec接口;為將本地庫加載到當前應用程序內存中提供了load和load Library兩個接口,本地庫文件可以使用NDK(Native Development Kit)[14]開發(fā);為字節(jié)碼的使用提供了DexClassLoader[15]類來處理字節(jié)碼文件的執(zhí)行。
本地代碼的執(zhí)行具有極大的靈活性,且方式多樣。應用程序開發(fā)者可以在發(fā)布應用程序時,不將存在惡意代碼的文件放入安裝文件中,而是在用戶使用時再將這些代碼文件從網絡上下載,這加大了對應用程序進行檢測分析的難度。
針對上述Android系統提供的機制存在的安全問題,本文給出了一種惡意行為的檢測方法。本方法不需要安裝應用程序,直接在PC上對應用程序的字節(jié)碼文件進行靜態(tài)分析,主要包括如下四個步驟:程序結構恢復、函數調用圖重構、函數摘要構建以及惡意行為檢測,如圖1所示。程序結構恢復是在內存中對當前應用程序中類的結構的恢復,恢復的結構信息主要包括類的繼承關系、類中的屬性以及類中的方法等;函數調用圖重構是針對Android系統以消息為驅動方式以及使用面向對象的Java編程語言設計的,完成函數調用的唯一性確定以及控件消息處理事件的調用,重構出近似于函數運行時的調用圖;函數摘要構建是結合恢復的程序結構和重構的函數調用圖,對函數中字節(jié)碼指令進行模擬執(zhí)行,求解出函數的輸入與輸出之間的語義邏輯關系;惡意行為檢測通過在已計算出的函數摘要信息上使用靜態(tài)污點傳播算法,檢測函數調用路徑上的惡意行為。
Figure 1 Analysis detecting method圖1 分析檢測方法
Android應用程序主要使用Java語言開發(fā)。Java是一種面向對象的語言,存在大量的類和對象。但是,與一般的Java程序相比,Android應用程序不存在主入口函數main,例如存在界面的Android應用程序的主入口函數一般是一個Activity組件的onCreate函數,該信息可以從Android Manifest.xml文件中獲取。Android Manifest.xml文件中定義了本應用程序需使用的Activity組件、Service組件、Receiver組件以及所需要的權限列表等。這些組件的啟動函數都可以作為分析的入口。
在Android系統中,應用程序的運行是以消息為驅動的。在對應用程序進行分析檢測的時候,對于應用程序分析過程中存在消息響應的控件,在該控件對象生成時,就對該控件的消息處理事件進行分析。因為大部分的事件是與用戶交互形成的,而這些控件對象初始化之后,就已經具備了完成相應消息處理事件所必須的信息。
Android應用程序一般是用Java語言開發(fā)的,存在著大量的類和對象。在對函數進行分析的過程中,需要確定被調用函數以及屬性的歸屬,這些都需要程序結構的支撐。
結構的恢復需要依賴應用程序安裝包中的.DEX文件。對該文件進行反匯編,目前已有很多可以使用的Dalvik字節(jié)碼的反匯編工具,例如baksmali[16]、IDA Pro[17]等,本文使用功能強大的IDA Pro作為反匯編工具。不需人工參與,通過編寫自動化的python腳本,可以從反匯編的結果中獲取所有類的屬性列表、函數列表以及所有函數的字節(jié)碼信息,并在內存中恢復這些程序結構。
類中的方法和屬性的恢復是通過對方法名和屬性名進行解析完成的。IDA Pro對方法名和屬性名反匯編出的命名是規(guī)則的。方法名一般格式為:包名$類名$內部類名.函數名@返回值及形參列表類型。返回值及形參列表的類型一般用一個字母表示一種類型,例如void用V表示。屬性名一般格式為:包名$類名$類部類名_屬性名。根據這些命名規(guī)則,可以解析出方法和屬性的類名,再根據解析出的類名將這些方法和屬性劃分到各自原本的類中。
默認情況下,所有類的父類為Object類,而構建類的繼承關系,主要是構建類直接繼承過來的父類。直接繼承的父類需要通過分析特定的指令獲取,Dalvik字節(jié)碼中有兩個指令(INVOKE_SUPER和INVOKE_SUPER_RANGE)指定調用父類中同名的函數,從而可以分析出該函數所在類的父類。Dalvik字節(jié)碼指令是通過INVOKE_XXX指令進行函數調用的,可以根據這類指令信息構建出整個應用程序的函數調用圖。
Android系統中存在組件的生命周期、消息的驅動以及類的繼承等,使得“程序結構恢復”階段構建函數時得出的函數調用圖不完整或存在錯誤,因此必須進行修復和重構。
Android應用程序由Activity、Service以及Receiver等組件組成,這些組件是Android應用程序所特有的,每個組件各有一個完整的生命周期,不同組件的生命周期差別很大,在整個生命周期使用的函數都是由系統進行調用的,它們在函數調用圖中是沒有前驅節(jié)點的,在系統實際運行中遵循一定的調用順序,該調用順序可以從Android應用程序開發(fā)文檔中獲取。以Activity[13]為例,如圖2a所示,一個Activity組件啟動時,調用該Activity的onCreate函數初始化一些Activity的基本數據;調用onStart后一個Activity即可顯示;on Resume和onPause分別是繼續(xù)和暫停當前Activity;onStop是停止當前Activity,此時Activity已不再顯示;最后使用onDestroy銷毀一個Activity。從Activity的生命周期可以分析出,Activity的函數執(zhí)行序列一般是onCreate、onStart、onPause、on Resume、onStop、on Destroy,如圖2b所示。所以可以重新構建出Activity生命周期在運行時的函數調用圖。
Figure 2 Reconstruction of function calls in Activity圖2 Activity中的函數調用重構
Android應用程序存在大量的控件,例如按鈕、輸入框等??丶氖录幚砗瘮凳怯葾ndroid系統確定調用的,在對應用程序進行分析的過程中需要適當地調用這些函數。例如,按鈕控件有個點擊事件,即onClick事件,當用戶點擊按鈕時才會觸發(fā),而在靜態(tài)分析過程中不存在與用戶的交互,可以根據前述方法,將點擊事件處理函數在按鈕初始化。
函數摘要是對函數的一種抽象解釋。Android應用程序中存在類的繼承、接口的實現等面向對象編程特征,基于這些特征可以將函數的摘要分為兩類,即原子函數摘要和組合函數摘要。
定義1 原子函數摘要:所摘要的函數不存在子函數調用,或者雖然存在子函數調用,但這些子函數調用都是可以唯一確定的。
定義2 組合函數摘要:所摘要的函數存在子函數調用,且至少有一個子函數調用在該函數體內不能唯一確定。
函數摘要構建是在指令級別上對函數體中的指令進行模擬執(zhí)行的過程。算法1是函數摘要構建的算法,語句5~8處理函數調用指令,從重構的函數調用圖call Grpah中獲取被調函數function信息,并在局部參數local Variables中查找該被調函數的實參,存放到實參列表arguments中,最后將實參列表arguments和被調函數function信息保存到函數摘要summary,即在函數摘要中構建一條函數調用信息(下稱函數調用點);語句9~14處理函數間的調用關系,將被調函數對形參fun-Parameters的影響傳遞給主調函數中的實參arguments;語句15~16處理函數返回指令(包括拋出異常的指令),合并所有影響形參值的變量信息,將結果保存到形參中;語句17~19處理既不是函數返回指令又不是函數調用指令的指令,對這種指令根據Dalvik字節(jié)碼的語義進行模擬,并更新相應局部變量的狀態(tài)。例如,指令new-instance v6,〈t:Sms〉是新建一個Sms對象,將該對象放入v6中。在模擬執(zhí)行過程中,則會構建一個與Sms相對應的對象保存Sms的信息。
算法1 函數摘要構建算法
Android應用程序沒有像Java應用程序存在一個統一的入口函數main,在對存在多個組件的Android應用程序進行分析時會帶來不便。為了解決這個問題,在對應用程序進行分析之前,對應用程序先構建一個虛擬的main函數,將每個組件按其生命周期構建函數的執(zhí)行序列,同一個組件共享同一個this對象。
惡意行為檢測是建立在已經構建好的函數摘要基礎上的。從上述虛擬main函數開始,在計算的函數摘要上進行函數級別上的模擬執(zhí)行,在執(zhí)行過程中組合摘要中的占位函數需要結合已恢復的程序結構和函數調用時所傳入的this對象來確定。
在檢測過程中,需要用到源函數模式庫和危險函數模式庫,以及惡意行為模式庫,這些模式庫都是來源于人工分析的經驗積累。源函數模式庫包含引入污染數據的函數,這可以是訪問手機中的隱私數據,比如用戶的通訊錄等,也可以是啟動手機的某個功能模塊,比如地理位置定位系統等。危險函數模式庫包含可以與外界交互的函數,例如訪問網絡、發(fā)送短信等。惡意行為模式庫包含源函數與危險函數相結合后所產生的危害行為模式,例如啟動地理位置定位系統與發(fā)送短信結合,則可能屬于遠程控制設備的行為。
檢測惡意行為的步驟主要如下:
(1)設置分析入口。廣播與監(jiān)聽機制和服務機制有特定的入口函數,可將其構建到虛擬main函數中。然而本地代碼執(zhí)行機制并沒有固定的入口函數,則根據已重構好的函數調用圖,在某個圖中如果存在本地調用特征的函數,則將這個函數調用的真實入口加入到虛擬main函數中。
(2)標記污染信息。從虛擬main函數開始,根據每個函數已構建的函數摘要,將函數調用點的函數信息與源函數模式庫匹配,標記出污染變量中的污染信息。
(3)污染信息傳播。將污染信息通過函數的實參傳入被調函數中,計算傳入信息對被調函數各個函數調用點的影響,依次遞歸進行。
(4)惡意行為匹配。在過程(3)中結合危險函數模式庫,若匹配到一個危險函數時,并且污染信息也傳播到這個危險函數,再根據惡意行為模式庫中的惡意行為信息進行匹配,如果匹配成功,則報告一條危險行為及其相關信息。
根據上述方法,本文實現了一個原型系統。系統包含2.2萬行Java代碼和1 650行python代碼,可以直接對Android應用程序安裝包的字節(jié)碼進行靜態(tài)分析。主要包含三個模塊:預處理、核心分析引擎以及檢測結果,如圖3所示。
Figure 3 Detection prototype system of system mechanism’s malicious behavious圖3 系統機制的惡意行為檢測原型系統
預處理模塊將Android應用程序安裝包中的字節(jié)碼信息導入數據庫中??焖龠^濾部分,通過分析應用程序安裝包中的Android Manifest.xml文件中的權限列表,快速篩除肯定不存在惡意行為的應用程序。由于不同應用程序的安裝包存在相同的字節(jié)碼文件,在將字節(jié)碼信息導入數據庫之前,首先計算DEX文件的MD5值,如果數據庫中不存在該MD5值的應用程序,才會將應用程序的字節(jié)碼通過IDA Pro進行反匯編,再導入到數據庫中。反匯編和導入數據庫功能使用腳本自動實現的,不需要人工參與。
核心分析引擎通過對導入數據庫中的字節(jié)碼信息進行分析,恢復出應用程序結構以及近似運行時的函數調用圖,并進一步構建出每一個函數的摘要信息,最后通過惡意行為檢測分析出應用程序的惡意行為。
檢測結果模塊根據惡意行為檢測獲取的信息,剔除惡意行為中存在與用戶交互的惡意行為,將沒有與用戶交互的惡意行為作為最終的檢測結果(即Android系統機制相關的惡意行為)輸出。
我們使用了文獻[18]中使用的惡意應用程序數據庫,含有1 260個惡意應用程序樣本。我們將這些惡意程序樣本導入數據庫,由于樣本中存在DEX文件的MD5值相同,最終導入數據庫的惡意樣本數為866個。使用上述原型系統對數據庫中的樣本進行分析,其中有650個樣本在使用系統機制時添加惡意行為;而有216個樣本在使用系統機制時沒有添加惡意行為,但是不排除在非系統機制代碼部分添加了惡意行為,但是本文不關注這個方面,分析結果如圖4所示。
Figure 4 Detection results圖4 檢測結果在應用程序中的分布
在這650個樣本中,總共檢測出4 313條惡意行為,廣播與監(jiān)聽機制中出現惡意行為的個數為380,占9%;本地代碼執(zhí)行機制中出現惡意行為的個數為464,占11%;服務機制中出現惡意行為的個數為3 469,占80%,分布情況如圖5所示。不難看出,在服務機制出現的惡意行為最多,這也與服務機制的特點有關。在Android系統注冊一個服務,不僅當前應用程序可以使用這個服務,其他應用程序也可以使用,這樣可以實現兩個應用程序聯合完成惡意行為,一個應用程序注冊服務,另一個應用程序使用已注冊的服務,這樣協作的惡意行為更具隱蔽性,更難被檢測。
Figure 5 Malicious behavious detected圖5 各系統機制中出現的惡意行為
例如,應用程序0d90ccfae4bb1ad17dd55768f-380406ef3b0eced.apk(歡樂斗地主)檢測出一條隱私竊取的惡意行為。通過人工確認,該應用程序中確實存在這種行為。函數調用過程為:
MainService$SMSReceiver.onReceive@VLL
→MainService.access$7@VLLL
→MainService.sendSMS@VLL
→Sms Manager.send Text Message@VLLLLL
在這個函數調用過程中使用函數Sms Message.get Display Originating Address@L讀取游戲期間發(fā)送短信的源地址,即發(fā)送該短信的用戶手機號碼,最后使用Sms Manager.send Text Message@VLLLLL將該信息發(fā)送出去。
本文從指令級和函數級兩個不同粒度上對Android應用程序進行模擬執(zhí)行。在指令級上模擬構建函數摘要,在函數摘要上模擬并結合恢復的程序結構和先驗的特殊機制處理,完成對應用程序危險機制中的惡意行為檢測?;谏鲜龇椒▽崿F了一個原型系統,并通過檢測惡意樣本,進一步驗證了Android提供這些便于開發(fā)的機制,在不當使用時便成為危害用戶的危險機制。我們將進一步研究如何提高這些機制的安全性。
[1] Gartner says worldwide smartphone sales soared in fourth quarter of 2011 With 47 percent growth[EB/OL].[2012-02-15]http://www.gartner.com/it/page.jsp?id=1924314.
[2] IDC.Android Rises,Symbian 3 and Windows phone 7 launch
as worldwide smartphone shipments increase 87.2%year over year[EB/OL].[2011-02-07]http://www.idc.com/about/viewpressrelease.jsp?containerId=pr US22689111.
[3] Google android[EB/OL].[2012-02-15].http://www.android.com/.
[4] Bell D.Samsung Galaxy Tab Android tablet goes official[EB/OL].[2010-09-02].http://news.cnet.com/8301-17938_105-20015395-1.html.
[5] GIZMODO[EB/OL].[2010-06-21]http://gizmodo.com/5568458/toshiba-ac100-netbook-runs-androidand-h(huán)as-massive-seven-days-of-standbybattery-life.
[6] Notion Ink.Adam Tablet[EB/OL].[2011-02-07].http://www.notionink.in/.
[7] Google Play[EB/OL].[2012-03-14].https://play.google.com/store.
[8] App Store[EB/OL].[2012-03-14].http://itunes.apple.com/gb/app/apple-store/id375380948?mt=8.
[9] Egele M,Kruegel C,Kirda E,et al.PiOS:Detecting privacy leaks in iOS applications[C]∥Proc of the 18th Annual Network and Distributed System Security Symposium,NDSS’11,2011:29-33.
[10] Fuchs A P,Chaudhuri A,Foster J S.SCanDroid:Automated security certification of Android applications[EB/OL].[2012-03-14].http://www.cs.umd.edu/~avik/papers/scandroidascaa.pdf.
[11] Enck W,Octeau D,McDaniel P,et al.A study of Android application security[C]∥Proc of the 20th USENIX Security Symposium,2011:21.
[12] Zhou W,Zhou Y,Jiang X,et al.Droid MOSS:Detecting repackaged smartphone applications in third-party Android marketplaces[C]∥Proc of the 2nd ACM Conference on Data and Application Security and Privacy,2012:317-326.
[13] Activity[EB/OL].[2011-02-07].http://developer.android.com/intl/zh-CN/guide/components/activities.html.
[14] Android NDK[EB/OL].[2011-02-15].http://developer.android.com/tools/sdk/ndk/index.html.
[15] DexClass Loader[EB/OL].[2011-02-15].http://developer.android.com/reference/dalvik/system/Dex Class Loader.html.
[16] Baksmali[EB/OL].[2011-02-15].http://code.google.com/p/smali/.
[17] IDA Pro[EB/OL].[2011-02-15].http://www.hex-rays.com/products/ida/index.shtml.
[18] Zhou Y,Jiang X.Dissecting android malware:Characterization and evolution[C]∥Proc of the 33rd IEEE Symposium on Security and Privacy(2012),2012:95-109.
[19] Android application development documentation[EB/OL].[2011-02-07].http://developer.android.com/intl/zh-CN/develop/index.html.