吳俊昌,羅圣美,巫 妍,程紹銀,蔣 凡
(1.中國(guó)科學(xué)技術(shù)大學(xué)信息安全測(cè)評(píng)中心,安徽合肥230027;2.中興通訊,江蘇南京210012)
近年來(lái),移動(dòng)互聯(lián)網(wǎng)迅猛發(fā)展,對(duì)智能終端的需求也在與日劇增。根據(jù)Gartner提供的數(shù)據(jù),智能終端數(shù)量在2011年第三季度已達(dá)1.49億[1],并且在今年其總量已經(jīng)超過(guò)個(gè)人電腦的數(shù)量[2]。Google Android[3]已經(jīng)成為移動(dòng)終端[4~6]最主流的操作系統(tǒng),其市場(chǎng)占有率為52.5%[1],已經(jīng)超過(guò)其他智能終端系統(tǒng)占有率的總和。
豐富的智能終端應(yīng)用程序也是智能終端流行的一大原因。為了便于應(yīng)用程序開(kāi)發(fā)者發(fā)布應(yīng)用程序和用戶下載安裝應(yīng)用程序,出現(xiàn)了很多應(yīng)用程序商店,其中最著名的兩個(gè)應(yīng)用程序商店為Google的Android Play[7]和蘋(píng)果的App Store[8]。同時(shí)還存在諸多第三方應(yīng)用程序商店,比如機(jī)鋒市場(chǎng)等。相比較蘋(píng)果應(yīng)用程序的管理,Android的應(yīng)用程序就顯得十分混亂,這也導(dǎo)致Android系統(tǒng)上的惡意應(yīng)用程序頻發(fā),讓用戶能夠放心安全地使用應(yīng)用程序成為亟待解決的問(wèn)題。
PiOS[9]使用程序切片的技術(shù)檢測(cè)iOS上應(yīng)用程序中的隱私泄漏問(wèn)題,該方法只針對(duì)隱私泄漏問(wèn)題,沒(méi)有涉及其他惡意行為。SCanDroid[10]對(duì)Android應(yīng)用程序的源碼和Android Manifest文件進(jìn)行分析,生成應(yīng)用程序的證書(shū),以此來(lái)描述應(yīng)用程序權(quán)限的使用情況,但是在一般情況下很難得到應(yīng)用程序的源碼,對(duì)于只有二進(jìn)制代碼的應(yīng)用程序不適用。Enck W等人[11]實(shí)現(xiàn)了Dalvik字節(jié)碼反匯編工具ded,將字節(jié)碼轉(zhuǎn)換為源碼,通過(guò)現(xiàn)有的Java源碼分析工具,分析應(yīng)用程序中存在的安全問(wèn)題,該方法需要兩次代碼轉(zhuǎn)換,轉(zhuǎn)換過(guò)程會(huì)導(dǎo)致信息丟失,不利于應(yīng)用程序的安全性分析。Droid-MOSS[12]計(jì)算應(yīng)用程序模糊散列值,與官方的應(yīng)用程序比較,檢測(cè)在第三方應(yīng)用商店上被重新打包的應(yīng)用程序,并沒(méi)有檢測(cè)應(yīng)用程序是否為惡意的,對(duì)重新打包的應(yīng)用程序沒(méi)有分析其是否增加了惡意行為。與上述方法相比,本文方法不需要應(yīng)用程序的源碼,直接通過(guò)對(duì)應(yīng)用程序字節(jié)碼指令進(jìn)行模擬執(zhí)行,構(gòu)建出函數(shù)的摘要,在函數(shù)摘要上使用污點(diǎn)傳播算法,分析出存在惡意行為的路徑。
針對(duì)使用Android系統(tǒng)提供的內(nèi)部機(jī)制所開(kāi)發(fā)的惡意應(yīng)用程序,本文提出一種基于程序分析的方法,對(duì)未知的應(yīng)用程序進(jìn)行惡意行為檢測(cè),進(jìn)而分析應(yīng)用程序的安全性。通過(guò)對(duì)應(yīng)用程序在不同粒度上的模擬執(zhí)行,對(duì)應(yīng)用程序進(jìn)行分析。在指令級(jí)別上的模擬執(zhí)行計(jì)算函數(shù)摘要,針對(duì)不同的函數(shù)設(shè)計(jì)原子函數(shù)摘要和組合函數(shù)摘要來(lái)滿足分析需要。在函數(shù)級(jí)別上的模擬執(zhí)行進(jìn)行應(yīng)用程序的惡意行為檢測(cè),通過(guò)惡意行為檢測(cè)完成對(duì)應(yīng)用程序的安全性評(píng)估。
Android系統(tǒng)為了簡(jiǎn)化應(yīng)用程序的開(kāi)發(fā)以及各種軟硬件資源和權(quán)限的管理,設(shè)計(jì)了很多的機(jī)制,例如廣播與監(jiān)聽(tīng)機(jī)制、服務(wù)機(jī)制等等。從開(kāi)發(fā)和管理的角度上說(shuō),這些機(jī)制的確使開(kāi)發(fā)和管理變得簡(jiǎn)單;但是,從用戶安全的角度上說(shuō),這些機(jī)制卻將使用應(yīng)用程序的用戶暴露于極大的安全隱患之中。
在Android系統(tǒng)中存在各種各樣的廣播,比如電池的使用狀態(tài)的改變、電話的接聽(tīng)和短信的接收都會(huì)產(chǎn)生一個(gè)廣播,應(yīng)用程序開(kāi)發(fā)者可以監(jiān)聽(tīng)這些廣播并做出相應(yīng)的處理。應(yīng)用程序在安裝時(shí)便會(huì)向Android系統(tǒng)注冊(cè)所使用的廣播監(jiān)聽(tīng)器,Android系統(tǒng)接收到廣播時(shí)便通知注冊(cè)了該廣播的應(yīng)用程序執(zhí)行相應(yīng)的廣播監(jiān)聽(tīng)器。
惡意應(yīng)用開(kāi)發(fā)者可以在開(kāi)發(fā)的應(yīng)用程序中注冊(cè)比較常用的廣播監(jiān)聽(tīng)器,比如電話和短信的廣播,當(dāng)監(jiān)聽(tīng)到Android系統(tǒng)發(fā)送這類廣播時(shí),就可以在廣播處理事件中做一些有害于用戶的行為,例如獲取用戶的通訊錄信息,并通過(guò)網(wǎng)絡(luò)發(fā)送出去。使用這種方法的應(yīng)用程序的惡意行為比較隱蔽,只有在監(jiān)聽(tīng)到特定廣播才會(huì)觸發(fā),而此時(shí)已對(duì)用戶造成了損失。
服務(wù)是不可見(jiàn)的,主要是在后臺(tái)運(yùn)行。服務(wù)機(jī)制一般用于支持比較耗時(shí)或者長(zhǎng)時(shí)間運(yùn)行的操作。服務(wù)分為兩種:本地服務(wù)和遠(yuǎn)程服務(wù)。本地服務(wù)一般用于應(yīng)用程序內(nèi)部一些耗時(shí)的任務(wù),比如查詢升級(jí)信息等,并不占用應(yīng)用程序比如Activity[13]所屬線程,而是單開(kāi)線程后臺(tái)執(zhí)行。遠(yuǎn)程服務(wù)一般是用于Android系統(tǒng)內(nèi)部的應(yīng)用程序之間的,可以被其他應(yīng)用程序復(fù)用,比如天氣預(yù)報(bào)服務(wù),其他應(yīng)用程序不需要再寫(xiě)這樣的服務(wù),直接調(diào)用已有的即可。相比于本地服務(wù),遠(yuǎn)程服務(wù)更具危險(xiǎn)性。
服務(wù)可以提供很多方式供惡意應(yīng)用程序開(kāi)發(fā)者開(kāi)發(fā)惡意應(yīng)用。例如,一個(gè)惡意應(yīng)用程序在運(yùn)行時(shí)并不需要任何與外界交互的權(quán)限,比如發(fā)送短信或訪問(wèn)網(wǎng)絡(luò)的權(quán)限,而只要通過(guò)一個(gè)具有以上權(quán)限的服務(wù),就可以將非法收集到的用戶隱私信息發(fā)送出去。
在Android系統(tǒng)中主要存在三種本地代碼:shell命令、本地庫(kù)文件(.SO)以及字節(jié)碼文件(.JAR和.DEX)。Android系統(tǒng)為shell命令提供了exec接口;為將本地庫(kù)加載到當(dāng)前應(yīng)用程序內(nèi)存中提供了load和load Library兩個(gè)接口,本地庫(kù)文件可以使用NDK(Native Development Kit)[14]開(kāi)發(fā);為字節(jié)碼的使用提供了DexClassLoader[15]類來(lái)處理字節(jié)碼文件的執(zhí)行。
本地代碼的執(zhí)行具有極大的靈活性,且方式多樣。應(yīng)用程序開(kāi)發(fā)者可以在發(fā)布應(yīng)用程序時(shí),不將存在惡意代碼的文件放入安裝文件中,而是在用戶使用時(shí)再將這些代碼文件從網(wǎng)絡(luò)上下載,這加大了對(duì)應(yīng)用程序進(jìn)行檢測(cè)分析的難度。
針對(duì)上述Android系統(tǒng)提供的機(jī)制存在的安全問(wèn)題,本文給出了一種惡意行為的檢測(cè)方法。本方法不需要安裝應(yīng)用程序,直接在PC上對(duì)應(yīng)用程序的字節(jié)碼文件進(jìn)行靜態(tài)分析,主要包括如下四個(gè)步驟:程序結(jié)構(gòu)恢復(fù)、函數(shù)調(diào)用圖重構(gòu)、函數(shù)摘要構(gòu)建以及惡意行為檢測(cè),如圖1所示。程序結(jié)構(gòu)恢復(fù)是在內(nèi)存中對(duì)當(dāng)前應(yīng)用程序中類的結(jié)構(gòu)的恢復(fù),恢復(fù)的結(jié)構(gòu)信息主要包括類的繼承關(guān)系、類中的屬性以及類中的方法等;函數(shù)調(diào)用圖重構(gòu)是針對(duì)Android系統(tǒng)以消息為驅(qū)動(dòng)方式以及使用面向?qū)ο蟮腏ava編程語(yǔ)言設(shè)計(jì)的,完成函數(shù)調(diào)用的唯一性確定以及控件消息處理事件的調(diào)用,重構(gòu)出近似于函數(shù)運(yùn)行時(shí)的調(diào)用圖;函數(shù)摘要構(gòu)建是結(jié)合恢復(fù)的程序結(jié)構(gòu)和重構(gòu)的函數(shù)調(diào)用圖,對(duì)函數(shù)中字節(jié)碼指令進(jìn)行模擬執(zhí)行,求解出函數(shù)的輸入與輸出之間的語(yǔ)義邏輯關(guān)系;惡意行為檢測(cè)通過(guò)在已計(jì)算出的函數(shù)摘要信息上使用靜態(tài)污點(diǎn)傳播算法,檢測(cè)函數(shù)調(diào)用路徑上的惡意行為。
Figure 1 Analysis detecting method圖1 分析檢測(cè)方法
Android應(yīng)用程序主要使用Java語(yǔ)言開(kāi)發(fā)。Java是一種面向?qū)ο蟮恼Z(yǔ)言,存在大量的類和對(duì)象。但是,與一般的Java程序相比,Android應(yīng)用程序不存在主入口函數(shù)main,例如存在界面的Android應(yīng)用程序的主入口函數(shù)一般是一個(gè)Activity組件的onCreate函數(shù),該信息可以從Android Manifest.xml文件中獲取。Android Manifest.xml文件中定義了本應(yīng)用程序需使用的Activity組件、Service組件、Receiver組件以及所需要的權(quán)限列表等。這些組件的啟動(dòng)函數(shù)都可以作為分析的入口。
在Android系統(tǒng)中,應(yīng)用程序的運(yùn)行是以消息為驅(qū)動(dòng)的。在對(duì)應(yīng)用程序進(jìn)行分析檢測(cè)的時(shí)候,對(duì)于應(yīng)用程序分析過(guò)程中存在消息響應(yīng)的控件,在該控件對(duì)象生成時(shí),就對(duì)該控件的消息處理事件進(jìn)行分析。因?yàn)榇蟛糠值氖录桥c用戶交互形成的,而這些控件對(duì)象初始化之后,就已經(jīng)具備了完成相應(yīng)消息處理事件所必須的信息。
Android應(yīng)用程序一般是用Java語(yǔ)言開(kāi)發(fā)的,存在著大量的類和對(duì)象。在對(duì)函數(shù)進(jìn)行分析的過(guò)程中,需要確定被調(diào)用函數(shù)以及屬性的歸屬,這些都需要程序結(jié)構(gòu)的支撐。
結(jié)構(gòu)的恢復(fù)需要依賴應(yīng)用程序安裝包中的.DEX文件。對(duì)該文件進(jìn)行反匯編,目前已有很多可以使用的Dalvik字節(jié)碼的反匯編工具,例如baksmali[16]、IDA Pro[17]等,本文使用功能強(qiáng)大的IDA Pro作為反匯編工具。不需人工參與,通過(guò)編寫(xiě)自動(dòng)化的python腳本,可以從反匯編的結(jié)果中獲取所有類的屬性列表、函數(shù)列表以及所有函數(shù)的字節(jié)碼信息,并在內(nèi)存中恢復(fù)這些程序結(jié)構(gòu)。
類中的方法和屬性的恢復(fù)是通過(guò)對(duì)方法名和屬性名進(jìn)行解析完成的。IDA Pro對(duì)方法名和屬性名反匯編出的命名是規(guī)則的。方法名一般格式為:包名$類名$內(nèi)部類名.函數(shù)名@返回值及形參列表類型。返回值及形參列表的類型一般用一個(gè)字母表示一種類型,例如void用V表示。屬性名一般格式為:包名$類名$類部類名_屬性名。根據(jù)這些命名規(guī)則,可以解析出方法和屬性的類名,再根據(jù)解析出的類名將這些方法和屬性劃分到各自原本的類中。
默認(rèn)情況下,所有類的父類為Object類,而構(gòu)建類的繼承關(guān)系,主要是構(gòu)建類直接繼承過(guò)來(lái)的父類。直接繼承的父類需要通過(guò)分析特定的指令獲取,Dalvik字節(jié)碼中有兩個(gè)指令(INVOKE_SUPER和INVOKE_SUPER_RANGE)指定調(diào)用父類中同名的函數(shù),從而可以分析出該函數(shù)所在類的父類。Dalvik字節(jié)碼指令是通過(guò)INVOKE_XXX指令進(jìn)行函數(shù)調(diào)用的,可以根據(jù)這類指令信息構(gòu)建出整個(gè)應(yīng)用程序的函數(shù)調(diào)用圖。
Android系統(tǒng)中存在組件的生命周期、消息的驅(qū)動(dòng)以及類的繼承等,使得“程序結(jié)構(gòu)恢復(fù)”階段構(gòu)建函數(shù)時(shí)得出的函數(shù)調(diào)用圖不完整或存在錯(cuò)誤,因此必須進(jìn)行修復(fù)和重構(gòu)。
Android應(yīng)用程序由Activity、Service以及Receiver等組件組成,這些組件是Android應(yīng)用程序所特有的,每個(gè)組件各有一個(gè)完整的生命周期,不同組件的生命周期差別很大,在整個(gè)生命周期使用的函數(shù)都是由系統(tǒng)進(jìn)行調(diào)用的,它們?cè)诤瘮?shù)調(diào)用圖中是沒(méi)有前驅(qū)節(jié)點(diǎn)的,在系統(tǒng)實(shí)際運(yùn)行中遵循一定的調(diào)用順序,該調(diào)用順序可以從Android應(yīng)用程序開(kāi)發(fā)文檔中獲取。以Activity[13]為例,如圖2a所示,一個(gè)Activity組件啟動(dòng)時(shí),調(diào)用該Activity的onCreate函數(shù)初始化一些Activity的基本數(shù)據(jù);調(diào)用onStart后一個(gè)Activity即可顯示;on Resume和onPause分別是繼續(xù)和暫停當(dāng)前Activity;onStop是停止當(dāng)前Activity,此時(shí)Activity已不再顯示;最后使用onDestroy銷毀一個(gè)Activity。從Activity的生命周期可以分析出,Activity的函數(shù)執(zhí)行序列一般是onCreate、onStart、onPause、on Resume、onStop、on Destroy,如圖2b所示。所以可以重新構(gòu)建出Activity生命周期在運(yùn)行時(shí)的函數(shù)調(diào)用圖。
Figure 2 Reconstruction of function calls in Activity圖2 Activity中的函數(shù)調(diào)用重構(gòu)
Android應(yīng)用程序存在大量的控件,例如按鈕、輸入框等??丶氖录幚砗瘮?shù)是由Android系統(tǒng)確定調(diào)用的,在對(duì)應(yīng)用程序進(jìn)行分析的過(guò)程中需要適當(dāng)?shù)卣{(diào)用這些函數(shù)。例如,按鈕控件有個(gè)點(diǎn)擊事件,即onClick事件,當(dāng)用戶點(diǎn)擊按鈕時(shí)才會(huì)觸發(fā),而在靜態(tài)分析過(guò)程中不存在與用戶的交互,可以根據(jù)前述方法,將點(diǎn)擊事件處理函數(shù)在按鈕初始化。
函數(shù)摘要是對(duì)函數(shù)的一種抽象解釋。Android應(yīng)用程序中存在類的繼承、接口的實(shí)現(xiàn)等面向?qū)ο缶幊烫卣?,基于這些特征可以將函數(shù)的摘要分為兩類,即原子函數(shù)摘要和組合函數(shù)摘要。
定義1 原子函數(shù)摘要:所摘要的函數(shù)不存在子函數(shù)調(diào)用,或者雖然存在子函數(shù)調(diào)用,但這些子函數(shù)調(diào)用都是可以唯一確定的。
定義2 組合函數(shù)摘要:所摘要的函數(shù)存在子函數(shù)調(diào)用,且至少有一個(gè)子函數(shù)調(diào)用在該函數(shù)體內(nèi)不能唯一確定。
函數(shù)摘要構(gòu)建是在指令級(jí)別上對(duì)函數(shù)體中的指令進(jìn)行模擬執(zhí)行的過(guò)程。算法1是函數(shù)摘要構(gòu)建的算法,語(yǔ)句5~8處理函數(shù)調(diào)用指令,從重構(gòu)的函數(shù)調(diào)用圖call Grpah中獲取被調(diào)函數(shù)function信息,并在局部參數(shù)local Variables中查找該被調(diào)函數(shù)的實(shí)參,存放到實(shí)參列表arguments中,最后將實(shí)參列表arguments和被調(diào)函數(shù)function信息保存到函數(shù)摘要summary,即在函數(shù)摘要中構(gòu)建一條函數(shù)調(diào)用信息(下稱函數(shù)調(diào)用點(diǎn));語(yǔ)句9~14處理函數(shù)間的調(diào)用關(guān)系,將被調(diào)函數(shù)對(duì)形參fun-Parameters的影響傳遞給主調(diào)函數(shù)中的實(shí)參arguments;語(yǔ)句15~16處理函數(shù)返回指令(包括拋出異常的指令),合并所有影響形參值的變量信息,將結(jié)果保存到形參中;語(yǔ)句17~19處理既不是函數(shù)返回指令又不是函數(shù)調(diào)用指令的指令,對(duì)這種指令根據(jù)Dalvik字節(jié)碼的語(yǔ)義進(jìn)行模擬,并更新相應(yīng)局部變量的狀態(tài)。例如,指令new-instance v6,〈t:Sms〉是新建一個(gè)Sms對(duì)象,將該對(duì)象放入v6中。在模擬執(zhí)行過(guò)程中,則會(huì)構(gòu)建一個(gè)與Sms相對(duì)應(yīng)的對(duì)象保存Sms的信息。
算法1 函數(shù)摘要構(gòu)建算法
Android應(yīng)用程序沒(méi)有像Java應(yīng)用程序存在一個(gè)統(tǒng)一的入口函數(shù)main,在對(duì)存在多個(gè)組件的Android應(yīng)用程序進(jìn)行分析時(shí)會(huì)帶來(lái)不便。為了解決這個(gè)問(wèn)題,在對(duì)應(yīng)用程序進(jìn)行分析之前,對(duì)應(yīng)用程序先構(gòu)建一個(gè)虛擬的main函數(shù),將每個(gè)組件按其生命周期構(gòu)建函數(shù)的執(zhí)行序列,同一個(gè)組件共享同一個(gè)this對(duì)象。
惡意行為檢測(cè)是建立在已經(jīng)構(gòu)建好的函數(shù)摘要基礎(chǔ)上的。從上述虛擬main函數(shù)開(kāi)始,在計(jì)算的函數(shù)摘要上進(jìn)行函數(shù)級(jí)別上的模擬執(zhí)行,在執(zhí)行過(guò)程中組合摘要中的占位函數(shù)需要結(jié)合已恢復(fù)的程序結(jié)構(gòu)和函數(shù)調(diào)用時(shí)所傳入的this對(duì)象來(lái)確定。
在檢測(cè)過(guò)程中,需要用到源函數(shù)模式庫(kù)和危險(xiǎn)函數(shù)模式庫(kù),以及惡意行為模式庫(kù),這些模式庫(kù)都是來(lái)源于人工分析的經(jīng)驗(yàn)積累。源函數(shù)模式庫(kù)包含引入污染數(shù)據(jù)的函數(shù),這可以是訪問(wèn)手機(jī)中的隱私數(shù)據(jù),比如用戶的通訊錄等,也可以是啟動(dòng)手機(jī)的某個(gè)功能模塊,比如地理位置定位系統(tǒng)等。危險(xiǎn)函數(shù)模式庫(kù)包含可以與外界交互的函數(shù),例如訪問(wèn)網(wǎng)絡(luò)、發(fā)送短信等。惡意行為模式庫(kù)包含源函數(shù)與危險(xiǎn)函數(shù)相結(jié)合后所產(chǎn)生的危害行為模式,例如啟動(dòng)地理位置定位系統(tǒng)與發(fā)送短信結(jié)合,則可能屬于遠(yuǎn)程控制設(shè)備的行為。
檢測(cè)惡意行為的步驟主要如下:
(1)設(shè)置分析入口。廣播與監(jiān)聽(tīng)機(jī)制和服務(wù)機(jī)制有特定的入口函數(shù),可將其構(gòu)建到虛擬main函數(shù)中。然而本地代碼執(zhí)行機(jī)制并沒(méi)有固定的入口函數(shù),則根據(jù)已重構(gòu)好的函數(shù)調(diào)用圖,在某個(gè)圖中如果存在本地調(diào)用特征的函數(shù),則將這個(gè)函數(shù)調(diào)用的真實(shí)入口加入到虛擬main函數(shù)中。
(2)標(biāo)記污染信息。從虛擬main函數(shù)開(kāi)始,根據(jù)每個(gè)函數(shù)已構(gòu)建的函數(shù)摘要,將函數(shù)調(diào)用點(diǎn)的函數(shù)信息與源函數(shù)模式庫(kù)匹配,標(biāo)記出污染變量中的污染信息。
(3)污染信息傳播。將污染信息通過(guò)函數(shù)的實(shí)參傳入被調(diào)函數(shù)中,計(jì)算傳入信息對(duì)被調(diào)函數(shù)各個(gè)函數(shù)調(diào)用點(diǎn)的影響,依次遞歸進(jìn)行。
(4)惡意行為匹配。在過(guò)程(3)中結(jié)合危險(xiǎn)函數(shù)模式庫(kù),若匹配到一個(gè)危險(xiǎn)函數(shù)時(shí),并且污染信息也傳播到這個(gè)危險(xiǎn)函數(shù),再根據(jù)惡意行為模式庫(kù)中的惡意行為信息進(jìn)行匹配,如果匹配成功,則報(bào)告一條危險(xiǎn)行為及其相關(guān)信息。
根據(jù)上述方法,本文實(shí)現(xiàn)了一個(gè)原型系統(tǒng)。系統(tǒng)包含2.2萬(wàn)行Java代碼和1 650行python代碼,可以直接對(duì)Android應(yīng)用程序安裝包的字節(jié)碼進(jìn)行靜態(tài)分析。主要包含三個(gè)模塊:預(yù)處理、核心分析引擎以及檢測(cè)結(jié)果,如圖3所示。
Figure 3 Detection prototype system of system mechanism’s malicious behavious圖3 系統(tǒng)機(jī)制的惡意行為檢測(cè)原型系統(tǒng)
預(yù)處理模塊將Android應(yīng)用程序安裝包中的字節(jié)碼信息導(dǎo)入數(shù)據(jù)庫(kù)中??焖龠^(guò)濾部分,通過(guò)分析應(yīng)用程序安裝包中的Android Manifest.xml文件中的權(quán)限列表,快速篩除肯定不存在惡意行為的應(yīng)用程序。由于不同應(yīng)用程序的安裝包存在相同的字節(jié)碼文件,在將字節(jié)碼信息導(dǎo)入數(shù)據(jù)庫(kù)之前,首先計(jì)算DEX文件的MD5值,如果數(shù)據(jù)庫(kù)中不存在該MD5值的應(yīng)用程序,才會(huì)將應(yīng)用程序的字節(jié)碼通過(guò)IDA Pro進(jìn)行反匯編,再導(dǎo)入到數(shù)據(jù)庫(kù)中。反匯編和導(dǎo)入數(shù)據(jù)庫(kù)功能使用腳本自動(dòng)實(shí)現(xiàn)的,不需要人工參與。
核心分析引擎通過(guò)對(duì)導(dǎo)入數(shù)據(jù)庫(kù)中的字節(jié)碼信息進(jìn)行分析,恢復(fù)出應(yīng)用程序結(jié)構(gòu)以及近似運(yùn)行時(shí)的函數(shù)調(diào)用圖,并進(jìn)一步構(gòu)建出每一個(gè)函數(shù)的摘要信息,最后通過(guò)惡意行為檢測(cè)分析出應(yīng)用程序的惡意行為。
檢測(cè)結(jié)果模塊根據(jù)惡意行為檢測(cè)獲取的信息,剔除惡意行為中存在與用戶交互的惡意行為,將沒(méi)有與用戶交互的惡意行為作為最終的檢測(cè)結(jié)果(即Android系統(tǒng)機(jī)制相關(guān)的惡意行為)輸出。
我們使用了文獻(xiàn)[18]中使用的惡意應(yīng)用程序數(shù)據(jù)庫(kù),含有1 260個(gè)惡意應(yīng)用程序樣本。我們將這些惡意程序樣本導(dǎo)入數(shù)據(jù)庫(kù),由于樣本中存在DEX文件的MD5值相同,最終導(dǎo)入數(shù)據(jù)庫(kù)的惡意樣本數(shù)為866個(gè)。使用上述原型系統(tǒng)對(duì)數(shù)據(jù)庫(kù)中的樣本進(jìn)行分析,其中有650個(gè)樣本在使用系統(tǒng)機(jī)制時(shí)添加惡意行為;而有216個(gè)樣本在使用系統(tǒng)機(jī)制時(shí)沒(méi)有添加惡意行為,但是不排除在非系統(tǒng)機(jī)制代碼部分添加了惡意行為,但是本文不關(guān)注這個(gè)方面,分析結(jié)果如圖4所示。
Figure 4 Detection results圖4 檢測(cè)結(jié)果在應(yīng)用程序中的分布
在這650個(gè)樣本中,總共檢測(cè)出4 313條惡意行為,廣播與監(jiān)聽(tīng)機(jī)制中出現(xiàn)惡意行為的個(gè)數(shù)為380,占9%;本地代碼執(zhí)行機(jī)制中出現(xiàn)惡意行為的個(gè)數(shù)為464,占11%;服務(wù)機(jī)制中出現(xiàn)惡意行為的個(gè)數(shù)為3 469,占80%,分布情況如圖5所示。不難看出,在服務(wù)機(jī)制出現(xiàn)的惡意行為最多,這也與服務(wù)機(jī)制的特點(diǎn)有關(guān)。在Android系統(tǒng)注冊(cè)一個(gè)服務(wù),不僅當(dāng)前應(yīng)用程序可以使用這個(gè)服務(wù),其他應(yīng)用程序也可以使用,這樣可以實(shí)現(xiàn)兩個(gè)應(yīng)用程序聯(lián)合完成惡意行為,一個(gè)應(yīng)用程序注冊(cè)服務(wù),另一個(gè)應(yīng)用程序使用已注冊(cè)的服務(wù),這樣協(xié)作的惡意行為更具隱蔽性,更難被檢測(cè)。
Figure 5 Malicious behavious detected圖5 各系統(tǒng)機(jī)制中出現(xiàn)的惡意行為
例如,應(yīng)用程序0d90ccfae4bb1ad17dd55768f-380406ef3b0eced.apk(歡樂(lè)斗地主)檢測(cè)出一條隱私竊取的惡意行為。通過(guò)人工確認(rèn),該應(yīng)用程序中確實(shí)存在這種行為。函數(shù)調(diào)用過(guò)程為:
MainService$SMSReceiver.onReceive@VLL
→MainService.access$7@VLLL
→MainService.sendSMS@VLL
→Sms Manager.send Text Message@VLLLLL
在這個(gè)函數(shù)調(diào)用過(guò)程中使用函數(shù)Sms Message.get Display Originating Address@L讀取游戲期間發(fā)送短信的源地址,即發(fā)送該短信的用戶手機(jī)號(hào)碼,最后使用Sms Manager.send Text Message@VLLLLL將該信息發(fā)送出去。
本文從指令級(jí)和函數(shù)級(jí)兩個(gè)不同粒度上對(duì)Android應(yīng)用程序進(jìn)行模擬執(zhí)行。在指令級(jí)上模擬構(gòu)建函數(shù)摘要,在函數(shù)摘要上模擬并結(jié)合恢復(fù)的程序結(jié)構(gòu)和先驗(yàn)的特殊機(jī)制處理,完成對(duì)應(yīng)用程序危險(xiǎn)機(jī)制中的惡意行為檢測(cè)。基于上述方法實(shí)現(xiàn)了一個(gè)原型系統(tǒng),并通過(guò)檢測(cè)惡意樣本,進(jìn)一步驗(yàn)證了Android提供這些便于開(kāi)發(fā)的機(jī)制,在不當(dāng)使用時(shí)便成為危害用戶的危險(xiǎn)機(jī)制。我們將進(jìn)一步研究如何提高這些機(jī)制的安全性。
[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,F(xiàn)oster 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.