潘志安
摘 要: 隨著移動(dòng)互聯(lián)網(wǎng)的飛速發(fā)展,Android系統(tǒng)得到了大量用戶和開發(fā)人員的青睞。針對(duì)Android系統(tǒng)的惡意軟件層出不窮,由此引發(fā)的危害也越來越嚴(yán)重。目前針對(duì)Android系統(tǒng)應(yīng)用程序的檢測多采用靜態(tài)分析技術(shù),通過分析代碼發(fā)現(xiàn)其惡意行為,因此準(zhǔn)確度并不是很高,而且對(duì)于新的惡意軟件變種的檢測存在較多問題,而動(dòng)態(tài)分析技術(shù)恰好可以彌補(bǔ)這一不足?;谖埸c(diǎn)傳播的動(dòng)態(tài)分析技術(shù),在應(yīng)用程序運(yùn)行時(shí)監(jiān)測其行為并記錄相關(guān)信息進(jìn)行分析,確定其是否具有惡意軟件性質(zhì)。不僅對(duì)系統(tǒng)運(yùn)行負(fù)載較小,也便于系統(tǒng)移植進(jìn)行多平臺(tái)的開發(fā)測試。
關(guān)鍵詞: Android系統(tǒng); 惡意軟件; 動(dòng)態(tài)分析; 污點(diǎn)標(biāo)記
中圖分類號(hào): TN929.5?34; TM417 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2016)23?0039?04
針對(duì)目前Android系統(tǒng)惡意軟件檢測技術(shù)的研究現(xiàn)狀,對(duì)Android 安全監(jiān)控系統(tǒng)進(jìn)行了研究和設(shè)計(jì),在應(yīng)用程序框架層和Dalvik虛擬機(jī)層監(jiān)控、記錄應(yīng)用程序行為的方式,構(gòu)建了新的污點(diǎn)傳播監(jiān)控系統(tǒng),跟蹤被污點(diǎn)標(biāo)記的敏感數(shù)據(jù)在系統(tǒng)中的傳播過程并進(jìn)行信息記錄分析,確定應(yīng)用程序行為是否具有惡意軟件性質(zhì)。
1 系統(tǒng)結(jié)構(gòu)
監(jiān)控系統(tǒng)的總體設(shè)計(jì)結(jié)構(gòu)如圖1所示。本系統(tǒng)基于Android 4.1.1系統(tǒng)和Pandaboard 內(nèi)核設(shè)計(jì)。通過對(duì)系統(tǒng)的Dalvik虛擬機(jī)和應(yīng)用程序框架層的修改,實(shí)現(xiàn)了污點(diǎn)數(shù)據(jù)定義、污點(diǎn)數(shù)據(jù)標(biāo)記、污點(diǎn)標(biāo)記傳播、污點(diǎn)標(biāo)記提取和應(yīng)用程序行為分析等功能。
在圖1中,污點(diǎn)數(shù)據(jù)定義模塊的功能是定義和存儲(chǔ)敏感數(shù)據(jù)源類型,用于污點(diǎn)標(biāo)記不同類型的數(shù)據(jù);污點(diǎn)標(biāo)記模塊在應(yīng)用程序調(diào)用系統(tǒng)API進(jìn)行數(shù)據(jù)操作時(shí)對(duì)其讀取的敏感數(shù)據(jù)類型進(jìn)行污點(diǎn)標(biāo)記;污點(diǎn)傳播模塊在應(yīng)用程序和系統(tǒng)組件之間的傳遞依靠系統(tǒng)中的Binder IPC完成;污點(diǎn)標(biāo)記提取模塊負(fù)責(zé)在污點(diǎn)數(shù)據(jù)到達(dá)目標(biāo)應(yīng)用程序時(shí)記錄污點(diǎn)傳播路徑;最后通過應(yīng)用程序分析模塊篩選Android系統(tǒng)中l(wèi)ogcat應(yīng)用程序的相關(guān)行為信息并輸出。
2 系統(tǒng)詳細(xì)實(shí)現(xiàn)
2.1 污點(diǎn)數(shù)據(jù)定義模塊
針對(duì)污點(diǎn)數(shù)據(jù)源dalvik\vm\interp\Taint.h和dalvik\ src\main\java\dalvik\system\Taint.java,Taint.java的作用在于提供Dalvik虛擬機(jī)的污點(diǎn)接口,并在taint類中聲明污點(diǎn)數(shù)據(jù)源的定義,其代碼如下所示,其中TAINT_CLEAR表示為空值。
public static final int TAINT_CLEAR =0x00000000; //空值
public static final int TAINT_LOCATION = 0x00000001;
//位置
public static final int TAINT_CONTACTS = 0x00000002;
//聯(lián)系人
public static final int TAINT_MIC = 0x00000004; //話筒輸入
public static final int TAINT_PHONE_NUMBER= 0x00000008; //電話號(hào)碼
public static final int TAINT_LOCATION_GPS= 0x00000010; //GPS
public static final int …
將污點(diǎn)數(shù)據(jù)源定義為32位值的原因在于Android系統(tǒng)的應(yīng)用程序運(yùn)行在Dalvik虛擬機(jī)中。Dalvik虛擬機(jī)是Google專門為Android平臺(tái)開發(fā)的Java虛擬機(jī),但是它不兼容java字節(jié)碼格式,而是首先將java應(yīng)用程序轉(zhuǎn)換成.dex格式再執(zhí)行。因此需要將污點(diǎn)數(shù)據(jù)源定義為.dex文件中的數(shù)據(jù)類型。
在Taint.java文件中完成污點(diǎn)數(shù)據(jù)源的聲明之后,需要在Taint.h文件中完成污點(diǎn)數(shù)據(jù)源在Dalvik解釋器中的定義。首先對(duì)污點(diǎn)數(shù)據(jù)類型進(jìn)行了定義,其結(jié)構(gòu)體為:
typedef struct Taint { u4 tag; } Taint;
在完成污點(diǎn)數(shù)據(jù)源的定義之后,就可以進(jìn)行Dalvik虛擬機(jī)和應(yīng)用程序框架層的修改,完成污點(diǎn)監(jiān)控系統(tǒng)的其他功能。
2.2 污點(diǎn)數(shù)據(jù)標(biāo)記模塊
通過分析Android系統(tǒng)架構(gòu)發(fā)現(xiàn),要實(shí)現(xiàn)污點(diǎn)數(shù)據(jù)標(biāo)記功能應(yīng)該在Dalvik虛擬機(jī)層完成,但是又涉及到應(yīng)用程序框架層API的改動(dòng),因而需要使用JNI技術(shù)。通過JNI技術(shù),Java程序中的函數(shù)可以調(diào)用本地語言,例如C/C++等語言編寫的函數(shù),而本地語言中的函數(shù)方法也可以調(diào)用Java層的函數(shù)。在本監(jiān)控系統(tǒng)中,具體的方法實(shí)現(xiàn)是:首先在Java類使用native關(guān)鍵字聲明本地的方法并作為類的靜態(tài)成員;之后通過編譯生成.class文件和.h頭文件,在C/C++語言中完成具體的實(shí)現(xiàn)方法;最后通過編譯生成動(dòng)態(tài)鏈接庫lib*.so文件用于系統(tǒng)調(diào)用。整個(gè)流程如圖2所示。
在對(duì)數(shù)據(jù)進(jìn)行污點(diǎn)標(biāo)記之前,需要了解Dalvik虛擬機(jī)中各種對(duì)象的存儲(chǔ)方式。一個(gè).dex文件通常需要由類加載器加載原生類和Java類,然后通過解釋器根據(jù)指令集對(duì)Dalvik字節(jié)碼進(jìn)行解釋和執(zhí)行。在加載具體的類之前,需要使用mmap函數(shù)對(duì).dex文件進(jìn)行解析,將.dex文件映射到內(nèi)存中即可進(jìn)行讀/寫操作。在完成文件解析之后,需要加載class,而加載的類則需要ClassObject數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)。
在完成函數(shù)聲明之后,在dalvik\vm\native中新建dalvik_system_Taint.cpp,完成上述兩個(gè)函數(shù)的定義。
在完成了Dalvik虛擬機(jī)層的修改之后,還需要對(duì)應(yīng)用程序框架層中的API進(jìn)行修改。首先通過惡意軟件樣本得到了惡意軟件經(jīng)常調(diào)用的API,如表1所示。
表1 Android惡意軟件常用API示例
[API\&說明\&addPermisson() \&為系統(tǒng)增加一個(gè)權(quán)限\&getCellLocation()\&獲取當(dāng)期設(shè)備位置\&getDeviceId() \&獲取惟一的設(shè)備 ID\&getSimState()\&獲取 SIM 卡狀態(tài)\&sendTextMessage()\&向單個(gè)收件人發(fā)送短信息\&sendBoradcast()\&向接收器廣播消息\&]
對(duì)應(yīng)用程序框架層API的修改主要在Cursor包裝庫,短信息管理類以及獲取設(shè)備信息管理等類。其中CursorWrapper類是Cursor類的包裝類。它提供了多種對(duì)數(shù)據(jù)庫查詢結(jié)果進(jìn)行訪問的接口方法,因此可以通過修改Cursor類Wrapper類,使得任何調(diào)用該類的函數(shù)對(duì)象都會(huì)被進(jìn)行污點(diǎn)標(biāo)記,其實(shí)現(xiàn)方法為:首先在CursorWrapper類中定義進(jìn)行污點(diǎn)標(biāo)記的功能函數(shù);之后修改getString()等方法。
getString()方法用于接收參數(shù),其返回值同樣也為String類型。此方法多用于從Android系統(tǒng)數(shù)據(jù)庫中獲取查詢結(jié)果,因此通過修改該方法,將污點(diǎn)標(biāo)記功能嵌入其中,即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫查詢結(jié)果中String類型數(shù)據(jù)的污點(diǎn)標(biāo)記,其實(shí)現(xiàn)代碼為:
public String getString(int columnIndex)
{
//開始污點(diǎn)標(biāo)記
String retString = mCursor.getString(columnIndex);
if(taint_ != Taint.TAINT_CLEAR)
{
Taint.addTaintString(retString, taint_);
}
//結(jié)束污點(diǎn)標(biāo)記
return retString;
}
由于針對(duì)Android系統(tǒng)原生的API的擴(kuò)展,因此在完成修改之后,需要更新frameworks/base/api/下的current.txt文件,使得修改后的API生效,操作命令為在編譯Android系統(tǒng)之前,在終端輸入make update?api。
2.3 污點(diǎn)數(shù)據(jù)傳播模塊
在Android系統(tǒng)中,有關(guān)Binder的實(shí)現(xiàn)在各個(gè)層都有,主要的Binder庫由本地原生代碼實(shí)現(xiàn)。Java和C++層都定義有相同功能的Binder接口,供應(yīng)用程序使用,他們實(shí)際都是調(diào)用原生Binder庫的實(shí)現(xiàn)。Binder的系統(tǒng)架構(gòu)如圖3所示。
在源代碼中定義了Parcel類,并對(duì)當(dāng)前數(shù)據(jù)位置讀取寄存器中值的方法定義進(jìn)行了修改:
public final int readInt()
{
//開始污點(diǎn)數(shù)據(jù)追蹤
int start = dataPosition();
int val1 = nativeReadInt(mNativePtr);
int end = dataPosition();
int len = end ? start;
int tag = getTaint(start, len);
int val2 = Taint.addTaintInt(val1, tag);
return val2;
//結(jié)束污點(diǎn)數(shù)據(jù)追蹤
}
同時(shí)在cmds\servicemanager\binder.c下添加在數(shù)據(jù)傳輸時(shí)進(jìn)行污點(diǎn)標(biāo)記的命令函數(shù)。在完成IPC的污點(diǎn)設(shè)計(jì)之后,系統(tǒng)需要對(duì)應(yīng)用程序框架層的API進(jìn)行修改。以讀取視頻數(shù)據(jù)為例,在源代碼中插入了污點(diǎn)追蹤代碼。
2.4 污點(diǎn)標(biāo)記提取模塊
污點(diǎn)標(biāo)記的提取發(fā)生在污點(diǎn)數(shù)據(jù)到達(dá)目標(biāo)應(yīng)用程序時(shí),與敏感數(shù)據(jù)離開應(yīng)用程序時(shí)進(jìn)行污點(diǎn)標(biāo)記類似,可以通過擴(kuò)展應(yīng)用程序框架層和Dalvik虛擬機(jī)中的相關(guān)函數(shù),完成污點(diǎn)標(biāo)記的提取。在完成Dalvik虛擬機(jī)污點(diǎn)標(biāo)記提取的功能之后,需要擴(kuò)展應(yīng)用程序框架層API功能,使其可以根據(jù)污點(diǎn)標(biāo)記的來源判斷應(yīng)用程序行為是否屬于惡意行為。
以發(fā)送短信方法SmsManager為例,由于Android系統(tǒng)中發(fā)送短信和數(shù)據(jù)都要使用SmsManager類的API,因此經(jīng)常被惡意軟件調(diào)用,將用戶敏感信息發(fā)送給遠(yuǎn)程主機(jī)或者直接發(fā)送短信息到高額扣費(fèi)號(hào)碼。通過擴(kuò)展SmsManager類中sendTextMessage方法,使其可以判斷變量類型的來源。
2.5 應(yīng)用程序分析模塊
在整個(gè)監(jiān)控系統(tǒng)完成之后,就可以將Android應(yīng)用程序放入該系統(tǒng)中運(yùn)行。在程序運(yùn)行期間記錄其操作,并輸出到系統(tǒng)外部。因此該模塊設(shè)計(jì)分為兩部分。
2.5.1 Logcat輸出日志
Logcat是Android系統(tǒng)中集成的一個(gè)命令行工具,Android系統(tǒng)日志存儲(chǔ)在循環(huán)緩沖區(qū)中,通過logcat就可以記錄和查看這些系統(tǒng)信息,其默認(rèn)命令為[adb] logcat [
每一個(gè)輸出的Android日志信息都有一個(gè)標(biāo)簽和優(yōu)先級(jí),Android系統(tǒng)中默認(rèn)的標(biāo)簽其優(yōu)先級(jí)由高到低分別為Verbose,Debug,Info,Warning,Error,F(xiàn)atal,Silent。其中最高級(jí)的Silent一般沒有信息輸出。監(jiān)控系統(tǒng)經(jīng)過改造之后,在logcat中新增了taintlong標(biāo)簽,通過adb logcat dalvikvm:W OSNetworkSystem:W*:S以及進(jìn)一步操作,就可以在logcat日志中提取出污點(diǎn)數(shù)據(jù)傳播的相關(guān)信息。
2.5.2 自動(dòng)化程序安裝測試
要運(yùn)行應(yīng)用程序,首先要啟動(dòng)其主活動(dòng)main avtivity。在Android應(yīng)用程序中,AndroidManifest.xml描述了main activity等信息。因此系統(tǒng)首先通過Python語言中的zipfile模塊解壓apk文件,然后通過AXMLPrinter對(duì)AndroidManifest.xml進(jìn)行讀取。通常定義為“android.intent.action.MAIN”標(biāo)簽的活動(dòng)即為其main activity。
3 系統(tǒng)測試及結(jié)果分析
測試環(huán)境基于Ubuntu 12.04系統(tǒng),Android系統(tǒng)為修改后的4.1.1版本。同時(shí)為了移植到Pandaboard進(jìn)行測試,需要下載適用于Pandaboard的OMAP?Panda內(nèi)核。
在程序運(yùn)行時(shí),會(huì)自動(dòng)完成發(fā)送SMS、網(wǎng)絡(luò)訪問、讀寫文件、解密以及撥打電話的功能。在程序運(yùn)行時(shí)運(yùn)行腳本collect.py,在Ubuntu系統(tǒng)終端可以獲得應(yīng)用程序的全部行為信息。
通過分析測試結(jié)果可以發(fā)現(xiàn),該測試應(yīng)用程序在運(yùn)行時(shí)立刻撥打了電話,同時(shí)在后臺(tái)啟動(dòng)了讀取文件,并且未經(jīng)用戶允許在后臺(tái)發(fā)送了短信。這些行為均會(huì)被惡意軟件濫用,給手機(jī)用戶帶來嚴(yán)重?fù)p失。同時(shí)該應(yīng)用程序開啟了大量服務(wù),對(duì)系統(tǒng)運(yùn)行也會(huì)造成一定的負(fù)擔(dān)。
通過查看該測試樣本源代碼中聲明的相應(yīng)功能和測試結(jié)果相對(duì)比,可以看出本系統(tǒng)能比較準(zhǔn)確地反映樣本的行為特征,其中寫文件、向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)及信息泄露是惡意軟件的常見特征。
由于本系統(tǒng)對(duì)Android原生系統(tǒng)進(jìn)行了修改,運(yùn)用動(dòng)態(tài)分析技術(shù)監(jiān)測應(yīng)用程序的行為特征,因此會(huì)對(duì)系統(tǒng)運(yùn)行性能產(chǎn)生一定影響。本系統(tǒng)的性能評(píng)測標(biāo)準(zhǔn)包括開機(jī)時(shí)間、程序啟動(dòng)時(shí)間和測試樣本從運(yùn)行到首次記錄到行為信息的時(shí)間。
首先針對(duì)系統(tǒng)進(jìn)行開機(jī)時(shí)間測試。一共進(jìn)行了5次測試,每次的開機(jī)時(shí)間如表2所示。
通過表2可以發(fā)現(xiàn),原生系統(tǒng)平均開機(jī)時(shí)間為50.2 s,監(jiān)控系統(tǒng)平均開機(jī)時(shí)間為53.4 s,性能下降6%。由于監(jiān)控系統(tǒng)主要針對(duì)Dalvik虛擬機(jī)和應(yīng)用程序框架層的修改,未對(duì)系統(tǒng)內(nèi)核進(jìn)行修改,在開機(jī)啟動(dòng)方面監(jiān)控系統(tǒng)與原生系統(tǒng)相差不大,同時(shí)對(duì)系統(tǒng)運(yùn)行穩(wěn)定性未造成影響。
系統(tǒng)運(yùn)行應(yīng)用程序的時(shí)間測試,包括載入APK、創(chuàng)建聯(lián)系人、撥出電話和拍照四個(gè)方面,測試結(jié)果如表3所示。
通過表3可以發(fā)現(xiàn),監(jiān)控系統(tǒng)在進(jìn)行相關(guān)操作時(shí)所用時(shí)間均大于原生系統(tǒng),這是因?yàn)樵谶M(jìn)行相應(yīng)操作時(shí)還需要進(jìn)行污點(diǎn)標(biāo)記的功能,但是整體上未對(duì)系統(tǒng)帶來大量負(fù)載。值得注意的是,在進(jìn)行拍照操作時(shí),監(jiān)控系統(tǒng)比原生系統(tǒng)多耗費(fèi)了47%的時(shí)間,這主要是因?yàn)榕恼詹僮餍枰M(jìn)行額外的針對(duì)文件的污點(diǎn)標(biāo)記。
通過表4可以發(fā)現(xiàn),不同應(yīng)用程序首次獲得行為信息的時(shí)間差距很大,這是由應(yīng)用程序完成的不同功能導(dǎo)致的。總體而言,監(jiān)控系統(tǒng)可以較快地響應(yīng)和記錄程序運(yùn)行期間的行為。
4 結(jié) 論
本文應(yīng)用基于污點(diǎn)傳播的動(dòng)態(tài)分析技術(shù),針對(duì)目前Android系統(tǒng)面臨的隱私泄漏、惡意扣費(fèi)等安全威脅,設(shè)計(jì)了基于行為分析的Android安全監(jiān)控系統(tǒng)。測試結(jié)果表明,該系統(tǒng)可以發(fā)現(xiàn)并記錄絕大部分惡意軟件的行為信息,并且運(yùn)行穩(wěn)定能較快地響應(yīng)應(yīng)用程序行為進(jìn)行記錄。
目前使用沙箱進(jìn)行動(dòng)態(tài)分析,采用的是單線程的方式,導(dǎo)致分析的效率還不夠理想,因此下一步還需要研究使用多線程方式一次分析多個(gè)程序的可行性。
參考文獻(xiàn)
[1] 劉洪濤.基于Android系統(tǒng)的安全防護(hù)軟件設(shè)計(jì)與實(shí)現(xiàn)[D].天津:南開大學(xué),2011.
[2] YEUNG D Y, DING Y X. Host?based intrusion detection using dynamic and static behavioral models [J]. Pattern recognition, 2003, 36(1): 229?243.
[3] 豐生強(qiáng).Android軟件安全與逆向分析[M].北京:人民郵電出版社,2013.
[4] PAYET E, SPOTO F. Static analysis of Android programs [J]. Information and software technology, 2012, 54(11): 1192?1201.
[5] 張宏飛,包睿,李超.工業(yè)自動(dòng)化監(jiān)控系統(tǒng)中PLC技術(shù)的應(yīng)用研究[J].現(xiàn)代電子技術(shù),2015,38(11):150?151.
[6] 任肖麗,陳佳喜,王驥.基于GPRS技術(shù)在線環(huán)境監(jiān)測系統(tǒng)的研究[J].現(xiàn)代電子技術(shù),2015,38(4):60?62.