陳明翔 解夢飛 張欽堯 劉俊
摘 要:文章通過對大量Android惡意軟件的研究,提出并設計一種Android惡意應用綜合檢測模型。模型中包含動態(tài)監(jiān)測和靜態(tài)分析兩種惡意應用識別技術(shù),并結(jié)合機器學習算法,對Android應用中可能存在的惡意代碼攻擊、漏洞利用、隱私泄露3種問題進行了研究并設計出解決方案。
關(guān)鍵詞:Android;惡意軟件;動態(tài)監(jiān)測;靜態(tài)分析;機器學習;漏洞掃描;隱私泄露
近年來,Android智能設備在全球市場的占有率越來越高,但Android系統(tǒng)的安全問題卻層出不窮。一方面各大應用市場寬松的審查機制導致Android惡意軟件泛濫,另一方面開發(fā)者的水平不一也導致Android應用自身的安全性良莠不齊。隨著時間的推移,各大廠商的手機大多都已安裝了自家的安全軟件,并配套了具有審查機制的應用市場。但是,由于Android系統(tǒng)的開源性,許多智能手機愛好者會為系統(tǒng)進行root提權(quán),從而對手機進行高度定制。然而,各大廠商原生的安全機制對root手機不再適用。用戶在沒有對Android應用安全性進行確認的情況下,經(jīng)過root提權(quán)的手機(以下簡稱root手機)更容易被惡意軟件以高權(quán)限入侵。
與此同時,目前常見的Android應用安全性檢測方案主要使用動態(tài)和靜態(tài)兩種檢測技術(shù),但大多數(shù)設計方案只針對其中一項技術(shù)進行應用或改進,少有對這些技術(shù)檢測效果的相關(guān)性與互補性進行研究。這明顯無法對root手機進行全面、高效的安全防護。
在此背景下,本文提出一種綜合多種檢測技術(shù)的Android應用安全性檢測模型。此模型基于現(xiàn)有的檢測技術(shù)進行改進,并通過不同檢測方案間的互補性來設計檢測流程,一方面可以提高檢測的精度,另一方面則可以擴展應用安全性的評估面。此外,本系統(tǒng)針對root手機的特點,在應用安全性評估模型中還著重實現(xiàn)了動態(tài)的風險評估和危險行為攔截,具有全面性、精確性、高效性。
1 基于動靜態(tài)結(jié)合分析的Android惡意應用多重檢測模型的總體設計
本系統(tǒng)包括:動態(tài)監(jiān)測部分和靜態(tài)檢測部分(見圖1),分別運行在Android客戶端和服務器端。
動態(tài)監(jiān)測部分包括敏感行為監(jiān)測模塊和流量監(jiān)控模塊,靜態(tài)檢測部分包括惡意軟件鑒別模塊、漏洞檢測模塊和隱私泄露檢測模塊。
2 基于API Hook的敏感行為監(jiān)測模塊
Android操作系統(tǒng)維護著自己的一套事件分發(fā)機制,Android應用程序、觸發(fā)事件和后臺邏輯處理,都是根據(jù)該機制一步步向下執(zhí)行,惡意軟件的敏感行為也不例外。若能在事件傳送到終點前將事件截獲并對其操作進行一定修改,就可以有效地抑制惡意行為的效果,這就是Hook機制。
本模塊設計一種基于Xposed框架的Hook模塊,運行于Android客戶端上,利用Xposed框架對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持[1],在開機時完成對所有的Hook方法的重定義或改寫,實現(xiàn)對于應用中調(diào)用的系統(tǒng)敏感API的鉤取、分析、預警。
2.1 確定敏感行為
通常,移動平臺的惡意行為包含:惡意控制設備、強行推送廣告、偷跑流量、竊取用戶隱私、獲取用戶實時動態(tài)等[2],根據(jù)以上惡意行為,Hook模塊預設80多項行為作為敏感行為。
2.2 模塊工作流程
模塊工作流程包含API Hook模塊、風險評估模塊、風險預警模塊。
2.2.1 API Hook
Hook模塊隨Android客戶端安裝后托管于Xposed模塊,運行于后臺。API Hook模塊每鉤取到一個API,就會記錄其調(diào)用時間、重要參數(shù),加入相應Android應用程序的API調(diào)用鏈中。API Hook模塊只記錄固定時間內(nèi)的API調(diào)用,若超過該固定時間,API調(diào)用鏈中過早調(diào)用的API會被刪去。若該應用在固定時間內(nèi)程序調(diào)用鏈長度達到閾值或者API調(diào)用鏈中出現(xiàn)了固定的惡意API組合,模塊就會啟動惡意風險評估流程。
2.2.2 風險評估
本文提出并設計一種風險評估模型,首先提出以下前提和概念。
a) 本文預設敏感API集為。
b) 定義為APP調(diào)用的敏感API集,包含于{API}。
c)對APP中的敏感API調(diào)用鏈進行分析、評估,分以下兩種情況執(zhí)行:
(1)若無匹配惡意行為特征API集的調(diào)用出現(xiàn)。
Hook模塊設計前期,對大量惡意軟件的反編譯提取其中敏感API調(diào)用代碼。本文通過大量的動態(tài)監(jiān)測分析其惡意程度,定義了各敏感API的惡意權(quán)重。
Hook模塊提出一種風險評估算法:
定義為ai執(zhí)行過程中調(diào)用的敏感API集。
定義為ai的調(diào)用權(quán)重,特別地若,則。
定義為該APP的帶權(quán)惡意系數(shù)。通過機器學習分類算法計算,若V>0.61,則判定該應用為惡意軟件。
(2)若匹配到惡意行為特征API集。
為該惡意API組合調(diào)用的組合時間惡意系數(shù),若T<0,則將該APP評估為惡意APP。
使用現(xiàn)有的APP自動化檢測系統(tǒng)得出在100款惡意軟件上,該風險評估算法成功率為87%。
2.3 風險預警
對于判定為惡意APP的應用,API Hook模塊提醒用戶卸載,并將其包名、簽名添加到黑名單中。Hook模塊監(jiān)聽系統(tǒng)安裝程序,對于黑名單中的應用直接予以卸載處理。對于未判定為惡意但進入風險評估流程的APP,本系統(tǒng)會在用戶允許下將其上傳到服務器,啟動靜態(tài)檢測流程。
3 Android流量監(jiān)控、分析、攔截模型
多數(shù)Android惡意應用通過聯(lián)網(wǎng)下載APP、展示廣告等方式盈利,這不僅導致用戶消耗大量流量,還可能威脅到用戶隱私和Android系統(tǒng)安全?;趷阂鈶靡蕾嚮ヂ?lián)網(wǎng)盈利這個特點,本文在Android設備上搭建一個流量監(jiān)控、分析、攔截平臺,建立惡意流量規(guī)則庫,對惡意應用的請求報文進行攔截,從而阻止惡意應用的惡意行為,保護用戶的流量和隱私。
3.1 模型設計
Android流量監(jiān)控、分析、攔截平臺架構(gòu)如圖2所示。
Android流量監(jiān)控、分析、攔截平臺采用C-S模式,客戶端實現(xiàn)監(jiān)控和攔截功能,服務器實現(xiàn)惡意流量規(guī)則的匯總、判優(yōu)和同步。
客戶端流量攔截模塊長期在后臺運行,核心是請求報文惡意特征匹配機制。該機制根據(jù)本地惡意URL模式庫和URL黑名單庫檢查每一個請求報文,命中規(guī)則即進行攔截,否則放行。流量監(jiān)控模塊由用戶啟動,抓取用戶指定應用的流量包,輔助用戶編寫自定義攔截規(guī)則,添加到本地惡意流量數(shù)據(jù)庫中。用戶可選擇上傳分享自定義規(guī)則,同時也可對其他人編寫的規(guī)則進行評價。此外,客戶端還接受Hook模塊判定的惡意應用的流量清單,根據(jù)用戶選擇將流量清單加入惡意流量黑名單庫中。
服務器端接收用戶分享的自定義規(guī)則,暫時存放在共享惡意流量規(guī)則庫中。用戶可以試用共享規(guī)則庫中的規(guī)則并對其評價打分。服務器定期將高評分規(guī)則加入公共惡意流量規(guī)則庫中,向所有客戶端同步。隨著用戶的分享和數(shù)據(jù)庫的不斷更新,逐步加強對惡意流量攔截的廣度和準確度。
3.2 模型實現(xiàn)
客戶端流量攔截功能基于browsermob-proxy代理實現(xiàn)。代理工具browsermob-proxy開放源代碼,本文除了使用API接口提供的功能外,還改動源碼適配Android系統(tǒng)。代理需要長期運行,為了保證代理不被系統(tǒng)回收,將代理寫入Android前臺服務中并在通知欄顯示運行狀態(tài)。
客戶端流量監(jiān)控功能基于VPNService實現(xiàn)。在VPNService框架中,開發(fā)者可以獲取和控制所有網(wǎng)絡層流量。此外,網(wǎng)絡層中包含的傳輸層端口信息用來區(qū)分出不同應用的流量。
4 基于權(quán)限與敏感API的機器學習分類算法靜態(tài)檢測模型
本模塊針對Android應用程序的權(quán)限機制與敏感API的調(diào)用情況,分別建立基于權(quán)限與敏感API的特征向量,然后使用樸素貝葉斯與隨機森林兩種機器學習算法建立分類模型。通過對兩種分類模型的性能評估,提出了基于敏感API調(diào)用的隨機森林算法分類模型,從而完成對惡意軟件與正常應用的基本鑒別,并反饋用戶鑒別結(jié)果。
4.1 特征選取
4.1.1 權(quán)限信息
Android應用程序的一系列行為都需要它所申請的權(quán)限作為支撐,所以權(quán)限在一定程度上反映了應用程序的行為模式。通過對Android應用程序的配置文件AndroidManifest.xml的分析,提取了關(guān)于應用注冊的權(quán)限信息。
4.1.2 敏感API調(diào)用
敏感API包括涉及竊取用戶隱私行為的高危函數(shù)接口,通過這些函數(shù)的調(diào)用,程序可以直接或間接地獲取一些敏感數(shù)據(jù)。本文通過對應用程序反編譯之后的中間代碼進行提取,整理出53個調(diào)用次數(shù)較多的敏感API,其中部分API如表1所示。
將敏感API的調(diào)用次數(shù)作為特征值構(gòu)建特征向量,由于不同大小的應用程序相對調(diào)用API的次數(shù)不同,所以本文將應用程序的大小與API調(diào)用次數(shù)做了加權(quán)平均,來降低應用程序大小帶來的影響。
4.2 模型分析與評估
本文取正常應用與惡意應用各1 500個作為訓練集,另取250個作為測試集,其中惡意應用來自公開的惡意軟件庫VirusShare,正常應用爬取自GooglePlay商店,基本涵蓋了所有應用類別。
采用精確率(pre)與召回率(recall)[3]作為衡量分類性能的指標,實驗結(jié)果如表2所示。
不同于權(quán)限,敏感API信息包含每個API的平均調(diào)用次數(shù),所以惡意特征的表現(xiàn)方式會更加明顯,通過反編譯得到每個應用的API調(diào)用情況,結(jié)合調(diào)用次數(shù)建立基于敏感API的特征向量,并輸入分類器中。實驗結(jié)果如表3所示。
可以看出,隨機森林算法的分類性能依然優(yōu)于樸素貝葉斯算法,無論準確率(ACC)還是召回率(recall)都接近95%,精確率(pre)也接近97%,說明利用敏感API作為鑒別特征,基于隨機森林分類算法能達到很好的分類效果。
5 Android應用漏洞檢測模塊
漏洞檢測模塊為靜態(tài)檢測中的第二部分,基于Soot[4]對應用進行反編譯以檢測出其中可能存在的漏洞。另一方面,為了提高漏洞檢測精度,本文提出了一種基于過程內(nèi)數(shù)據(jù)流分析技術(shù)的變量行為記錄算法,在漏洞檢測中可以用于實現(xiàn)函數(shù)內(nèi)變量到相關(guān)常量的追溯,提高檢測準確率。
5.1 Android應用漏洞檢測模塊的工作流程
首先使用Soot對APK進行初始化工作,輸出的兩個結(jié)果一個是Jimple中間代碼,另一個則是控制流圖,其中控制流圖使用5.2小節(jié)中介紹的追溯算法為函數(shù)內(nèi)的變量生成行為記錄。初始化工作結(jié)束后,則開始進行漏洞特征匹配,最后輸出檢測結(jié)果。
5.2 基于數(shù)據(jù)流分析的變量行為記錄算法
在對漏洞特征進行匹配時,經(jīng)常將特定的常量參數(shù)作為漏洞特征。然而應用開發(fā)中有很多情況是先將常量賦值到一個變量對象里,進行處理之后再作為參數(shù)傳值到漏洞特征函數(shù)中。一個最簡單的例子就是使用StringBuilder連接字符串,最后調(diào)用toString()方法將生成的字符串作為參數(shù)傳給函數(shù)。對于這種情況,傳統(tǒng)基于字符匹配的檢測方案是無法匹配到特征的。本小節(jié)提出的算法則用于解決這種問題,算法基于過程內(nèi)數(shù)據(jù)流分析生成變量的行為記錄,之后基于此記錄追溯變量的常量特征。具體算法流程如圖3所示。
在利用Soot生成控制流圖后,使用Soot提供的過程內(nèi)數(shù)據(jù)流分析框架來模擬完整控制結(jié)構(gòu)下的語句遍歷分析,并在此過程中基于傳入的記錄規(guī)則,詳細記錄所有變量的初始化、變量的方法和成員變量調(diào)用、變量賦值、變量值傳遞等所有變量相關(guān)的行為。在最終生成的變量行為記錄中,即可清楚地獲得變量的常量特征。
6 隱私泄露檢測模塊
在智能設備大量普及的當下,手機比電腦中存放著更多用戶的隱私信息,這些信息一旦被應用惡意獲取,就可能給用戶帶來無法挽回的損失。因此,用戶隱私安全性與Android應用的安全性是緊密相關(guān)的,隱私泄露檢測模塊便從隱私泄露的角度入手,進行Android應用安全性的評估。
6.1 對Sources點及Sinks點的分析歸類
Android系統(tǒng)中含有很多涉及獲取用戶隱私的API(Sources點)以及隱秘的數(shù)據(jù)發(fā)送途徑(Sinks點),通過歸類整理并使用基于過程間數(shù)據(jù)流分析技術(shù)[5]的污點傳播算法,尋找從Sources點到Sinks點的傳播路徑,從而發(fā)現(xiàn)這些隱私泄露問題。
6.2 使用污點分析算法尋找傳播路徑
Android應用中每一個組件都有自己完整的生命周期,組件在運行過程中隨時可能被觸發(fā)調(diào)用。因此,要對Android應用程序進行過程間數(shù)據(jù)流分析,就需要先為Android應用程序的生命周期建模,并構(gòu)造一個虛擬的main方法,在方法內(nèi)模擬觸發(fā)所有組件,然后再對這個虛擬的main方法進行數(shù)據(jù)流分析,尋找Sources到Sinks間的路徑。
模型使用FlowDroid[6]進行實現(xiàn)污點傳播路徑的尋找。FlowDroid是基于流分析技術(shù)的隱私泄露分析工具,它對Android應用程序的生命周期做了完整建模,并構(gòu)建了一個虛擬dummyMainMethod方法來模擬生命周期,在對應用內(nèi)的Sources點及Sinks點做了標記后,使用過程間數(shù)據(jù)流分析技術(shù)尋找這些點間的傳播路徑。
本模型即基于FlowDroid所提供的分析接口以及6.1歸類的Sources點與Sinks點進行Android應用中的隱私泄露分析。
[參考文獻]
[1]于航,劉麗敏,高能,等.基于模擬器的沙箱系統(tǒng)研究[J].信息網(wǎng)絡安全,2015(9):139-143.
[2]任偉,柳坤,周金.An Da:惡意代碼動態(tài)分析系統(tǒng)[J].信息網(wǎng)絡安全,2014(8):28-33.
[3]邵舒迪,虞慧群,范貴生.基于權(quán)限和API特征結(jié)合的Android惡意軟件檢測方法[J].計算機科學,2017(4):135-139.
[4]EINARSSON A,NIELSEN J D.A survivors guide to java program analysis with soot[EB/OL].(2008-07-17)[2018-09-28].https://www.researchgate.net/publication/241734740_A_Survivors_Guide_to_Java_Program_Analysis_with_Soot.
[5]BODDEN E.Inter-procedural data-flow analysis with IFDS/IDE and soot[C].Beijing:Acm Sigplan International Workshop on the State of the Art in Java Program Analysis,2012.
[6]ARZT S,RASTHOFER S,F(xiàn)RITZ C,et al.FlowDroid: precise context, flow, field, object-sensitive and lifecycle-aware taint analysis for Android apps[C].Edinburgh:Acm Sigplan Conference on Programming Language Design & Implementation,2014.