本發(fā)明屬于信息安全技術(shù)、Android惡意軟件檢測(cè)技術(shù)領(lǐng)域,具體涉及一種Android軟件動(dòng)態(tài)行為分析中的路徑感知方法。
背景技術(shù):
隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展和智能手機(jī)的普及,基于Android系統(tǒng)的各類應(yīng)用出現(xiàn)爆發(fā)式增長(zhǎng),截至2014年底Google Play上最新應(yīng)用數(shù)量已經(jīng)達(dá)到了143萬(wàn),非官方應(yīng)用電子商店提供的應(yīng)用數(shù)量更為龐大。但在增長(zhǎng)的同時(shí),Android軟件的安全性問(wèn)題也不容忽視。2014年Android惡意軟件繼續(xù)保持高速增長(zhǎng)。據(jù)阿里巴巴移動(dòng)安全年度報(bào)告顯示,2014年第四季度Android惡意軟件感染設(shè)備量月均漲幅高達(dá)45%,感染安卓設(shè)備高達(dá)1833萬(wàn)臺(tái),阿里聚安全查殺病毒高達(dá)2528萬(wàn)個(gè)。大多數(shù)情況下,Android惡意軟件具有惡意扣費(fèi)、隱私竊取、短信劫持等惡意行為,其目標(biāo)主要是獲取用戶的金融信息。例如源自俄羅斯的手機(jī)版Carberp木馬可以竊取用戶發(fā)送給銀行服務(wù)器的登錄數(shù)據(jù)。由此可見(jiàn),Android軟件安全性問(wèn)題日益凸顯,Android惡意軟件越來(lái)越嚴(yán)重地威脅著終端用戶的隱私和權(quán)益。
當(dāng)前,企業(yè)界和科研院所已經(jīng)加強(qiáng)了對(duì)Android惡意軟件檢測(cè)方法的研究。動(dòng)態(tài)檢測(cè)因其檢測(cè)準(zhǔn)確率高的優(yōu)勢(shì),在Android惡意軟件檢測(cè)過(guò)程中起了關(guān)鍵作用。動(dòng)態(tài)檢測(cè)主要是把Android應(yīng)用軟件安裝到Android沙箱上運(yùn)行,并觀察應(yīng)用軟件在沙箱中是否會(huì)實(shí)際調(diào)用敏感API來(lái)表現(xiàn)出惡意行為。這里的敏感API是指需要顯式申請(qǐng)操作權(quán)限的系統(tǒng)調(diào)用函數(shù)。Android沙箱是在Android模擬器的基礎(chǔ)上,對(duì)一些系統(tǒng)敏感API進(jìn)行劫持,如果應(yīng)用軟件運(yùn)行過(guò)程中調(diào)用這些敏感API時(shí),就會(huì)被實(shí)時(shí)記錄下來(lái),證實(shí)該軟件具有相應(yīng)的惡意行為。目前,雖然動(dòng)態(tài)檢測(cè)的準(zhǔn)確率高,可以記錄惡意行為的觸發(fā),但是卻無(wú)法獲取惡意行為的整個(gè)函數(shù)執(zhí)行路徑及上下文環(huán)境。
Android軟件動(dòng)態(tài)行為分析技術(shù)目前面臨的一個(gè)問(wèn)題是如何有效自動(dòng)化的驗(yàn)證被測(cè)軟件具有的惡意行為,即動(dòng)態(tài)分析僅僅能夠檢測(cè)出軟件具有的敏感行為,卻無(wú)法自動(dòng)化的溯源整個(gè)執(zhí)行路徑現(xiàn)場(chǎng),也就無(wú)法有效的驗(yàn)證敏感行為。因?yàn)橥ㄟ^(guò)動(dòng)態(tài)分析給出的Android軟件的惡意行為可能是與該軟件無(wú)關(guān)的其他程序在滿足某一特定條件下觸發(fā)的,例如:Android沙箱在檢測(cè)某被測(cè)軟件時(shí),此時(shí)與該軟件無(wú)關(guān)的一個(gè)后臺(tái)服務(wù)讀取了用戶通訊錄信息,則動(dòng)態(tài)沙 箱檢測(cè)結(jié)果誤報(bào)該被測(cè)軟件存在讀取通訊錄行為。對(duì)此,業(yè)界的解決方法主要有兩種,一是對(duì)被測(cè)程序進(jìn)行代碼插樁;二是輸出敏感函數(shù)執(zhí)行的函數(shù)調(diào)用棧信息。第一種方法被測(cè)程序代碼插樁,需要修改被測(cè)軟件smali代碼,并對(duì)軟件進(jìn)行二次打包,由于目前Android軟件中加入的代碼對(duì)抗機(jī)制,導(dǎo)致一旦插樁Android軟件運(yùn)行就會(huì)報(bào)錯(cuò),所以該方法的成功率不高。第二種方法輸出敏感函數(shù)執(zhí)行的函數(shù)調(diào)用棧信息,通過(guò)打印函數(shù)調(diào)用棧,獲取敏感操作的執(zhí)行路徑,但是這種方法只能輸出敏感操作的單條執(zhí)行路徑,無(wú)法確定執(zhí)行過(guò)程中的其他操作,丟失了上下文信息。例如對(duì)于將電話號(hào)碼通過(guò)網(wǎng)絡(luò)外發(fā)的惡意行為,第二種方法可以確認(rèn)被測(cè)軟件獲取了電話號(hào)碼,但卻無(wú)法驗(yàn)證電話號(hào)碼通過(guò)網(wǎng)絡(luò)進(jìn)行了外發(fā)。因此,設(shè)計(jì)出一種Android動(dòng)態(tài)行為分析中的路徑感知方法顯得尤為重要。
技術(shù)實(shí)現(xiàn)要素:
鑒于以上問(wèn)題,本發(fā)明的目的是提供一種Android動(dòng)態(tài)行為分析中的路徑感知方法,通過(guò)獲取Android軟件運(yùn)行時(shí)函數(shù)調(diào)用關(guān)系,并通過(guò)路徑過(guò)濾去除系統(tǒng)API調(diào)用信息,大大提高了執(zhí)行效率,從而解決了在一個(gè)基于Android動(dòng)態(tài)行為分析環(huán)境里,無(wú)法高效輸出被測(cè)軟件程序執(zhí)行路徑的問(wèn)題。
本發(fā)明首先通過(guò)在Android程序執(zhí)行端獲取函數(shù)兩兩調(diào)用信息,包括被測(cè)軟件函數(shù)調(diào)用和操作系統(tǒng)函數(shù)調(diào)用。操作系統(tǒng)函數(shù)調(diào)用關(guān)系數(shù)目龐大,如果記錄大量系統(tǒng)調(diào)用信息會(huì)在很大程度上影響程序執(zhí)行端的性能,所以需要通過(guò)路徑過(guò)濾去除系統(tǒng)調(diào)用信息。由于通過(guò)被測(cè)軟件包名過(guò)濾操作系統(tǒng)函數(shù)調(diào)用的方式,軟件包名的數(shù)量無(wú)法估計(jì),而且在程序執(zhí)行端函數(shù)調(diào)用中操作系統(tǒng)函數(shù)調(diào)用的數(shù)量遠(yuǎn)大于第三方軟件函數(shù)調(diào)用的數(shù)量,所以,通過(guò)被測(cè)軟件包名匹配進(jìn)行過(guò)濾的方式,匹配成功率很低,性能低下,實(shí)際應(yīng)用中,該方法很難實(shí)施。為了真正提高Android程序執(zhí)行端的性能,本發(fā)明基于已知的操作系統(tǒng)API的包名,對(duì)函數(shù)調(diào)用關(guān)系的輸出采用二級(jí)包名前端匹配的方法,對(duì)于二級(jí)包名匹配成功的函數(shù)調(diào)用進(jìn)行過(guò)濾,從而過(guò)濾掉操作系統(tǒng)函數(shù)調(diào)用信息。獲取被測(cè)軟件函數(shù)調(diào)用信息后,路徑解析通過(guò)對(duì)函數(shù)兩兩調(diào)用日志進(jìn)行分析,從而生成完整的函數(shù)執(zhí)行路徑。
本發(fā)明從結(jié)構(gòu)上主要包括三個(gè)部分:路徑獲取、路徑過(guò)濾、路徑解析。路徑獲取負(fù)責(zé)截獲Android軟件的函數(shù)調(diào)用信息,即在軟件運(yùn)行過(guò)程中獲取發(fā)生函數(shù)調(diào)用時(shí)的主調(diào)函數(shù)和被調(diào)函數(shù)信息。路徑過(guò)濾通過(guò)對(duì)已知的操作系統(tǒng)函數(shù)包名進(jìn)行二級(jí)包名前端匹配,實(shí)現(xiàn)對(duì)已知的系統(tǒng)函數(shù)調(diào)用進(jìn)行過(guò)濾。經(jīng)過(guò)路徑獲取與路徑過(guò)濾,函數(shù)調(diào)用日志信息被輸出到動(dòng)態(tài)行為分析模塊的指定文件中。路徑解析負(fù)責(zé)解析指定文件中的函數(shù)兩兩調(diào)用關(guān)系,將直接的函數(shù)調(diào)用進(jìn)行拼接,同時(shí)由于Android中可以使用AsyncTask和Handler兩種方式來(lái)進(jìn)行異步處理, 所以路徑解析也需要對(duì)文件中函數(shù)的間接調(diào)用,即異步調(diào)用進(jìn)行查找與拼接,從而生成函數(shù)執(zhí)行全路徑。
本發(fā)明提供的技術(shù)方案如下:
本發(fā)明是采用路徑獲取和路徑過(guò)濾相結(jié)合的方式在程序執(zhí)行端獲取Android軟件執(zhí)行過(guò)程中的函數(shù)兩兩調(diào)用關(guān)系,通過(guò)路徑獲取得到程序執(zhí)行時(shí)的函數(shù)調(diào)用信息,然后通過(guò)路徑過(guò)濾去除操作系統(tǒng)函數(shù)調(diào)用信息,最后通過(guò)路徑解析得到被測(cè)軟件的執(zhí)行全路徑。具體步驟如下:
1)獲取函數(shù)調(diào)用信息。在對(duì)被測(cè)軟件進(jìn)行動(dòng)態(tài)行為分析過(guò)程中,從程序執(zhí)行端截獲被測(cè)軟件程序在發(fā)生函數(shù)調(diào)用時(shí)的主調(diào)函數(shù)信息和被調(diào)函數(shù)信息。
Android操作系統(tǒng)在執(zhí)行函數(shù)調(diào)用時(shí)dalvik虛擬機(jī)使用invokeXXX指令完成調(diào)用操作,包括了invokeVirtual指令、invokeSuper指令、invokeInterface指令、invokeDirect指令、invokeStatic指令、invokeVirtualQuick指令、invokeSuperQuick指令,這些指令的內(nèi)部調(diào)用關(guān)系如圖1所示,由于這些指令均會(huì)調(diào)用invokeMethod指令,同時(shí)該指令中包含有主調(diào)函數(shù)和被調(diào)函數(shù),所以路徑獲取首先通過(guò)invokeMethod指令獲取函數(shù)調(diào)用的主調(diào)函數(shù)和被調(diào)函數(shù)信息。
2)路徑過(guò)濾判斷主調(diào)函數(shù)是否是系統(tǒng)函數(shù)。由于Android操作系統(tǒng)API函數(shù)調(diào)用數(shù)目龐大,如果記錄所有的函數(shù)調(diào)用關(guān)系會(huì)帶來(lái)系統(tǒng)性能的嚴(yán)重下降,所以需要過(guò)濾主調(diào)函數(shù)是系統(tǒng)API的調(diào)用?;谝阎牟僮飨到y(tǒng)API的包名,對(duì)函數(shù)調(diào)用關(guān)系中的主調(diào)函數(shù)采用二級(jí)包名前端匹配的方法,若匹配成功,則認(rèn)為該主調(diào)函數(shù)是系統(tǒng)函數(shù),否則認(rèn)為該主調(diào)函數(shù)為被測(cè)軟件函數(shù)。
本發(fā)明所述二級(jí)包名為JAVA包名中第二個(gè)分隔符之前的部分,例如com.android.xxx中,二級(jí)包名為com.android。本發(fā)明所述二級(jí)包名前端匹配的方法是指:(圈定Android操作系統(tǒng)API二級(jí)包名種子列表,提取主調(diào)函數(shù)所在類的二級(jí)包名,將該二級(jí)包名與種子列表進(jìn)行精確匹配)。
3)打印被測(cè)軟件函數(shù)兩兩調(diào)用關(guān)系。對(duì)于主調(diào)函數(shù)為被測(cè)軟件函數(shù)的函數(shù)調(diào)用,打印主調(diào)函數(shù)和被調(diào)函數(shù)信息;對(duì)于主調(diào)函數(shù)是系統(tǒng)函數(shù)的函數(shù)調(diào)用,過(guò)濾該函數(shù)調(diào)用信息。
4)路徑解析分析日志文件,生成函數(shù)調(diào)用全路徑信息。軟件運(yùn)行完成后,所有日志信息被輸出到動(dòng)態(tài)行為分析模塊的指定文件中,路徑解析讀取日志文件中函數(shù)兩兩調(diào)用關(guān)系,對(duì)直接函數(shù)調(diào)用按照函數(shù)名進(jìn)行拼接,對(duì)間接函數(shù)調(diào)用按照不同的異步處理方式進(jìn)行拼接,最終生成函數(shù)調(diào)用全路徑信息。
5)判定檢測(cè)結(jié)果。如果動(dòng)態(tài)行為分析檢測(cè)出軟件具有敏感行為,并且有該行為對(duì)應(yīng)的函數(shù)調(diào)用路徑上下文信息,則可以自動(dòng)化的驗(yàn)證該敏感行為。
與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為:
本發(fā)明能夠獲取被測(cè)軟件敏感行為的整個(gè)執(zhí)行路徑,從而自動(dòng)化的驗(yàn)證Android軟件存在的敏感行為,而目前已知的兩種方法分別存在成功率不高和只能獲取敏感行為單條執(zhí)行路徑信息問(wèn)題,均無(wú)法有效地輸出整個(gè)敏感行為的執(zhí)行路徑上下文信息。同時(shí),由于該技術(shù)使用了路徑過(guò)濾方法,通過(guò)采用二級(jí)包名前端匹配的方式過(guò)濾了已知的操作系統(tǒng)API調(diào)用信息,提高了Android程序執(zhí)行端的執(zhí)行效率。
附圖說(shuō)明
圖1是Android dalvik虛擬機(jī)invoke指令調(diào)用及本發(fā)明方法框架圖。
圖2是本發(fā)明方法的邏輯流程圖。
圖3是實(shí)施例中采用本發(fā)明方法生成的執(zhí)行路徑圖。
具體實(shí)施方式
為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面通過(guò)具體實(shí)施例和附圖,對(duì)本發(fā)明做進(jìn)一步說(shuō)明。
污點(diǎn)跟蹤是Android軟件動(dòng)態(tài)行為分析的重要方法,通過(guò)跟蹤敏感數(shù)據(jù)源,可以檢測(cè)被測(cè)軟件是否具有隱私泄漏等惡意行為。但是,目前的污點(diǎn)跟蹤只是單純的數(shù)據(jù)流分析,無(wú)法提供Android軟件程序執(zhí)行的控制流信息,所以,現(xiàn)有的動(dòng)態(tài)污點(diǎn)跟蹤方法無(wú)法對(duì)被測(cè)軟件存在的敏感行為進(jìn)行有效的驗(yàn)證,無(wú)法溯源?;诖耍景l(fā)明使用了一種Android動(dòng)態(tài)行為分析中的路徑感知方法,其邏輯流程圖如圖2所示。
在污點(diǎn)跟蹤路徑感知插件中,當(dāng)Android軟件啟動(dòng)后,程序執(zhí)行端開(kāi)始截獲軟件執(zhí)行時(shí)的函數(shù)調(diào)用指令(包括:invokeVirtual指令、invokeSuper指令、invokeInterface指令、invokeDirect指令、invokeStatic指令、invokeVirtualQuick指令、invokeSuperQuick指令),這些指令的內(nèi)部調(diào)用關(guān)系如圖1所示,由于這些指令均會(huì)調(diào)用invokeMethod指令,同時(shí)該指令中包含有主調(diào)函數(shù)和被調(diào)函數(shù),所以路徑獲取首先通過(guò)invokeMethod指令獲取函數(shù)調(diào)用的主調(diào)函數(shù)和被調(diào)函數(shù)信息,例如:路徑獲取截獲函數(shù)調(diào)用中某主調(diào)函數(shù)為L(zhǎng)com/baidu/mapapi/Mj;e()V。
在獲取函數(shù)調(diào)用信息后,需要判斷主調(diào)函數(shù)是否是操作系統(tǒng)函數(shù)。根據(jù)Android的開(kāi)源性可知,已知的操作系統(tǒng)API的包名一般以Lcom/android/、Lcom/google、Lorg/apache/等字符串開(kāi)頭,因此可通過(guò)二級(jí)包匹配的方法名前端對(duì)主調(diào)函數(shù)進(jìn)行判定。當(dāng)遇到主調(diào)函數(shù)是操作系統(tǒng)函數(shù)時(shí),不對(duì)該調(diào)用進(jìn)行其他操作;當(dāng)遇到主調(diào)函數(shù)是被測(cè)軟件函數(shù)時(shí),需要劫持該函數(shù)調(diào)用信息,方法是在invokeMethod指令中加上Log函數(shù),把函數(shù)調(diào)用中主調(diào)函數(shù)和被調(diào)函數(shù)的函數(shù)名、參數(shù)、返回值都用Log函數(shù)進(jìn)行打印,如該方法打印的某條日志為: Lcom/baidu/mapapi/Mj;e()V->Landroid/content/ContextWrapper;getSystemService(Ljava/lang/Stri ng;)Ljava/lang/Object;,這條日志表明被測(cè)軟件函數(shù)Lcom/baidu/mapapi/Mj;e()V調(diào)用了函數(shù)Landroid/content/ContextWrapper;getSystemService(Ljava/lang/String;)Ljava/lang/Object;。
被測(cè)軟件在污點(diǎn)跟蹤模塊運(yùn)行結(jié)束后,所有日志信息輸出到模塊的/tmp/anal.log文件中,部分日志信息如下:
D/VARAS_ASMA(1872):1|
Lcom/baidu/mapapi/BMapManager;init(Ljava/lang/String;Lcom/baidu/mapapi/MKGeneralList ener;)Z->Lcom/baidu/mapapi/Mj;<init>(Lcom/baidu/mapapi/BMapManager;Landroid/content/Con text;)V
D/VARAS_ASMA(1872):1|
Lcom/baidu/mapapi/Mj;<init>(Lcom/baidu/mapapi/BMapManager;Landroid/content/Context;)V->Lcom/baidu/mapapi/Mj;e()V
D/VARAS_ASMA(1872):1|
Lcom/baidu/mapapi/Mj;e()V->Landroid/content/ContextWrapper;getSystemService(Ljava/lang/String;)Ljava/lang/Object;
D/VARAS_ASMA(1872):1|
Lcom/baidu/mapapi/Mj;e()V->Landroid/telephony/TelephonyManager;getDeviceId()Ljava/lan g/String;
接著,路徑解析讀取/tmp/anal.log文件中函數(shù)兩兩調(diào)用關(guān)系,通過(guò)自上而下讀文件的方式對(duì)兩兩函數(shù)調(diào)用進(jìn)行拼接。對(duì)于直接函數(shù)調(diào)用,日志解析直接根據(jù)被調(diào)函數(shù)名向下查找與其相同的主調(diào)函數(shù)名。對(duì)于間接函數(shù)調(diào)用,日志解析根據(jù)不同的異步處理方式對(duì)函數(shù)調(diào)用進(jìn)行拼接,如當(dāng)遇到函數(shù)名中包含“;onPreExecute(”字符串時(shí),可初步確定存在AsyncTask類的異步調(diào)用,所以需要向下查找相同類名下函數(shù)名中包含“;doInBackground(”字符串的函數(shù)進(jìn)行拼接;當(dāng)遇到函數(shù)名中包含“;start()V”字符串時(shí),初步確定此處存在線程啟動(dòng),路徑解析則向下查找相同類名下函數(shù)名中包含“;run()V”字符串的函數(shù)進(jìn)行拼接。拼接完成后,即得到完整的被測(cè)軟件函數(shù)執(zhí)行路徑。
如果動(dòng)態(tài)污點(diǎn)跟蹤模塊中初步確認(rèn)被測(cè)軟件有敏感信息泄露,如:<?xml version='1.0'encoding='utf-8'standalone='yes'?>.<map>.<string name="device_id">86404600],該信息表明被測(cè)軟件可能存在泄露設(shè)備IMEI的敏感行為,則可通過(guò)檢測(cè)函數(shù)執(zhí)行路徑中是否有該敏感操作對(duì)應(yīng)的函數(shù)調(diào)用路徑上下文信息,完成動(dòng)態(tài)污點(diǎn)跟蹤模塊對(duì)被測(cè)軟件的判定。
為了驗(yàn)證本發(fā)明動(dòng)態(tài)路徑感知方法對(duì)軟件分析效率的影響微小,本實(shí)驗(yàn)對(duì)比了污點(diǎn)跟蹤 模塊使用路徑感知方法記錄函數(shù)調(diào)用前后的分析時(shí)間,結(jié)果如表1所示。對(duì)比顯示,采用本發(fā)明方法記錄函數(shù)調(diào)用關(guān)系并沒(méi)有影響分析效率。
表1.使用路徑感知方法記錄函數(shù)調(diào)用前后的分析時(shí)間
由于Android操作系統(tǒng)API函數(shù)調(diào)用數(shù)目龐大,如果記錄所有的函數(shù)調(diào)用關(guān)系會(huì)帶來(lái)系統(tǒng)性能的嚴(yán)重下降,所以本發(fā)明采用了二級(jí)包名前端匹配的方法過(guò)濾主調(diào)函數(shù)為系統(tǒng)API的調(diào)用。表2顯示了被測(cè)軟件在采用二級(jí)包名前端匹配方法過(guò)濾前后的對(duì)比,結(jié)果表明由于本發(fā)明的二級(jí)包名前端匹配,被測(cè)軟件函數(shù)調(diào)用關(guān)系的獲取效率大大提高。
表2.采用二級(jí)包名前端匹配方法過(guò)濾前后的對(duì)比
使用動(dòng)態(tài)路徑感知方法,對(duì)函數(shù)調(diào)用關(guān)系進(jìn)行解析提取,生成的執(zhí)行路徑圖如圖3所示,深色陰影所示的節(jié)點(diǎn)表示應(yīng)用的敏感操作,淺色陰影所示的節(jié)點(diǎn)表示調(diào)用的函數(shù)名稱。使用該方法能夠高效的實(shí)時(shí)分析被測(cè)軟件的函數(shù)執(zhí)行路徑信息,為軟件敏感行為的檢測(cè)提供了有力的證據(jù)。
表3是常用的Android動(dòng)態(tài)路徑執(zhí)行信息獲取的方法對(duì)比,結(jié)果顯示本發(fā)明的動(dòng)態(tài)路徑感知方法相對(duì)其他方法具備一定的優(yōu)勢(shì)。
表3.常用的Android動(dòng)態(tài)路徑執(zhí)行信息獲取的方法對(duì)比
本發(fā)明可以應(yīng)用于Android動(dòng)態(tài)行為分析中,上述實(shí)施例僅是其中的一個(gè)示例。其他實(shí)施例還包括了動(dòng)態(tài)行為沙箱的路徑感知、動(dòng)態(tài)手工分析的路徑感知等方面。
以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非對(duì)其進(jìn)行限制,本領(lǐng)域的普通技術(shù)人員可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求書所述為準(zhǔn)。