蔣 煦, 張長(zhǎng)勝, 戴大蒙, 阮 婧, 慕德俊
(1.西北工業(yè)大學(xué) 自動(dòng)化學(xué)院,陜西 西安 710071; 2.溫州大學(xué) 物理與電子信息工程學(xué)院,浙江 溫州 325000; 3.溫州職業(yè)技術(shù)學(xué)院,浙江 溫州 325000)
?
Android應(yīng)用程序隱私數(shù)據(jù)泄露檢測(cè)
蔣 煦1, 張長(zhǎng)勝2, 戴大蒙2, 阮 婧3, 慕德俊1
(1.西北工業(yè)大學(xué) 自動(dòng)化學(xué)院,陜西 西安 710071; 2.溫州大學(xué) 物理與電子信息工程學(xué)院,浙江 溫州 325000; 3.溫州職業(yè)技術(shù)學(xué)院,浙江 溫州 325000)
針對(duì)安卓(Android)系統(tǒng)的隱私數(shù)據(jù)泄露問題,提出基于半格理論數(shù)據(jù)流分析的分層架構(gòu)檢測(cè)方法.對(duì)未獲取Root權(quán)限的應(yīng)用程序,根據(jù)應(yīng)用程序申請(qǐng)的權(quán)限信息,細(xì)粒度地鎖定產(chǎn)生污點(diǎn)數(shù)據(jù)的源函數(shù)和泄露隱私數(shù)據(jù)的錨函數(shù)范圍.當(dāng)源函數(shù)和錨函數(shù)同時(shí)存在于應(yīng)用程序時(shí),進(jìn)行數(shù)據(jù)流分析.當(dāng)源函數(shù)和錨函數(shù)位于不同組件時(shí),將組件間通訊(ICC)問題轉(zhuǎn)換為IDE分析問題.實(shí)驗(yàn)結(jié)果表明,該方法能夠有效地檢測(cè)出應(yīng)用程序組件內(nèi)或組件間的隱私數(shù)據(jù)泄露,正確率達(dá)到91.5%;與同類具有代表性的檢測(cè)工具相比,在準(zhǔn)確率和召回率接近的情況下,所提出方法的檢測(cè)時(shí)間明顯縮短.
安卓系統(tǒng);靜態(tài)檢測(cè);隱私數(shù)據(jù);組件間通訊(ICC);半格
數(shù)據(jù)研究公司IDC預(yù)計(jì),2015年Android系統(tǒng)終端市場(chǎng)占有率為45.4%,排在手機(jī)終端操作系統(tǒng)第一位.Android系統(tǒng)較高的市場(chǎng)占有率使其成為了許多惡意應(yīng)用程序攻擊的對(duì)象,尤其是竊取終端用戶隱私數(shù)據(jù),如:位置信息、手機(jī)通訊錄,收件箱中短信內(nèi)容、短信驗(yàn)證碼等[1],惡意程序的開發(fā)者可以從這些隱私信息中獲取利益.
Android應(yīng)用程序竊取隱私數(shù)據(jù)的檢測(cè)方法主要分為靜態(tài)分析和動(dòng)態(tài)分析.靜態(tài)分析是指在不運(yùn)行應(yīng)用程序的前提下,發(fā)現(xiàn)隱私數(shù)據(jù)的泄露.動(dòng)態(tài)分析是指在應(yīng)用程序?qū)嶋H執(zhí)行的過程中捕捉到隱私數(shù)據(jù)的泄露.2種分析方法各有利弊:靜態(tài)分析檢測(cè)效率高、用時(shí)短,但無法得到只有在應(yīng)用程序運(yùn)行時(shí)才生成的相關(guān)數(shù)據(jù);動(dòng)態(tài)分析可以實(shí)時(shí)監(jiān)測(cè)系統(tǒng)是否存在隱私數(shù)據(jù)泄露,但當(dāng)不滿足觸發(fā)條件時(shí),動(dòng)態(tài)分析無法檢測(cè)出隱私數(shù)據(jù)的泄露,尤其是當(dāng)部分惡意應(yīng)用程序檢測(cè)到自身運(yùn)行在測(cè)試環(huán)境下時(shí),就不會(huì)觸發(fā)惡意行為,使動(dòng)態(tài)的檢測(cè)結(jié)果成假陽(yáng)性,同時(shí),動(dòng)態(tài)分析會(huì)增加系統(tǒng)的額外消耗.
與Android應(yīng)用程序隱私數(shù)據(jù)泄露相關(guān)的研究工作很多.CHEX采取靜態(tài)分析技術(shù),通過追蹤隱私數(shù)據(jù)傳播的路徑來檢測(cè)應(yīng)用程序是否存在組件的劫持[2].DroidChecker對(duì)應(yīng)用程序控制流程圖進(jìn)行分析,以發(fā)現(xiàn)隱私數(shù)據(jù)泄露點(diǎn)[3].FlowDroid對(duì)應(yīng)用程序的控制流程圖進(jìn)行分析,同時(shí)將應(yīng)用程序組件的生命周期、回調(diào)、變量別名考慮在內(nèi),具有很高的正確率[4].王兆國(guó)等[5]提出了一種基于行為鏈的Android應(yīng)用程序隱私竊取的檢測(cè)方法,利用WxShall算法可以大幅度地減少計(jì)算量.以上方法都只考慮了應(yīng)用程序組件內(nèi)的隱私數(shù)據(jù)泄露,沒有將組件之間的泄露考慮在內(nèi).Epicc[6]重點(diǎn)關(guān)注組件間的通訊,能夠有效地檢測(cè)出組件間的數(shù)據(jù)傳遞,但沒有將統(tǒng)一資源標(biāo)識(shí)符(uniform resource identifiers, URIs)考慮在內(nèi),正確率還有待提高.Iccta[7]是目前檢測(cè)Android應(yīng)用程序組件內(nèi)和組件間隱私數(shù)據(jù)泄露的最新研究成果,不僅將組件間通訊的因素考慮在內(nèi),還考慮了URIs,但沒有將待檢測(cè)的應(yīng)用程序區(qū)別對(duì)待,導(dǎo)致檢測(cè)的耗時(shí)較長(zhǎng).
靜態(tài)數(shù)據(jù)流跟蹤技術(shù),也稱為靜態(tài)污點(diǎn)分析,屬于應(yīng)用程序靜態(tài)分析的范疇,是對(duì)信息從一個(gè)對(duì)象流向另一個(gè)對(duì)象的有效跟蹤[8].本文采用該方法對(duì)未獲取Root權(quán)限的應(yīng)用程序進(jìn)行反編譯,得到應(yīng)用程序的源碼,對(duì)應(yīng)用程序內(nèi)生成的隱私數(shù)據(jù)進(jìn)行污點(diǎn)標(biāo)記,檢查傳播路徑中污點(diǎn)數(shù)據(jù),看其是否被漂白,跟蹤被標(biāo)記的污點(diǎn)數(shù)據(jù)是否能夠到達(dá)隱私數(shù)據(jù)的泄露點(diǎn),整個(gè)跟蹤的過程不僅局限在應(yīng)用程序的組件內(nèi),也包括組件間[9].
1.1 Android應(yīng)用程序的構(gòu)成
應(yīng)用程序主要由Activity、BroadcastReceivers、Service、Content provider等組件構(gòu)成. Activity是Android程序中最基本的組件,是為用戶操作而展示的可視化用戶界面,Android應(yīng)用程序中可以有一個(gè)或者多個(gè)Activity組件,其作用及數(shù)目取決于應(yīng)用程序的設(shè)計(jì).Service組件主要用來處理與用戶界面無關(guān)的業(yè)務(wù),一般用來處理耗時(shí)任務(wù),且在后臺(tái)運(yùn)行.BroadcastReceivers組件可以運(yùn)行在同一個(gè)進(jìn)程中,也可以運(yùn)行在不同的進(jìn)程中;不同進(jìn)程中的組件通過廣播來傳遞消息的機(jī)制類似于進(jìn)程間通信機(jī)制Binder.Content Provider可以實(shí)現(xiàn)不同應(yīng)用程序之間的數(shù)據(jù)共享,因?yàn)椴煌瑧?yīng)用程序之間無法互相訪問對(duì)方的數(shù)據(jù).
Android應(yīng)用程序組件之間的通信以Intent作為紐帶.Intent封裝了不同組件之間的通信條件,對(duì)應(yīng)用程序中一次操作的動(dòng)作、動(dòng)作涉及的數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述.Android系統(tǒng)根據(jù)Intent的描述,去尋找匹配的目標(biāo)組件.同時(shí),組件之間的通信既可以發(fā)生在同一個(gè)應(yīng)用程序中,也可以發(fā)生在不同應(yīng)用程序之間.當(dāng)應(yīng)用程序的某組件Exported屬性為真時(shí),Android系統(tǒng)會(huì)為需要該組件的其他應(yīng)用程序組件建立與該組件之間的通信.
1.2 Android應(yīng)用程序數(shù)據(jù)流分析的特點(diǎn)
Android應(yīng)用程序數(shù)據(jù)流的分析依賴于控制流圖.雖然Android應(yīng)用程序主要由Java語言編寫,但如果直接使用現(xiàn)有的Java數(shù)據(jù)流跟蹤工具分析,會(huì)出現(xiàn)數(shù)據(jù)流傳播路徑的中斷.造成這一結(jié)果的原因如下:1)Android應(yīng)用程序由組件構(gòu)成,組件之間通過Intent傳遞請(qǐng)求和意圖;2)Android應(yīng)用程序部分代碼的執(zhí)行需要用戶的參與,如:onClick函數(shù)的執(zhí)行就需要用戶的點(diǎn)擊;3)Android應(yīng)用程序的組件具有生命周期的特點(diǎn),生命周期中不同狀態(tài)的轉(zhuǎn)換需要采用回調(diào)的方法,如:onStart、onResum等,觸發(fā)生命周期狀態(tài)的執(zhí)行條件都不是直接與代碼相連.因此,要構(gòu)建符合Android應(yīng)用程序特點(diǎn)的控制流圖,進(jìn)行數(shù)據(jù)流分析,跟蹤隱私數(shù)據(jù).
1.3 相關(guān)定義
(1)隱私數(shù)據(jù): Android系統(tǒng)終端存儲(chǔ)的個(gè)人信息,如:聯(lián)系人信息、IMEI、位置信息等屬于終端使用者個(gè)人的信息.
(2)源函數(shù): Android系統(tǒng)應(yīng)用程序中產(chǎn)生隱私數(shù)據(jù)的應(yīng)用程序編程接口(application programming interface,API).
(3)錨函數(shù): Android系統(tǒng)應(yīng)用程序中隱私數(shù)據(jù)泄露點(diǎn)的API.
2.1 數(shù)據(jù)流分析框架
數(shù)據(jù)流分析框架的核心理論是格論.從格的角度講,數(shù)據(jù)流分析框架可以分為基于半格的數(shù)據(jù)流框架和基于全格的數(shù)據(jù)流框架;前者用于形式化順序程序的數(shù)據(jù)流問題,后者用于并發(fā)程序的數(shù)據(jù)流問題[10].
代數(shù)格L[11]是由值集合和二元運(yùn)算(交運(yùn)算∩、并運(yùn)算∪)組成,并滿足以下性質(zhì).
1)封閉律:對(duì)于所有的x、y∈L,存在唯一的u、v∈L,使得x∩y=u并且x∪y=v.
2)交換律:對(duì)于所有的x、y∈L,滿足x∩y=y∩x并且x∪y=y∪x.
3)結(jié)合律:對(duì)于所有的x、y∈L,滿足(x∩y)∩z=x∩(y∩z)并且(x∪y)∪z=x∪(y∪z).
4)L中存在底元素⊥,對(duì)于所有x∈L,滿足x∩⊥=⊥.
采用半格作為數(shù)據(jù)流分析的工具,半格與全格的區(qū)別在于半格只有一個(gè)二元運(yùn)算[12].數(shù)據(jù)流分析使用半格的元素來表達(dá)數(shù)據(jù)流信息,收集程序中與變量使用情況有關(guān)的信息并分析數(shù)據(jù)信息在基本塊之間傳遞和被修改的過程.數(shù)據(jù)流的表達(dá)式為
(1)
式中:集合I[i]表示輸入到基本塊i的數(shù)據(jù)流,集合O[i]表示從基本塊i輸出的數(shù)據(jù)流,在基本塊i內(nèi)產(chǎn)生的新污點(diǎn)數(shù)據(jù)和漂白的污點(diǎn)數(shù)據(jù)分別記為G[i]和K[i].
I[i]和O[i]之間的約束關(guān)系是定義在格值上的轉(zhuǎn)移函數(shù).轉(zhuǎn)移函數(shù)取決于G[i]和K[i],而G[i]和K[i]取決于基本塊i的數(shù)據(jù)操作語句,即賦值函數(shù)和函數(shù)調(diào)用.每個(gè)函數(shù)f至少包含一個(gè)源數(shù)據(jù)src和一個(gè)目標(biāo)數(shù)據(jù)tgt,其對(duì)應(yīng)的半格值可以為污染(tainted)、待定(unknown)、未污染(untainted)3種.當(dāng)變量為tainted時(shí)說明此變量為污點(diǎn)數(shù)據(jù),當(dāng)變量為unknown時(shí),說明此變量是否為污點(diǎn)數(shù)據(jù)待定,當(dāng)變量為untainted時(shí),變量為非污點(diǎn)數(shù)據(jù).
基本塊中污點(diǎn)屬性有如下傳播規(guī)則:
1)當(dāng)f為賦值函數(shù)和普通函數(shù)時(shí),src的污點(diǎn)屬性會(huì)賦值給tgt;
2)當(dāng)f為源函數(shù)時(shí),tgt污點(diǎn)屬性為tainted;
3)當(dāng)f為漂白函數(shù)時(shí),tgt污點(diǎn)屬性為untainted.
對(duì)于基本塊i而言,前向遍歷其中的函數(shù),根據(jù)函數(shù)的類型,按照上述的傳播規(guī)則對(duì)G[i] 和K[i]進(jìn)行更新,確定轉(zhuǎn)移函數(shù).
2.2 檢測(cè)系統(tǒng)架構(gòu)
圖1 隱私數(shù)據(jù)泄露的檢測(cè)系統(tǒng)架構(gòu)Fig.1 Detection system architecture for leakage ofprivacy data
通過學(xué)習(xí)與研究Dare[13]、Epicc[6]、IC3[14]、Flowdroid[4]等具有代表性的Android檢測(cè)工具,提出基于半格理論的隱私數(shù)據(jù)組件內(nèi)、組件間泄露的檢測(cè)方法,系統(tǒng)架構(gòu)圖如圖1所示.首先使用Dare[13]工具將Android應(yīng)用程序反編譯為Java源碼,采用掃描特征字符串的方法檢查應(yīng)用程序中是否存在與Root權(quán)限相關(guān)操作的代碼.如無,則從應(yīng)用程序AndroidManifest.xml文件中提取出應(yīng)用程序申請(qǐng)的權(quán)限信息,查看是否同時(shí)存在涉及到源函數(shù)和錨函數(shù)的權(quán)限申請(qǐng),如存在,則進(jìn)一步查看是否存在與申請(qǐng)的權(quán)限對(duì)應(yīng)的源函數(shù)和錨函數(shù);如有,則查看源函數(shù)和錨函數(shù)是否位于不同的組件,如存在于不同組件,則需要將ICC問題轉(zhuǎn)化為IDE問題,最后對(duì)反編譯得到的應(yīng)用程序源碼進(jìn)行適當(dāng)?shù)男薷?進(jìn)行數(shù)據(jù)流分析.
3.1 Root權(quán)限的檢查
Android操作系統(tǒng)底層是Linux內(nèi)核,而Root是Linux超級(jí)管理員用戶,具有終端的最高權(quán)限,可以啟動(dòng)或者停止任意一個(gè)進(jìn)程,訪問和修改系統(tǒng)中所有文件[15].在Android的安全架構(gòu)中,系統(tǒng)不會(huì)賦予終端用戶Root權(quán)限,但存在不少可以獲取Root權(quán)限的潛在漏洞.如果惡意應(yīng)用程序利用這些潛在漏洞獲得Android操作系統(tǒng)Root權(quán)限,就可以在未經(jīng)授權(quán)的情況下,執(zhí)行受權(quán)限機(jī)制保護(hù)的系統(tǒng)資源API,對(duì)終端造成不必要的損失.
本文從Zhou等[16]提供的惡意應(yīng)用程序樣本數(shù)據(jù)庫(kù)中抽取了100個(gè)有關(guān)Root權(quán)限操作的惡意應(yīng)用程序,通過對(duì)其進(jìn)行反編譯分析,發(fā)現(xiàn)只要存在與Root權(quán)限操作有關(guān)的惡意應(yīng)用程序都存在隱私數(shù)據(jù)泄露的問題.從Google Play應(yīng)用市場(chǎng)隨機(jī)下載的100個(gè)經(jīng)過應(yīng)用市場(chǎng)審核的應(yīng)用程序即使涉及到與隱私數(shù)據(jù)相關(guān)的權(quán)限申請(qǐng),也均未發(fā)現(xiàn)與Root權(quán)限有關(guān)的惡意行為.惡意應(yīng)用程序之所以需要獲取Root權(quán)限,就是因?yàn)橄M谖词跈?quán)的情況下,能夠接收系統(tǒng)提供的服務(wù),獲取隱私信息、傳遞隱私信息.本文檢測(cè)系統(tǒng)將待檢測(cè)應(yīng)用程序反編譯后的源碼是否涉及有關(guān)Root權(quán)限的操作作為隱私數(shù)據(jù)泄露檢測(cè)的第一步.
本文檢測(cè)系統(tǒng)使用Python語言,采取特征字符串掃描的方法對(duì)待檢測(cè)應(yīng)用程序反編譯后的源碼進(jìn)行掃描,查詢代碼中是否存在與Root權(quán)限相關(guān)的操作,包括提出安裝Root系統(tǒng)的工具類應(yīng)用程序等.如下面一段程序代碼所示,惡意應(yīng)用程序要求被授予Root權(quán)限.
1 public void onCreate(Bundle savedInstanceState)
2 {
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.main);
5 String apkRoot="chmod 777 "+getPackageCodepath();
6 SystemManager.RootCommand(apkRoot);
7 }
檢測(cè)系統(tǒng)一旦發(fā)現(xiàn)應(yīng)用程序存在獲取Root權(quán)限相關(guān)的代碼,就停止后續(xù)檢測(cè),判定待檢測(cè)應(yīng)用程序存在隱私數(shù)據(jù)泄露的潛在風(fēng)險(xiǎn).
3.2 組件間通訊檢測(cè)
Android應(yīng)用程序是由組件構(gòu)成,組件間通訊通過URIs和Intent進(jìn)行,Android系統(tǒng)根據(jù)URIs、Intent和IntentFilter的信息去尋找目標(biāo)組件.
本檢測(cè)系統(tǒng)組件間通訊檢測(cè)部分首先解析An-droidManifest.xml文件,該文件是Android應(yīng)用程序必須的全局配置文件,描述了應(yīng)用程序的全局?jǐn)?shù)據(jù),包括應(yīng)用程序向Android系統(tǒng)申請(qǐng)的權(quán)限信息、組件信息等.從中提取應(yīng)用程序申請(qǐng)的權(quán)限信息,檢查是否同時(shí)存在源函數(shù)和錨函數(shù)所需的權(quán)限信息,如同時(shí)存在,則參照Susi關(guān)于權(quán)限與源函數(shù)、錨函數(shù)的對(duì)應(yīng)關(guān)系,搜索源碼中是否存在具體的源函數(shù)和錨函數(shù)[17].如果源函數(shù)和錨函數(shù)不同時(shí)存在于應(yīng)用程序中,則說明該應(yīng)用程序不具備隱私數(shù)據(jù)泄露的條件,這主要是由于以下2點(diǎn):1)應(yīng)用程序的開發(fā)者在程序設(shè)計(jì)時(shí)過度申請(qǐng)權(quán)限,卻沒有執(zhí)行與申請(qǐng)權(quán)限相關(guān)的API;2)惡意應(yīng)用程序的開發(fā)者通過動(dòng)態(tài)加載技術(shù)執(zhí)行相關(guān)的API等手段躲避靜態(tài)檢測(cè).后一種情況已經(jīng)超出了靜態(tài)檢測(cè)的范圍,需要通過動(dòng)態(tài)檢測(cè)的方法,如Hook相關(guān)API.
目前,大多數(shù)的研究者在研究Android應(yīng)用程序靜態(tài)檢測(cè)方法時(shí),只關(guān)注組件內(nèi)隱私數(shù)據(jù)泄露,而忽視了組件間的隱私數(shù)據(jù)泄露問題.針對(duì)這個(gè)問題,本文在源函數(shù)和錨函數(shù)同時(shí)存在的情況下,分2種情況考慮,即源函數(shù)和錨函數(shù)在同一組件內(nèi)或在不同組件內(nèi).如果不在同一組件內(nèi),則將擁有源函數(shù)的組件作為入口點(diǎn),檢查組件內(nèi)的代碼是否存在組件間通訊的API.如存在,則推斷API處Intent可能的值,通過這些值找到對(duì)應(yīng)的、匹配的目標(biāo)組件,將組件間通訊(inter-component communication, ICC)問題轉(zhuǎn)化為IDE(intter-procedural distributive environment)問題.
Intent分為顯式Intent和隱式Intent,顯式Intent可以通過組件名稱直接指定需要跳轉(zhuǎn)的目標(biāo)組件,如以下代碼所示.當(dāng)程序執(zhí)行到第2句時(shí),系統(tǒng)會(huì)直接轉(zhuǎn)到AnotherActivity2.
1 Intent intent = new Intent(IntentDemo.this, AnotherActivity2.class);
2 startActivity(intent);
隱式Intent(如代碼所示)未指定目標(biāo)組件.Android系統(tǒng)必須找到處理該Intent的目標(biāo)組件,如找到某個(gè)Activity或者找到Service來執(zhí)行請(qǐng)求動(dòng)作或者找到Broadcast Receiver來響應(yīng)廣播通知,這個(gè)過程是通過匹配Intent與Intent Filter來實(shí)現(xiàn).Intent Filter是與組件關(guān)聯(lián)的結(jié)構(gòu),表明該組件可以處理哪些Intent.如果組件沒有Intent Filter,那么該組件只能接收顯式Intent.Action、Category、Data、MiniType與Intent緊密關(guān)聯(lián),是尋找目標(biāo)組件的關(guān)鍵字段.
1 void a(boolean b){
2 Intent intent =new Intent( );
3 if (b){
4 Intent.setAction(“view”);
5 Uri.setData("geo: 38.899533,-77.036476");
6 Intent.setData(uri);
7 } else{
8 Uri uri = Uri.parse("tel: 15980665805");
9 Intent intent = new Intent(Intent.ACTION_CALL, uri);
10 }
11 startActivity(intent);}
ICC問題轉(zhuǎn)化為IDE問題是解決組件間隱私數(shù)據(jù)通訊的關(guān)鍵,本文采用半格理論,將Intent中的Action、Category、Data、MiniType字段作為半格中V的元素,推斷其在組件間通訊API處的值,進(jìn)而找到匹配的組件.
如果僅僅考慮字段的變換函數(shù),那么在語句11處的4個(gè)字段取值如下:Action∈(view, call), cate-gory∈?, Data∈(geo, tel), MiniType∈?,即Intent的取值可能存在({view}, ?, {geo}, ?)、({call},?,{tel}, ?)、({view}, ?, {tel}, ?)和({call}, ?, {geo}, ?)4種情況,可實(shí)際只存在前2種可能.因此,本文將4個(gè)字段組合在一起作為研究數(shù)據(jù)流分析的對(duì)象,作為表達(dá)基本塊輸入和輸出約束關(guān)系的轉(zhuǎn)移函數(shù)的基礎(chǔ),f被定義為轉(zhuǎn)移函數(shù):
f(v)= (m1(Action)×m2(Catogory)×
m3(Data)×m4(MiniType)),f∈F.
F為基本塊數(shù)據(jù)流轉(zhuǎn)移函數(shù)集合,F集合中的元素表述的是不同基本塊對(duì)Intent中4個(gè)字段的影響.
以隱式Intent為例,數(shù)據(jù)流轉(zhuǎn)移函數(shù)的集合為(mview×m?×mgeo×m?、mcall×m?×mtel×m?),數(shù)據(jù)流轉(zhuǎn)移函數(shù)作用于格值,在語句11處的Intent可能存在({view},?,{geo}, ? )和({call}, ?, {tel}, ? )}2個(gè)值,根據(jù)這2個(gè)值,通過與其他組件的Intent Filter中的內(nèi)容進(jìn)行比較,找到目標(biāo)組件.
3.3 IDE問題的分析
對(duì)于靜態(tài)檢測(cè)Android應(yīng)用程序而言,ICC問題轉(zhuǎn)化為IDE問題后,就可以使用Java數(shù)據(jù)流分析工具進(jìn)行分析,但需要將組件的生命周期、系統(tǒng)事件的觸發(fā)等情況考慮在內(nèi).在現(xiàn)有的Android應(yīng)用程序靜態(tài)數(shù)據(jù)流分析工具中,Flowdroid[4]充分考慮Android應(yīng)用程序多入口,組件運(yùn)行次序、回調(diào)和別名等情況,準(zhǔn)確率達(dá)到86%、召回率達(dá)到93%.但是該工具沒有將反射考慮在內(nèi),反射機(jī)制是Java程序的一個(gè)重要語言特性,而且該特性越來越多地被惡意應(yīng)用程序的開發(fā)者應(yīng)用.
本檢測(cè)系統(tǒng)在Flowdroid[4]的基礎(chǔ)上增加了對(duì)反射部分的研究,將使用反射機(jī)制的代碼轉(zhuǎn)換為實(shí)際調(diào)用的函數(shù).這里只關(guān)注包含this參數(shù)在內(nèi)的調(diào)用方法參數(shù)和調(diào)用方法對(duì)應(yīng)的類和方法的名稱[18].以下代碼為Android應(yīng)用程序利用反射機(jī)制獲取SIM卡運(yùn)營(yíng)商的例子,當(dāng)代碼執(zhí)行到語句5時(shí),控制流程圖就會(huì)調(diào)用methodS-end類invoke函數(shù),也就無法發(fā)現(xiàn)產(chǎn)生污點(diǎn)的源函數(shù).
1 Class<?>managerClass=Class.forName("android. telephony.TelephonyManager");
2 Method methodDefault=managerClass.getMethod("get-Default", new Class[] {int.class});
3 Object manager = methodDefault.invoke(managerClass, sub);
4 Method methodSend=managerClass.getMethod("getSim OperatorName");
5 string simOperatorName (string)methodSend.invoke(m-anager);
本文檢測(cè)系統(tǒng)采取文獻(xiàn)[18]字符串解析對(duì)號(hào)入座的方法將反射代碼(語句5)轉(zhuǎn)化為語句:
string sim-OperatorName=((TelephonyManager)this.getSyste mService(this.TELEPHONY_SERVICE( ).getSimOperatorName,
這樣就可以發(fā)現(xiàn)代碼中使用了源函數(shù),進(jìn)而解決惡意應(yīng)用程序的開發(fā)者使用反射機(jī)制泄露隱私數(shù)據(jù)的問題.
4.1 實(shí)驗(yàn)環(huán)境與實(shí)驗(yàn)樣本
本文所有實(shí)驗(yàn)在內(nèi)存為8 G,處理器為Intel?CoreTMi5-3337U 1.80 GHz的機(jī)器上完成,檢驗(yàn)算法使用Python和Java語句實(shí)現(xiàn),在算法的執(zhí)行過程中會(huì)使用Mysql數(shù)據(jù)庫(kù)保存組件間通訊匹配組件相關(guān)信息.
4.2 實(shí)驗(yàn)組成
(1)對(duì)本文提出的檢測(cè)系統(tǒng)是否具備檢測(cè)應(yīng)用程序組件間隱私數(shù)據(jù)泄露進(jìn)行功能測(cè)試.DroidBench是專門用于測(cè)試Android平臺(tái)不同惡意應(yīng)用程序類型的基準(zhǔn)測(cè)試程序集合,使用該集合中提供的15個(gè)存在ICC問題的應(yīng)用程序來驗(yàn)證本檢測(cè)系統(tǒng)是否能夠檢測(cè)出組件間隱私數(shù)據(jù)的泄露.
(2)對(duì)本文提出的檢測(cè)系統(tǒng)進(jìn)行有效性的測(cè)試.對(duì)從文獻(xiàn)[16]中抽取的100個(gè)惡意應(yīng)用程序與從Google Play應(yīng)用市場(chǎng)中隨機(jī)下載的100個(gè)無隱私數(shù)據(jù)泄露的應(yīng)用程序進(jìn)行檢測(cè),與標(biāo)定的結(jié)果進(jìn)行對(duì)照,進(jìn)行檢測(cè)系統(tǒng)有效性的驗(yàn)證.
(3)與同類檢測(cè)系統(tǒng)進(jìn)行比較.Iccta[7]、Amandroid[19]是目前研究Android系統(tǒng)應(yīng)用程序隱私數(shù)據(jù)泄露的最新成果,檢測(cè)范圍包括應(yīng)用程序組件間隱私數(shù)據(jù)的泄露.因此,將本檢測(cè)系統(tǒng)與上述的同類方法作橫向比較.
4.3 實(shí)驗(yàn)評(píng)估
4.3.1 功能測(cè)試 DroidBench中有15個(gè)應(yīng)用程序是用于測(cè)試檢測(cè)系統(tǒng)是否能檢測(cè)出組件間隱私數(shù)據(jù)傳遞.本檢測(cè)系統(tǒng)對(duì)這15個(gè)應(yīng)用程序分別進(jìn)行測(cè)試,結(jié)果顯示有13個(gè)應(yīng)用程序存在組件間污點(diǎn)數(shù)據(jù)的通訊,準(zhǔn)確率和召回率均為86.7%,說明本檢測(cè)系統(tǒng)能夠有效地檢測(cè)出組件間污點(diǎn)數(shù)據(jù)的傳輸.
以ActivityCommunication2.apk為例,該應(yīng)用程序的核心代碼如下所示.在OutFlowActivity類中存在源函數(shù)((TelephonyManager)getSystemService(“phone”)).getDeviceId(),根據(jù)在語句10處對(duì)localIntent值的推斷,發(fā)現(xiàn)InFlowActivity類的Intent Filter與其匹配,隨后污點(diǎn)數(shù)據(jù)str傳入目標(biāo)組件InFlowActivity類,而該類中存在錨函數(shù)Log.i(“DroidBench”,getIntent().getStringExtra(“DroidBench”))泄露污點(diǎn)數(shù)據(jù).
1 public class OutFlowActivity extends Activity
2 {
3 protected void onCreate(Bundle paramBundle)
4 {
5 super.onCreate(paramBundle);
6 setContentView(2130903040);
7 String str = ((TelephonyManager)getSystemSer-vice(“phone”)).getDeviceId();
8 Intent localIntent = new Intent("edu.mit.icc_action_string_operations.ACTION".substring(7));
9 localIntent.putExtra("DroidBench", str);
10 startActivity(localIntent);
11 }
12 }
13 public class InFlowActivity extends Activity
14 {
15 protected void onCreate(Bundle paramBundle)
16 {
17 super.onCreate(paramBundle);
18 setContentView(2130903040);
19 Log.i("DroidBench", getIntent().getStringExtra("DroidBench"));
20 }
21 }
本文利用Qihoo-360、Kingsoft、McAfee等56個(gè)Android應(yīng)用程序惡意代碼檢測(cè)工具檢測(cè)包括ActivityCommunication2.apk在內(nèi)的15個(gè)Droid-Bench基準(zhǔn)測(cè)試程序,均未檢測(cè)出隱私數(shù)據(jù)泄露問題,說明目前絕大多數(shù)的商用Android應(yīng)用程序安全軟件均未考慮組件間隱私數(shù)據(jù)的通訊,
4.3.2 有效性測(cè)試 本文先從文獻(xiàn)[16]中抽取的100個(gè)標(biāo)定其泄露類型的惡意應(yīng)用程序,包括組件內(nèi)和組件間的隱私數(shù)據(jù)傳遞,再選取100個(gè)經(jīng)過動(dòng)態(tài)測(cè)試顯示無隱私數(shù)據(jù)泄露的100個(gè)應(yīng)用程序,作為有效性驗(yàn)證的測(cè)試樣本.
評(píng)估檢測(cè)系統(tǒng)有效性使用以下指標(biāo):
A=M/N×100%,
(2)
L=U/N×100%,
(3)
E=W/N×100%.
(4)
式中:A為正確率,L為漏檢率,E為誤報(bào)率,M為對(duì)應(yīng)用程序分類正確的數(shù)量,U為對(duì)存在隱私數(shù)據(jù)泄露的應(yīng)用程序未正確分類的數(shù)量,W為對(duì)應(yīng)用程序分類錯(cuò)誤的數(shù)量,N為樣本集的數(shù)量.
檢測(cè)結(jié)果顯示,有7個(gè)存在隱私數(shù)據(jù)泄露的應(yīng)用程序漏檢,有10個(gè)應(yīng)用程序誤報(bào),漏檢率為3.5%,誤報(bào)率為5.0%,正確率達(dá)到91.5%.
4.3.3 研究比較 本文按照如圖1所示的檢測(cè)系統(tǒng)架構(gòu),選取符合下面敘述的4個(gè)層級(jí)的應(yīng)用程序各20個(gè),用于計(jì)算每個(gè)層級(jí)的平均耗時(shí).第一個(gè)計(jì)時(shí)點(diǎn)設(shè)置在檢查源碼中是否存在與Root有關(guān)的代碼層級(jí)上,該層級(jí)平均耗時(shí)6.17 s.第二個(gè)計(jì)時(shí)點(diǎn)設(shè)置在檢測(cè)Androidmanifest. xml文件中是否同時(shí)存在源函數(shù)與錨函數(shù)的權(quán)限申請(qǐng)層級(jí)上,該層級(jí)的平均耗時(shí)6.54 s.第三個(gè)計(jì)時(shí)點(diǎn)設(shè)置在應(yīng)用程序不存在ICC問題,直接進(jìn)行IDE問題數(shù)據(jù)流分析層級(jí)上,該層級(jí)的平均耗時(shí)27.33 s.第四個(gè)計(jì)時(shí)點(diǎn)設(shè)置在存在ICC問題,將ICC問題轉(zhuǎn)化為IDE問題,再進(jìn)行數(shù)據(jù)流分析層級(jí)上,該層級(jí)平均耗時(shí)為118 s.可以看出,將ICC問題轉(zhuǎn)化為IDE問題并進(jìn)行數(shù)據(jù)流的檢測(cè)是最為耗時(shí)的部分,文獻(xiàn)[7]對(duì)從Google Play隨機(jī)下載的15 000個(gè)應(yīng)用程序進(jìn)行檢測(cè),發(fā)現(xiàn)僅2.2%的應(yīng)用程序存在ICC問題.因此,采取分層檢測(cè)的系統(tǒng)架構(gòu),可以明顯地減少檢測(cè)時(shí)間.
Amandroid和Iccta是目前將組件間污點(diǎn)數(shù)據(jù)傳遞考慮在內(nèi)的具有代表性的檢測(cè)工具,本文選取這兩種工具作橫向比較,將4.3.2節(jié)中選取的200個(gè)應(yīng)用程序作為測(cè)試程序,比較三者的性能,結(jié)果如表1所示.表中,P為正確率,R為召回率,t為平均耗時(shí).可以看出,因?yàn)楸緳z測(cè)系統(tǒng)采取分層檢測(cè)的架構(gòu),將應(yīng)用程序過度申請(qǐng)權(quán)限和超出靜態(tài)檢測(cè)范圍等情況考慮在內(nèi),所以,在正確率和召回率接近的情況下,本文檢測(cè)系統(tǒng)檢測(cè)耗時(shí)明顯縮短.
表1 Amandroid、Iccta和本文檢測(cè)系統(tǒng)的正確率、召回率、耗時(shí)比較
Tab.1 Comparison among Amadroid, Iccta and our detection system in terms of precision, recall rate and time-consuming
檢測(cè)工具P/%R/%t/sAmandroid[19]90.687.0147Iccta[7]94.094.0167本文檢測(cè)系統(tǒng)90.293.067
本文提出的Android應(yīng)用程序隱私數(shù)據(jù)泄露檢測(cè)系統(tǒng)檢測(cè)范圍包含應(yīng)用程序組件內(nèi)和組件間通信,考慮了反射、回調(diào)、組件生命周期等Android應(yīng)用程序特有的情況,同時(shí)采用分層的架構(gòu)以提高效率.實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)能夠高效、準(zhǔn)確地檢測(cè)出Android應(yīng)用程序是否存在隱私數(shù)據(jù)泄露,與現(xiàn)有的檢測(cè)方法相比,在正確率和召回率想接近的情況下,檢測(cè)耗時(shí)明顯縮短.
下一步工作將重點(diǎn)研究未檢測(cè)出的2個(gè)Droid-Bench基準(zhǔn)測(cè)試程序的ICC類型.部分應(yīng)用程序會(huì)使用動(dòng)態(tài)加載技術(shù),在程序運(yùn)行時(shí)才會(huì)執(zhí)行相關(guān)的惡意代碼,導(dǎo)致靜態(tài)分析應(yīng)用程序時(shí)無法獲知其惡意行為,影響檢測(cè)系統(tǒng)的數(shù)據(jù)流分析,造成檢測(cè)結(jié)果的假陽(yáng)性,因此,今后會(huì)將動(dòng)態(tài)檢測(cè)作為本文檢測(cè)系統(tǒng)的一個(gè)補(bǔ)充組成部分,用來彌補(bǔ)靜態(tài)檢測(cè)的缺陷.
[1] 吳澤智,陳性元,楊智,等.安卓隱私安全研究發(fā)展[J].計(jì)算機(jī)應(yīng)用研究,2014,31(8):2241-2246. WU Ze-zhi, CHEN Xing-yuan, YANG Zhi, et al. Survey on privacy security for Android [J]. Application Research of Computers, 2014, 31(8): 2241-2246.
[2] LU L, LI Z C, WU Z Y, et al.Chex: statically vetting android apps for component hijacking vulnerabilities [C] ∥ Proceedings of ACM Conference on Computer and Communications Security. New York: ACM, 2012:229-240.
[3] CHAN P P F, HUI L C K, YIU S M.DroidChecker: analyzing android applications for capability leak [C] ∥ Proceedings of the Fifth ACM Conference on Security and Privacy in Wireless and Mobile Networks. New York: ACM,2012: 125-136.
[4] ARZT S, RASTHOFER S, BODDEN E, et al. Flowdroid: precise context, flow, field, object-sensitive and lifecycle-aware taint analysis or android apps [C] ∥ Proceedings of the 35th Annual ACM SIGPLAN Conference on Programming Language Design and Impleme-ntation. Edinburgh: ACM, 2014, 49(6): 259-269.
[5] 王兆國(guó),李城龍,張洛什,等.一種基于行為鏈的Android應(yīng)用隱私竊取檢測(cè)方法[J].電子學(xué)報(bào),2015,43(9): 1750-1755. WANG Zhao-guo, LI Cheng-long, ZHANG Luo-shi,et al. A privacy stealing detection method based on behavior-chain for android application [J]. Acta Electron-ica Sinica, 2015, 43(9): 1750-1755.
[6] OCTEAU D, MCDANIEL P, JHA S, et al. Effective inter-component communication mapping in Android with epic: an essential step towards holistic securityanalysis [C] ∥ Proceedings of the 22nd USENIX Conference on Security. Berkeley: ACM, 2013: 543-558.
[7] LI L, BARTEL A, BISSYANDE T F, et al. ICCTA: Detecting inter-component privacy leaks in Android Apps [C] ∥ Proceedings of the 37th International Conference on Software Engineering. Florence: IEEE, 2015: 280-291.
[8] DENNING D E, DENNING P J. Certification of programs for secure information flow [J]. Communications of the ACM, 2015, 47(20): 504-513.[9] 萬志遠(yuǎn),周波.基于靜態(tài)信息流跟蹤的輸入驗(yàn)證漏洞檢測(cè)方法[J].浙江大學(xué)學(xué)報(bào):工學(xué)版, 2015, 49(4): 683-691. WAN Zhi-yuan, ZHOU Bo.Static information flow tracking based approach to detect input validation vulnerabilities [J]. Journal of Zhejiang University: Engineering Science, 2015, 49(4): 683-691.
[10] GULWANI S, NECULA G C. Precise interprocedural analy-sis using random interpretation [J]. ACM Sigplan Notices, 2015, 40(1): 324-337.
[11] 方捷.格論導(dǎo)引[M].北京:高等教育出版社,2014: 12-14.
[12] 倪程,李志蜀.基于數(shù)據(jù)流的Java字節(jié)碼分析[J].微計(jì)算機(jī)信息,2009,25(12): 231-232. NI Cheng, LI Zhi-shu. Analysis on Java bytecode based on data flow [J]. Microcomputer Information, 2009, 25(12): 231-232.
[13] OCTEAU D, JHA S, MCDANIEL P. Retargeting Android applications to java bytecode [C] ∥ Proceedings of the 20th ACM SIGSOFT International Symposium on the Foundations of Software Engineering, New York: ACM, 2012: 6.
[14] OCTEAU D, LUCHAUP D, DERING M, et al.Composite constant propagation: application to android inter-component communication analysis [C] ∥ Proceedings of the ACM SIGSOFT 37th International Conference on Software Engineering. Florence: IEEE, 2015: 77-88.
[15] 刑曉燕,金洪穎,田敏. Android系統(tǒng)Root權(quán)限獲取與檢測(cè) [J] .軟件,2013, 34(12): 208-210. XING Xiao-yan, JIN Hong-ying, TIAN Min. Android system root access and detection [J]. Computer Engineering and Software, 2013,34(12): 208-210.
[16] ZHOU Y,JIANG X. Dissecting Android malware: characterization and evolution [C] ∥ Proceedings of IEEE Symposium on Security and Privacy. Oakland: IEEE, 2012: 95-109.
[17] RASTHOFER S, ARZT S, BODDEN E. A machine-learning approach for classifying and categorizing Android sources and sinks [C] ∥ Proceedings of 2014 Network and Distributed System Security Symposium. San Diego: SIG, 2014: 1-15.
[18] 劉濤,唐祝壽,沈備軍.Android應(yīng)用隱私泄露的自動(dòng)化檢測(cè)[J].計(jì)算機(jī)應(yīng)用與軟件,2015,32(3): 297-316. LIU Tao, TANG Zhu-shou, SHEN Bei-jun.Automatically detection privacy leaks of Android applications [J].Computer Applications and Software, 2015, 32(3): 297-316.
[19] WEI F,ROY S,OU X, et al.Amandroid: a precise and genenal inter-component data flow analysis framework for security vetting of android apps [C] ∥ Proceedings of the ACM Conference on Computer and Communications Security. Scottsdale: ACM, 2014: 1329-1341.
Privacy data leakage detection for Android application
JIANG Xu1, ZHANG Chang-sheng2, DAI Da-meng2, RUAN Jing3, MU De-jun1
(1.DepartmentofAutomation,NorthwesternPolytechnicalUniversity,Xi’an710071,China;2.DepartmentofPhysicsandElectronicInformationEngineering,WenzhouUniversity,Wenzhou325000,China;3.WenzhouVocationalandTechnicalCollege,Wenzhou325000,China)
A multi-level detection method based on semi-lattice data flow analysis was proposed in order to solve the problem of Android privacy data leakage. For the applications without root privilege, the fine-grained range of source functions was determined that generated privacy data and sink functions that leaked them, according to the permissions for the application. If the source functions and the sink functions existed in the same application, the detection system began to analyze data flow. When the two kinds of functions located in different components, the method could transform inter-component communication (ICC) problem into inter-procedural distributive environment (IDE) problem. Results show that the proposed method can detect the privacy data leakage not only for communication in the same component, but also for communication between different components. The accuracy of the proposed method reaches 91.5%, which can significantly save detection time compared with other state-of-the-art methods under the condition of similar precision and recall rate.
Android system; static detection; privacy data; inter-component communication (ICC);semi-lattice
2015-12-31.
國(guó)家自然科學(xué)基金資助項(xiàng)目(6130324);浙江省自然科學(xué)基金資助項(xiàng)目(LY13F020024); 浙江省科技廳公益性資助項(xiàng)目(2014C31079).
蔣煦(1983—),男,博士生,從事信息安全研究.ORCID: 0000-0001-5840-5682.E-mail: jiangxu@mail.nwpu.edu.cn 通信聯(lián)系人:慕德俊,男,教授. ORCID:0000-0002-2425-6751. E-mail: Mudejun@nwpu.edu.cn
10.3785/j.issn.1008-973X.2016.12.016
TP 309
A
1008-973X(2016)12-2357-07