崔艷鵬 顏 波 胡建偉
(西安電子科技大學(xué)網(wǎng)絡(luò)與信息安全學(xué)院 陜西 西安 710071)
Android平臺(tái)是目前世界上使用最多的智能平臺(tái),占據(jù)了全球85%的市場(chǎng)份額。迄今為止,Google市場(chǎng)有超過(guò)650億次的下載量,比App Store高出2倍[1]。同時(shí),Android平臺(tái)的流行也吸引了許多惡意攻擊者們的興趣,他們開(kāi)發(fā)的惡意軟件可以進(jìn)行各種惡意甚至非法操作,比如:竊取用戶隱私及敏感數(shù)據(jù)、遠(yuǎn)程執(zhí)行代碼、消耗用戶資費(fèi)等行為。這些惡意軟件不僅危及用戶數(shù)據(jù)安全,也威脅到Android系統(tǒng)安全。
根據(jù)獨(dú)立安全機(jī)構(gòu)AV-Test在2018年1月發(fā)表的報(bào)告[2],使用AhnLab、Alibaba、McAfee、Tencent、Kaspersky Lab等19個(gè)手機(jī)殺毒軟件對(duì)2 766個(gè)己知Android惡意應(yīng)用進(jìn)行檢測(cè)發(fā)現(xiàn)各大手機(jī)殺毒軟件對(duì)于已知的惡意應(yīng)用檢測(cè)效果并不理想。
同時(shí),由于當(dāng)前主流的Android惡意軟件檢測(cè)方法都嚴(yán)重依賴API版本和惡意家族樣例,隨著時(shí)間推移,Android API版本的不斷變化和軟件保護(hù)措施的不斷加強(qiáng),這些檢測(cè)方法變得越來(lái)越低效。
針對(duì)上述技術(shù)存在的問(wèn)題,本文提出了一種基于抽象API調(diào)用序列的Android惡意軟件檢測(cè)方法。該方法采用靜態(tài)行為特征提取方法,提取Android應(yīng)用軟件的API調(diào)用序列。然后,通過(guò)基于API包名、混淆名和自定義名的方法來(lái)抽象API調(diào)用序列。該方法能有效地識(shí)別Android系統(tǒng)原生API、Google API、混淆后的API以及開(kāi)發(fā)者自定義的API,且不會(huì)對(duì)API版本產(chǎn)生依賴。最后,將抽象后的API調(diào)用序列作為分類特征來(lái)訓(xùn)練RandomForest分類器。實(shí)驗(yàn)結(jié)果表明,與一般使用API調(diào)用序列作為特征的判別方法相比,本文方法能更有效地檢測(cè)未知應(yīng)用軟件的惡意性,且能適應(yīng)API版本的變化,具有更好的容錯(cuò)性。
目前,關(guān)于Android惡意軟件檢測(cè)的方法比較多,主要有基于動(dòng)態(tài)檢測(cè)和靜態(tài)檢測(cè)方法。但基于動(dòng)態(tài)檢測(cè)的方法在實(shí)驗(yàn)資源成本上會(huì)耗費(fèi)過(guò)大,且代碼覆蓋率不全,導(dǎo)致相應(yīng)特征提取不全,檢測(cè)有效性降低,所以國(guó)內(nèi)外學(xué)者們主要是研究靜態(tài)檢測(cè)方法。當(dāng)前,基于靜態(tài)檢測(cè)的方法主要是從簽名、權(quán)限和API這三大方面進(jìn)行展開(kāi)的。
基于簽名的靜態(tài)檢測(cè)方法[3]是采用了模式匹配的思想。該方法極度依賴已知的惡意軟件簽名庫(kù),無(wú)法對(duì)未知的惡意軟件進(jìn)行檢測(cè)。
基于權(quán)限的靜態(tài)檢測(cè)方法[4-5]主要是從Android系統(tǒng)的權(quán)限安全機(jī)制著手,因?yàn)锳ndroid系統(tǒng)中組件間重要敏感的行為受權(quán)限限制。該方法通過(guò)從應(yīng)用程序的Android Manifest文件中提取權(quán)限字段,建立了正常數(shù)據(jù)和惡意軟件數(shù)據(jù)的所有權(quán)限數(shù)據(jù)庫(kù),最后利用機(jī)器學(xué)習(xí)算法對(duì)Android應(yīng)用中的惡意軟件進(jìn)行分類和識(shí)別。該方法優(yōu)點(diǎn)是簡(jiǎn)單并且很容易實(shí)現(xiàn),缺點(diǎn)是容易出現(xiàn)誤差,比如由于缺乏經(jīng)驗(yàn)的開(kāi)發(fā)者可能事先申請(qǐng)了某些權(quán)限,但其在編程中卻沒(méi)有用到被該權(quán)限作用的函數(shù),因此準(zhǔn)確率較低,且遺漏問(wèn)題嚴(yán)重。
基于API調(diào)用的靜態(tài)檢測(cè)方法[6-7]主要是將Android應(yīng)用程序的信息接口(API)作為突破口。Android應(yīng)用軟件中API的調(diào)用序列存在著大量的行為信息,通過(guò)分析API調(diào)用特征所得到的特征向量,再結(jié)合多種分類算法,可以對(duì)Android惡意軟件進(jìn)行檢測(cè)。文獻(xiàn)[8]提出了一種DroidAPIMiner分類器,該分類器從應(yīng)用軟件的字節(jié)碼中提取API和其他參數(shù),并且對(duì)API的使用頻率進(jìn)行統(tǒng)計(jì),最后使用了不同的機(jī)器學(xué)習(xí)的方法處理了這些特征。文獻(xiàn)[9]提出了權(quán)限和API特征結(jié)合的檢測(cè)方法,主要通過(guò)將權(quán)限和高危的20種API結(jié)合起來(lái)作為一個(gè)特征集合。實(shí)驗(yàn)驗(yàn)證了該方法的準(zhǔn)確率比將單一的權(quán)限或者API作為特征的準(zhǔn)確率要高。但是文獻(xiàn)中指出的20種高危API可能會(huì)被混淆后的名字代替,從而該方法會(huì)漏掉這一關(guān)鍵特征,檢測(cè)效率也將有偏差。文獻(xiàn)[10]提出了一種改進(jìn)的多級(jí)簽名檢測(cè)方法,將簽名和API結(jié)合起來(lái),對(duì)方法和類的簽名進(jìn)行多級(jí)匹配。但是該方法依賴已知惡意軟件家族,實(shí)驗(yàn)訓(xùn)練樣本是已知的惡意軟件,測(cè)試樣本則是訓(xùn)練樣本進(jìn)行變種后,按照比例挑選出來(lái)的。同時(shí),該方法檢測(cè)精度也只有88%。文獻(xiàn)[11]提取了多項(xiàng)特征數(shù)據(jù),包括通過(guò)靜態(tài)檢測(cè)方法獲取的權(quán)限、API調(diào)用信息和通過(guò)動(dòng)態(tài)檢測(cè)方法獲取的日志文件作為總體特征。雖然他們的實(shí)驗(yàn)檢測(cè)效率達(dá)到94%,且在準(zhǔn)確性方面優(yōu)于其他反病毒系統(tǒng),但是檢測(cè)模型的質(zhì)量取決于良性樣本集合和惡意樣本集合。文獻(xiàn)[12]提出了一種基于上下文信息的檢測(cè)方法,該方法提取敏感API編程接口,并分析其行為的激活事件和條件因子,生成語(yǔ)境特征,該方法精確度達(dá)92.86%,但是文獻(xiàn)中實(shí)驗(yàn)數(shù)據(jù)集太少,只有266個(gè),實(shí)驗(yàn)數(shù)據(jù)具有特殊性。
基于靜態(tài)檢測(cè)的方法方便、快速、代碼覆蓋率高,但是必須考慮到兩個(gè)問(wèn)題:一方面,隨著Android安全技術(shù)的不斷提高,很多應(yīng)用軟件均被使用了混淆等保護(hù)技術(shù),獲取混淆后APK所包含的相關(guān)特征信息變得困難;另一方面,目前現(xiàn)有的Android惡意軟件靜態(tài)檢測(cè)方法都無(wú)法適應(yīng)API版本的更替,隨著API版本的更改,檢測(cè)效率會(huì)降低。因此,本文提出的檢測(cè)方法是采用API包名、混淆名和自定義名來(lái)抽象API調(diào)用序列,使得抽象出來(lái)的序列不依賴API版本,同時(shí)又包含了混淆代碼特征,具有更好的容錯(cuò)性。
基于抽象的API調(diào)用序列的Android惡意軟件檢測(cè)方法通過(guò)對(duì)提取出的API調(diào)用序列進(jìn)行多層次的抽象描述,然后計(jì)算抽象API調(diào)用序列之間的轉(zhuǎn)移概率作為分類特征,最后通過(guò)RandomForest算法來(lái)達(dá)到區(qū)分惡意軟件的效果。實(shí)驗(yàn)的整體設(shè)計(jì)框架如圖1所示。
圖1 實(shí)驗(yàn)設(shè)計(jì)框架圖
為了使實(shí)驗(yàn)樣本包含不同API版本,本文從各大應(yīng)用市場(chǎng)下載各類別的不同版本的熱門軟件,良性應(yīng)用軟件集總共3 000個(gè)。其中:前1 500個(gè)API版本均在24~27之間,這些版本是目前市場(chǎng)上多數(shù)使用的API版本;后1 500個(gè)API版本均在16~23之間,這些版本是比較老的API版本,但依舊占據(jù)小部分市場(chǎng)。同時(shí),上述良性應(yīng)用軟件集都是通過(guò)殺毒軟件的過(guò)濾篩除后得到的。實(shí)驗(yàn)中的惡意應(yīng)用軟件集來(lái)自于VirusShare.com[13]中提供的2 000個(gè)惡意軟件。
為了更好地訓(xùn)練分類器和獲取更好的分類結(jié)果,本實(shí)驗(yàn)中訓(xùn)練樣本集合與測(cè)試樣本集合的比例為8∶2。表1給出了本實(shí)驗(yàn)數(shù)據(jù)的具體劃分情況。
表1 實(shí)驗(yàn)訓(xùn)練集與測(cè)試集劃分
Android 系統(tǒng)中的API是可以提供給Android應(yīng)用軟件開(kāi)發(fā)者調(diào)用的系統(tǒng)接口。隨著Android版本的不斷更新,Android應(yīng)用軟件開(kāi)發(fā)者不僅使用Android系統(tǒng)原生API,還包括Google API。這些API包含豐富的功能函數(shù),其為上層應(yīng)用軟件提供框架支撐和行為實(shí)現(xiàn)。獲取API調(diào)用序列的一種方法就是獲取Android應(yīng)用程序的函數(shù)調(diào)用關(guān)系圖,通過(guò)對(duì)函數(shù)關(guān)系圖的分析,獲取API 調(diào)用序列。
圖2為原始API的表達(dá)形式,其中包含的信息有:API所屬的包名(java.lang.String)、函數(shù)名(getBytes)、函數(shù)返回值類型(bytes)。
圖2 API示意圖
2.2.1函數(shù)調(diào)用關(guān)系圖的提取
對(duì)于Android應(yīng)用軟件的函數(shù)調(diào)用關(guān)系圖的提取,本文使用了AndroidGuard工具。AndroidGuard可以進(jìn)行程序流程圖的生成,還能通過(guò)圖形化的方式輸出,讓用戶對(duì)程序有直觀的了解。
為了更好地說(shuō)明本文方法的不同之處,以一個(gè)真實(shí)的惡意軟件樣本作為運(yùn)行實(shí)例。圖3列出惡意樣本malicious1.apk反編譯后提取出來(lái)的類。圖3中的代碼片段表示本地保存的短信內(nèi)容、電話等信息會(huì)上傳到服務(wù)器。
圖3 Malicious1.apk中zjSevice類的代碼片段
這個(gè)惡意軟件偽裝成一個(gè)圖片查看器的應(yīng)用軟件,但其中包含惡意行為:惡意記錄短信內(nèi)容、電話號(hào)碼等敏感信息到本地并上傳到某服務(wù)器上,導(dǎo)致隱私數(shù)據(jù)泄露。為了清晰地描述API的調(diào)用關(guān)系,本文只分析圖3 uploadAllfiles函數(shù),且忽略了對(duì)象初始化、返回類型和參數(shù)以及方法中隱式調(diào)用的調(diào)用關(guān)系。該函數(shù)的API調(diào)用關(guān)系如圖4所示。
圖4 uploadAllfiles函數(shù)的調(diào)用關(guān)系圖
2.2.2API調(diào)用序列的提取
本文從獲取到應(yīng)用軟件的函數(shù)調(diào)用關(guān)系中提取API調(diào)用的序列。該階段的操作步驟為:標(biāo)識(shí)函數(shù)調(diào)用關(guān)系圖中的入口節(jié)點(diǎn)(即沒(méi)有傳入邊的節(jié)點(diǎn));枚舉出每個(gè)入口節(jié)點(diǎn)可到達(dá)的路徑。在此階段確定的所有路徑的集合L就是該函數(shù)的API調(diào)用序列。以圖3中的uploadAllfiles函數(shù)的調(diào)用關(guān)系圖為例,函數(shù)調(diào)用序列對(duì)如圖5所示。
圖5 uploadAllfiles函數(shù)的API調(diào)用序列對(duì)
2.2.3抽象API調(diào)用序列
不同的Android版本對(duì)應(yīng)著不同的API版本,不同版本的Android API也存在不同,會(huì)根據(jù)新增的功能去增加或刪改一些應(yīng)用程序接口。因此,如何讓提取API特征不依賴API版本成為一個(gè)亟待解決的問(wèn)題。
本文方法通過(guò)抽象API的包名避免了檢測(cè)的特征對(duì)于API版本的依賴。具體包括:對(duì)API官方網(wǎng)站給出的API進(jìn)行包名抽象、對(duì)應(yīng)用程序自定義的包名統(tǒng)一抽象為insensitive-defined、對(duì)被混淆后的包名統(tǒng)一抽象為obfuscated。根據(jù)Android API和Google API官方統(tǒng)計(jì),API以包名進(jìn)行分類共有9個(gè),分別包括android、com.google、java、javax、org.xml、org.apache、junit、org.json和org.w3c.dom。由于org.w3c.dom家族下的API都為文檔對(duì)象模型 (DOM)提供接口,junit類適用于開(kāi)發(fā)者做單元測(cè)試的類,并且org.w3c.dom和junit都幾乎不曾在實(shí)驗(yàn)樣本集中出現(xiàn)過(guò),所以剔除這兩類。表2中給出了所有API抽象描述后的種類集合,總共8種。
表2 抽象API的集合
在Android軟件開(kāi)發(fā)中,自定義包名的命名規(guī)則采用反域名命名規(guī)則,全部使用小寫字母。一級(jí)包名為com;二級(jí)包名為個(gè)人或公司名稱,可以簡(jiǎn)寫,三級(jí)包名根據(jù)應(yīng)用進(jìn)行命名;四級(jí)包名為模塊名或?qū)蛹?jí)名;根據(jù)實(shí)際情況也是可以用五級(jí)包名、六級(jí)包名。而在Android應(yīng)用程序?qū)又校煜夹g(shù)主要采用標(biāo)識(shí)符混淆,它是對(duì)源程序中的包名、類名、方法名和變量名進(jìn)行重命名,用無(wú)意義的標(biāo)識(shí)符來(lái)替換,使得破解和分析更困難。通過(guò)標(biāo)識(shí)符混淆后的包名多數(shù)以單一字符或定制的混淆字典中的字符串替換每級(jí)包名,這些單一字符和定制的混淆字典中的字符串的命名方式不會(huì)遵守反域名命名規(guī)則。因此根據(jù)上述特性,本文對(duì)應(yīng)用程序自定義的包名和混淆后的包名識(shí)別算法步驟如下:
輸入:API調(diào)用信息Sorigin,API官網(wǎng)抽象出的集合[APIabstract]=[android, com.google, java, javax, org.xml, org.apache]。
輸出:抽象的API。
步驟一:以“.”切分Sorigin,得到一個(gè)包名組L。
步驟二:將包名組L中的元素與[APIabstract]逐個(gè)匹配,匹配成功,則輸出匹配的元素,即為抽象API。
步驟三:如果步驟二匹配不成功,計(jì)算L中每個(gè)元素的長(zhǎng)度,統(tǒng)計(jì)元素長(zhǎng)度不超過(guò)3的元素?cái)?shù)量count。
步驟四:判斷count是否大于等于len(L)/2,是則輸出匹配元素obfuscated,表示為混淆的包名;否則輸出匹配元素insensitive-defined,表示為自定義包名。
繼續(xù)以圖5的API調(diào)用圖為例,API抽象后結(jié)果如圖6所示。
圖6 抽象后的API調(diào)用序列
為了更好體現(xiàn)API調(diào)用序列之間的關(guān)系,本文方法通過(guò)計(jì)算API兩兩之間的轉(zhuǎn)移概率,獲取轉(zhuǎn)移矩陣作為分類特征。
API兩兩之間的轉(zhuǎn)移概率P的計(jì)算公式如下:
(1)
接著,根據(jù)上述2.2節(jié)分析可知,抽象API集合LAPI_abstract=[android, com.google, java, javax, org.xml, org.apache, obfuscated, insensitive-defined],則LAPI_abstract中API兩兩之間轉(zhuǎn)換的狀態(tài)有64(8×8)種,設(shè)一個(gè)64列的特征向量Vtranslate_count=[API]1×64來(lái)代表64種轉(zhuǎn)化狀態(tài)。其中Vtranslate_count分別代表的是LAPI_abstract集合中抽象API兩兩之間的轉(zhuǎn)換概率矩陣。一個(gè)應(yīng)用軟件中所有函數(shù)的抽象API調(diào)用序列中的API之間轉(zhuǎn)移概率的集合就組成了轉(zhuǎn)移概率矩陣。具體算法流程如下:
輸入:一個(gè)應(yīng)用軟件中n個(gè)函數(shù)的抽象API調(diào)用序列集;特征維度t=64。
輸出:轉(zhuǎn)移概率矩陣Tn×t。
步驟一:創(chuàng)建轉(zhuǎn)移概率矩陣Tn×t,并將其元素都初始化為0。
步驟二:計(jì)算Ti×j的值。其中Ti×t(第i行向量)表示第i個(gè)函數(shù)的抽象API調(diào)用序列中API之間的轉(zhuǎn)移概率向量,因此Ti×j表示第i個(gè)函數(shù)在Vtranslate_count的第j個(gè)指定的兩個(gè)API之間轉(zhuǎn)換概率。該概率通過(guò)式(1)計(jì)算可得。
步驟三:輸出矩陣Tn×t。
本文采用的分類算法為隨機(jī)森林算法,主要是為了區(qū)分惡意軟件和良性軟件。
隨機(jī)森林[14]是建立在決策樹算法基礎(chǔ)上的改進(jìn)算法,用于分類與回歸。該算法通過(guò)重復(fù)多次的有放回的方式從原始樣本中隨機(jī)抽取部分樣本產(chǎn)生新的樣本集合,每個(gè)樣本集合后續(xù)都可以構(gòu)建成一棵決策樹,多棵決策樹組建成隨機(jī)森林。最終分類結(jié)果根據(jù)每棵分類子樹投票統(tǒng)計(jì)結(jié)果而定。該算法的執(zhí)行步驟[13]如下:
輸入:n個(gè)訓(xùn)練樣本集T[n],測(cè)試樣本x,樣本特征維度M。
輸出:x所屬的類別。
步驟一:對(duì)于原始訓(xùn)練樣本集T[n],有放回的隨機(jī)抽取N個(gè)訓(xùn)練樣本。
步驟二:隨機(jī)地從M個(gè)特征中選取m個(gè)特征子集(m< 步驟三:將經(jīng)過(guò)步驟二生長(zhǎng)后的多棵樹進(jìn)行組建,構(gòu)建成一個(gè)隨機(jī)森林分類器。 步驟四:將測(cè)試樣本x放入隨機(jī)森林分類器中進(jìn)行分類判別。 分類結(jié)果的好壞需要通過(guò)不同的指標(biāo)來(lái)表現(xiàn)。本文主要以TPR、FPR、Accuracy、Precision、Recall和F-measure作為分類方法的評(píng)價(jià)標(biāo)準(zhǔn)。具體說(shuō)明如下: TPR:表示非惡意樣例被正確分類的比率。其公式如下: (2) 式中:TP表示非惡意樣例被正確分類的個(gè)數(shù);P表示非惡意樣例的總個(gè)數(shù)。 FPR:表示惡意樣例被錯(cuò)誤分類的比率。其公式如下: (3) 式中:FP表示惡意樣例被錯(cuò)誤劃分為正常樣例的個(gè)數(shù);N表示惡意樣例的總個(gè)數(shù)。 Accuracy:表示準(zhǔn)確率,即所有樣本被正常分類的比率。其公式如下: (4) 式中:TN表示惡意樣例被正常分類的個(gè)數(shù)。 Precision:表示精度,即非惡意樣本正常分類的個(gè)數(shù)占所有被正常分類總樣本個(gè)數(shù)的比率。其公式如下: (5) Recall:表示查全率,即表示非惡意樣本被正常分類的個(gè)數(shù)占總正常樣本的個(gè)數(shù)的比率。其公式如下: (6) F-measure:表示綜合查全率,即平均上述的Precision和Recall指標(biāo)后的綜合評(píng)測(cè)標(biāo)準(zhǔn)。其公式如下: (7) 本節(jié)包含了對(duì)不同特征的分類性能的驗(yàn)證實(shí)驗(yàn),具體包括以下兩部分實(shí)驗(yàn):(1) 基于抽象API調(diào)用序列特征的分類實(shí)驗(yàn)。(2) 本方法與市場(chǎng)已有的惡意軟件檢測(cè)方法的比較實(shí)驗(yàn)。 3.2.1基于抽象API調(diào)用序列特征的分類實(shí)驗(yàn) 實(shí)驗(yàn)結(jié)果對(duì)不同API版本的數(shù)據(jù)集上的準(zhǔn)確率、召回率表現(xiàn)進(jìn)行了詳細(xì)地統(tǒng)計(jì)。從表3中可以看出,API版本在16~23的F-measure和API版本在24~27的F-measure都是93%。API版本在16~23和24~27的TPR、 FPR的差距都只控制在0.2%,表明本文方法能有效區(qū)分惡意樣本且不受API版本的影響。 表3 不同API版本中RandomForest算法的各項(xiàng)指標(biāo) % 3.2.2與其他方法的對(duì)比實(shí)驗(yàn) 為了驗(yàn)證本文提出的基于抽象API調(diào)用序列的特征方法對(duì)于Android惡意軟件的檢測(cè)效果。將本文提出的檢測(cè)方法與邵舒迪等[9]提出的基于權(quán)限和API特征結(jié)合方法,以及盧正軍等[10]提出的基于上下文信息的Android惡意行為檢測(cè)方法進(jìn)行對(duì)比實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果如圖7所示。 圖7 本文方法與文獻(xiàn)[9]和文獻(xiàn)[11]方法對(duì)比結(jié)果 根據(jù)實(shí)驗(yàn)結(jié)果可以看出,本文方法的檢測(cè)精度比文獻(xiàn)[9]方法高出了3.8%,比文獻(xiàn)[11]提出的方法檢測(cè)率高出了1%。因此,基于抽象API調(diào)用序列的Android惡意軟件檢測(cè)方法效果遠(yuǎn)優(yōu)于的文獻(xiàn)[9]和文獻(xiàn)[11]方法,且實(shí)驗(yàn)結(jié)果更加具有說(shuō)服力。 根據(jù)目前Android系統(tǒng)存在的安全問(wèn)題,本文在對(duì)Android應(yīng)用軟件的靜態(tài)特征進(jìn)行分析后,提出了一種基于抽象API調(diào)用序列的Android應(yīng)用軟件檢測(cè)方法,來(lái)判別某個(gè)軟件是否為惡意軟件。本文對(duì)3 000款正常軟件和2 000款惡意軟件進(jìn)行了仿真實(shí)驗(yàn),結(jié)果驗(yàn)證了本文提出的方法的準(zhǔn)確性和高效性。 該方法依舊還有提升的空間,可以結(jié)合動(dòng)態(tài)方法提取惡意軟件運(yùn)行時(shí)的行為進(jìn)行分析,同樣也可以從運(yùn)行時(shí)API調(diào)用的角度出發(fā)考慮,將動(dòng)態(tài)和靜態(tài)分析獲取到的API調(diào)用序列融合在一起,或許可以達(dá)到更好的檢測(cè)效果。3 實(shí)驗(yàn)結(jié)果與分析
3.1 方法評(píng)測(cè)標(biāo)準(zhǔn)
3.2 實(shí)驗(yàn)結(jié)果
4 結(jié) 語(yǔ)