藺鳳池, 高 見
(中國(guó)人民公安大學(xué)網(wǎng)絡(luò)安全保衛(wèi)學(xué)院, 北京 100038)
?
Android APP數(shù)據(jù)泄露的靜態(tài)污點(diǎn)分析方法研究
藺鳳池,高見
(中國(guó)人民公安大學(xué)網(wǎng)絡(luò)安全保衛(wèi)學(xué)院, 北京100038)
摘要Android作為占據(jù)市場(chǎng)份額最大的開源操作系統(tǒng)成為了重點(diǎn)攻擊對(duì)象,用戶數(shù)據(jù)安全問題越發(fā)引起各界關(guān)注。加強(qiáng)對(duì)Android APP的安全監(jiān)測(cè)方法技術(shù)研究是當(dāng)務(wù)之急,在研究分析當(dāng)下較為成熟的幾種檢測(cè)技術(shù)的基礎(chǔ)上,重點(diǎn)研究分析靜態(tài)污點(diǎn)分析方法的監(jiān)測(cè)原理及過(guò)程,以尋求更多更為高效的安全監(jiān)測(cè)方法來(lái)提高Android APP的安全性。
關(guān)鍵詞Android APP; 數(shù)據(jù)泄露; 靜態(tài)分析; 污點(diǎn)分析
0引言
智能手機(jī)等電子移動(dòng)設(shè)備上的移動(dòng)終端第三方應(yīng)用程序APP,以其特有的優(yōu)勢(shì)在人們的生活中扮演著越來(lái)越重要的角色,也承載著越來(lái)越多的用戶私人信息。大量數(shù)據(jù)表明,APP技術(shù)在飛速發(fā)展的同時(shí)也帶來(lái)了安全問題。當(dāng)下最流行的移動(dòng)操作系統(tǒng)中,Android作為占據(jù)市場(chǎng)份額最大的開源OS已經(jīng)成為了重點(diǎn)攻擊對(duì)象,大量學(xué)者針對(duì)Android APP數(shù)據(jù)泄露監(jiān)測(cè)進(jìn)行了相關(guān)研究。監(jiān)測(cè)方法分類很多,其中靜態(tài)分析方法以其精度大的優(yōu)勢(shì)占據(jù)最多。本文結(jié)合Android自身特性,在靜態(tài)分析的基礎(chǔ)上引入污點(diǎn)分析,對(duì)Android APP數(shù)據(jù)泄露的原理及過(guò)程做出分析與驗(yàn)證。
Android APP安全問題很多,針對(duì)不同問題均有相應(yīng)的監(jiān)測(cè)方法,本文針對(duì)數(shù)據(jù)泄露這一安全問題的監(jiān)測(cè)方法進(jìn)行深入研究。從不同角度出發(fā),研究成果顯著的主要有重打包技術(shù)、權(quán)限提升檢測(cè)技術(shù)、API調(diào)用監(jiān)測(cè)分析技術(shù)、靜態(tài)污點(diǎn)分析技術(shù)等。
1Android APP數(shù)據(jù)泄露靜態(tài)污點(diǎn)分析原理
靜態(tài)分析是指在程序不運(yùn)行的情況下,采用語(yǔ)法分析、語(yǔ)義分析等技術(shù)手段對(duì)程序文件進(jìn)行掃描從而生成程序的反匯編代碼來(lái)掌握程序功能的一種方法。
靜態(tài)分析的核心內(nèi)容,就是要確定對(duì)象的指向信息。指向信息的確定可以通過(guò)指針指向分析算法進(jìn)行估算。指針指向分析,顧名思義,就是指采用某種計(jì)算方法來(lái)預(yù)估對(duì)象和變量之間的指針指向關(guān)系,可以通過(guò)語(yǔ)義、語(yǔ)法等相關(guān)分析技術(shù)手段獲取變量的屬性操作等數(shù)據(jù),根據(jù)解析出來(lái)的數(shù)據(jù)預(yù)估出該變量在APP運(yùn)行的時(shí)候可能會(huì)指向哪些對(duì)象,由此得到該APP在運(yùn)行時(shí)可能的指針指向信息。指針指向分析具有較高的復(fù)雜度,但它是靜態(tài)分析的基礎(chǔ),也是一種特殊的數(shù)據(jù)流分析。由于內(nèi)在的確定代碼行為的不可判定性,它得到的結(jié)果只是某種程度上的近似結(jié)果,提高精度勢(shì)必要以時(shí)間耗費(fèi)為代價(jià),所以,所有的靜態(tài)分析必須在精度和速度上做一個(gè)權(quán)衡[6-7]。
污點(diǎn)分析是指通過(guò)分析程序運(yùn)行時(shí)可能的數(shù)據(jù)流,來(lái)標(biāo)記跟蹤特定數(shù)據(jù)的過(guò)程。污點(diǎn)分析可以分為四個(gè)部分,污點(diǎn)、污點(diǎn)源(source)、傳播過(guò)程和污點(diǎn)庫(kù)(sink)。污點(diǎn)就是指要追蹤的特定數(shù)據(jù);污點(diǎn)源則是能夠?qū)е挛埸c(diǎn)傳播的來(lái)源,可以是程序的輸入,也可以是調(diào)用污點(diǎn)的函數(shù);污點(diǎn)庫(kù)是指可能將污點(diǎn)發(fā)送出應(yīng)用程序的相關(guān)操作代碼[4]。污點(diǎn)分析要求預(yù)先定義好source和sink,source指的是那些能夠提供敏感信息的庫(kù),如提供通訊錄信息的API方法,sink則是指那些可能會(huì)泄露數(shù)據(jù)的庫(kù),如能夠?qū)⑿畔魉偷侥硞€(gè)惡意第三方服務(wù)器的方法。然后追蹤來(lái)自source的污點(diǎn)數(shù)據(jù)在source和sink之間是否存在數(shù)據(jù)流。
從數(shù)據(jù)流的角度來(lái)看,數(shù)據(jù)泄露可以看作這樣一個(gè)過(guò)程:敏感數(shù)據(jù)從其存儲(chǔ)區(qū)域受某種方法或行為的調(diào)用傳遞到某個(gè)惡意目的地。為此可通過(guò)污點(diǎn)分析來(lái)實(shí)現(xiàn)追蹤,污點(diǎn)分析可將APP所有可能的惡意數(shù)據(jù)流提供給分析者或者自動(dòng)惡意探測(cè)工具,然后根據(jù)相關(guān)政策判斷出是否存在泄露行為。如果在污點(diǎn)源和污點(diǎn)庫(kù)之間存在一條路徑,那么這條路徑就很有可能存在泄露數(shù)據(jù)的危險(xiǎn),當(dāng)然,如果僅僅是觸發(fā)了污點(diǎn)庫(kù)里的函數(shù),并沒有引入污點(diǎn)數(shù)據(jù),是不會(huì)對(duì)污點(diǎn)數(shù)據(jù)造成威脅的。
靜態(tài)污點(diǎn)分析則是在靜態(tài)分析的基礎(chǔ)上加入污點(diǎn)分析原理,使其結(jié)果為該分析方法所期望的可疑數(shù)據(jù)流[8]。從數(shù)據(jù)流的角度來(lái)看,對(duì)于Android APP中數(shù)據(jù)泄露行為可以是這樣一個(gè)過(guò)程:敏感數(shù)據(jù)從其存儲(chǔ)區(qū)域受某種方法或行為的操作傳遞到某個(gè)惡意目的地。如果對(duì)Android APP用戶隱私泄露監(jiān)測(cè)加入靜態(tài)污點(diǎn)分析,那么污點(diǎn)源可以是能夠獲取隱私信息的函數(shù),如讀取最新位置信息的getLastKnownLocation()函數(shù),污點(diǎn)庫(kù)可以是具有短信發(fā)送功能的函數(shù)等具有引發(fā)危險(xiǎn)問題的庫(kù)函數(shù)。污點(diǎn)源中的函數(shù)在獲取污點(diǎn)數(shù)據(jù)之后,可能會(huì)依次通過(guò)不同的變量將污點(diǎn)數(shù)據(jù)傳遞到污點(diǎn)庫(kù)函數(shù)中,在此過(guò)程中,所有存儲(chǔ)了該污點(diǎn)數(shù)據(jù)的變量都應(yīng)該被標(biāo)記為污點(diǎn)狀態(tài),這樣就可以追蹤過(guò)程,即追蹤標(biāo)記為污點(diǎn)狀態(tài)的變量的數(shù)據(jù)流過(guò)程。
Android系統(tǒng)是基于組件的,鑒于此,Android APP之間或內(nèi)部的數(shù)據(jù)傳遞也是基于組件的。組件之間通訊是通過(guò)發(fā)送Intent組件傳遞信息來(lái)實(shí)現(xiàn)的,追蹤污點(diǎn)的數(shù)據(jù)流就是追蹤各個(gè)組件之間Intent的傳播數(shù)據(jù)流。因?yàn)镮ntent有兩種類型,一種是明確發(fā)送目的地的顯式Intent,一種是沒有明確發(fā)送目的地的隱式Intent。一般情況下,隱式Intent的發(fā)送目的地可以根據(jù)其過(guò)濾器Intent Filter篩選確定[9]。
2數(shù)據(jù)泄露行為過(guò)程分析
我們假設(shè)一種最簡(jiǎn)單的數(shù)據(jù)泄露行為污點(diǎn)分析,即組件Component1(用C1標(biāo)識(shí))從污點(diǎn)源source中獲取了數(shù)據(jù),組件Component2(用C2標(biāo)識(shí))調(diào)用C1讀取的數(shù)據(jù),并通過(guò)發(fā)送函數(shù)將數(shù)據(jù)信息發(fā)送到污點(diǎn)庫(kù)sink中。用于在組件之間通訊的組件Intent(用I標(biāo)記),根據(jù)Intent組件特性,它所包含的信息格式中至少有I(C1,C2,id),其中C1,C2表示通訊的組件,id唯一標(biāo)示Intent。污點(diǎn)源Source用sor標(biāo)記,污點(diǎn)庫(kù)Sink用sink標(biāo)記,Sent()則表示用于將數(shù)據(jù)信息發(fā)送出去的函數(shù)。為了分析具有代表性,默認(rèn)為是發(fā)送的隱式Intent,不明確的數(shù)據(jù)用null來(lái)表示[10]。
圖1組件間數(shù)據(jù)傳遞
圖1的內(nèi)容表示了假設(shè)的數(shù)據(jù)泄露過(guò)程,可以用以下表達(dá)式表達(dá),其中→表示左邊變量傳遞數(shù)據(jù)給右邊變量:
C1:sor→I(C1,null,id1)
C2:I(null,C2,null)→Sent(I(null,C2,null))
Sent(I(null,C2,null))→sink
研究分析的最終目標(biāo)是要清楚污點(diǎn)數(shù)據(jù)是如何在組件之間進(jìn)行傳遞的,對(duì)于每個(gè)Intent,都要計(jì)算出可能的接收者,再根據(jù)相應(yīng)的匹配規(guī)則篩選出觸發(fā)者。事實(shí)上的數(shù)據(jù)流表達(dá)式應(yīng)與3.1中表達(dá)式有一一對(duì)應(yīng)關(guān)系,即:
C1:sor→I(C1,C2,id1)
C2:I(C1,C2,id1)→Sent(I(C1,C2,id1))
Sent(I(C1,C2,id1))→sink
如果用T(m)來(lái)表示數(shù)據(jù)m的污點(diǎn)狀態(tài),所有包含m的數(shù)據(jù)流都應(yīng)該標(biāo)記為污點(diǎn)狀態(tài)。如果污點(diǎn)數(shù)據(jù)m傳遞給了n,即m→n,n中至少是包含了m污點(diǎn),用m?n標(biāo)記。則上述等式至少可以這樣表示:
C1:T(sor)?T(I(C1,null,id1))
C2:T(I(null,C2,null))?T(Sent(I(null,C2,null)))
T(Sent(I(null,C2,null)))?T(sink)
用于傳遞數(shù)據(jù)的Intent標(biāo)記為IT,那么它一定含有的信息格式是I(CT,null,id),而用于接收數(shù)據(jù)的Intent標(biāo)記為IR,它所含有的數(shù)據(jù)格式一定包含I(null,CR,null)。這里用S來(lái)表示污點(diǎn)源Source和污點(diǎn)庫(kù)Sink。接下來(lái)的任務(wù)就是要確定某一個(gè)特定污點(diǎn)在污點(diǎn)源與污點(diǎn)庫(kù)之間存在數(shù)據(jù)流,具體確定步驟如下[11]:
(1)根據(jù)上述定義,作為傳遞數(shù)據(jù)污點(diǎn)源sor一定含有I(CT,null,id),如果Sor也包含I(null,CR,null),那么根據(jù)IR的過(guò)濾匹配規(guī)則,就可以確定sor一定有I(CT,CR,id);
(2)因?yàn)樽鳛榻邮諗?shù)據(jù)的sink中包含I(null,CR,null),如果可以計(jì)算出sink也包含I(CT,null,id),那么sink也一定有I(CT,CR,id),原理同上;
(3)如果sor有Sent(I(CT,null,null)),那么也一定可以計(jì)算出sor包含R(I(CT,CR,id))。這是因?yàn)楦鶕?jù)CR組件中Intent Filter匹配原則,存在屬于S的I(CT,null,id),且R(I(null,CR,null))同屬于S;
(4)同理可以推出,如果sink含有R(I(null,CR,null)),就能推測(cè)出sink含有R(I(CT,CR,id));
(5)根據(jù)上述推理,如果sor含有數(shù)據(jù)格式I(null,CR,null),sink包含I(CT,null,id),就可以確定兩者之間存在數(shù)據(jù)流,即存在數(shù)據(jù)泄露行為。
靜態(tài)分析最復(fù)雜、耗時(shí)最長(zhǎng)的部分是為對(duì)象及其域計(jì)算精確的指向信息,基于組件通訊的Android系統(tǒng),對(duì)其進(jìn)行靜態(tài)分析時(shí)也需要計(jì)算組件通信邊的值。從上述靜態(tài)污點(diǎn)分析過(guò)程中可以看出,確定污點(diǎn)數(shù)據(jù)流的關(guān)鍵在于找到不同Intent和不同變量之間的映射關(guān)系,而這些指向信息和映射關(guān)系,可以通過(guò)為Android APP建立包含所有結(jié)點(diǎn)可能的指向信息及程序間控制流圖的組件間數(shù)據(jù)流圖來(lái)實(shí)現(xiàn)。
Fengguo Wei等人設(shè)計(jì)的Amandroid通過(guò)指針指向分析算法為所有對(duì)象及域計(jì)算流敏感和上下文敏感的指向信息,在創(chuàng)建的Android運(yùn)行環(huán)境模型中,對(duì)Android APP進(jìn)行靜態(tài)分析,并為所有對(duì)象創(chuàng)建組件間數(shù)據(jù)流圖,在此基礎(chǔ)上只需要加入特定功能插件就可以判斷出是否存在特定的安全威脅[5]。
在Amandroid通用框架的基礎(chǔ)上,筆者通過(guò)引入靜態(tài)污點(diǎn)分析原理,將通訊信息,如通訊錄、短信息、通話記錄等標(biāo)記為污點(diǎn)數(shù)據(jù),并對(duì)可能獲取到通訊信息的污點(diǎn)源以及可能涉及泄露行為的污點(diǎn)庫(kù)等進(jìn)行制定,設(shè)計(jì)出針對(duì)Android APP用戶通訊隱私泄露行為監(jiān)測(cè)的工具CommunicationLeakage。并進(jìn)行了一定量的數(shù)據(jù)實(shí)驗(yàn),驗(yàn)證了靜態(tài)污點(diǎn)分析的可行性,圖2為部分APP檢測(cè)結(jié)果的截圖,其中第一個(gè)和第三個(gè)APP,即AndroidSpecific_PrivateDateLeak3.apk和Lifecycle_SeviceLifecycle1.apk,不存在通訊信息泄露問題,而第二個(gè)APP,CallLogTest.apk,存在一條數(shù)據(jù)泄露路徑。
圖2 部分實(shí)驗(yàn)結(jié)果
根據(jù)實(shí)驗(yàn)結(jié)果提示的泄露路徑信息,即從Set((Lom/fgwei/calllogtest/MainActivity;.onCreate(Landroid/os/Bundle;)V,stmt_source))到Set((Landroid/util/Log;.i:(Ljava/lang/String;Ljava/lang/String;)I,api_sink)),筆者找到該APP的apk源代碼,對(duì)應(yīng)找出具體路徑,如圖3所示。該路徑表示,被賦予污點(diǎn)的數(shù)據(jù)可以訪問通話記錄的唯一通用資源標(biāo)識(shí)符URI賦給了變量v1,通過(guò)調(diào)用訪問數(shù)據(jù)庫(kù)的函數(shù)query()等一系列函數(shù)和規(guī)則,最終將獲取到的通話記錄打印出來(lái),即可認(rèn)為是泄露。
圖3 數(shù)據(jù)泄露路徑源代碼
3結(jié)論與展望
本文中所提及CommunicationLeakge工具的研究和設(shè)計(jì)仍在進(jìn)一步完善中,在后續(xù)研究工作中將繼續(xù)加大對(duì)監(jiān)測(cè)工具CommunicationLeakage的檢驗(yàn)與校正。
Android平臺(tái)的應(yīng)用發(fā)展無(wú)疑會(huì)持續(xù)增長(zhǎng),它所帶來(lái)的APP安全問題也會(huì)越來(lái)越嚴(yán)重,為此針對(duì)Android APP安全監(jiān)測(cè)技術(shù)方法的研究也必須提上日程。本文在研究了較為成熟的幾種安全監(jiān)測(cè)方法(即重打包技術(shù)、權(quán)限提升檢測(cè)技術(shù)、API調(diào)用監(jiān)測(cè)分析技術(shù)、靜態(tài)污點(diǎn)分析技術(shù)等)基礎(chǔ)上,從靜態(tài)污點(diǎn)分析方法的角度對(duì)數(shù)據(jù)泄露行為進(jìn)行詳細(xì)分析,從兩種主流的分析方法角度出發(fā),對(duì)這兩種方式較為成熟的工具原理進(jìn)行了分析。無(wú)論是使用權(quán)限提升方法檢測(cè)APP是否存在組件劫持漏洞,還是利用污點(diǎn)分析對(duì)數(shù)據(jù)流進(jìn)行分析來(lái)判斷是否存在泄露數(shù)據(jù)行為,都只是針對(duì)Android APP安全監(jiān)測(cè)技術(shù)方法發(fā)展中的一部分。監(jiān)測(cè)Android APP是否存在漏洞或者惡意行為并不是我們的最終目的,只是利用這些技術(shù)方法去發(fā)現(xiàn)問題,解決問題防止用戶隱私泄露、確保用戶合法權(quán)益才是最終要達(dá)到的目的。
參考文獻(xiàn)
[1]XU R, SAIDI H, ANDERSON R. Aurasium: Practical Policy Enforcement for Android Application[C]s∥USENIX Security Symposium, 2012.
[2]CHIN E, FELT A P, GREENWOOD K, et al. Analyzing inter-application communication in Android[C]∥Proceedings of the 9th international conference on Mobile systems, applications, and services. ACM, 2011:239-252.
[3]SEONHO CHOI, MICHAEL BIJOU, KUN SUN, et al. API tracing tool for android-based mobile devices[J]∥International Journal of Information and Education Technology, 2015,5(6).
[4]曾述可. 基于靜態(tài)分析的Android操作系統(tǒng)隱私保護(hù)機(jī)制評(píng)估方法研究[D].合肥:中國(guó)科學(xué)技術(shù)大學(xué),2014.
[5]WEI F, ROY S, OU X, et al. Amandroid: a precise and general inter-component data flow analysis framework for security vetting of android apps∥http:∥dx.doi.org/10.1145/2660.267.2660357.
[6]徐厚峰,馬曉東. 空指針解引用錯(cuò)誤檢測(cè)的靜態(tài)方法研究[J].計(jì)算機(jī)工程與科學(xué),2009(3):92-96.
[7]李倩,湯恩義,等. Java指針指向分析優(yōu)化[J].軟件學(xué)報(bào),2011(6):1140-1154.
[8]FRITZ C. FlowDroid: a precise and scalable data flow analysis for android. Master’s thesis, TU Darmstadt, July 2013.
[9]符易陽(yáng),周丹平. Android安全機(jī)制分析[J].信息網(wǎng)絡(luò)安全,2011,3(9):23-25.
[10]OCTEAU D, MCDDANIEL P, JHA S, et al. Effective inter-component communication mappingin Android with Epicc: An essential step towards holistic securityanalysis. In Proc. USENIX Security, 2013.
[11]ARZT S, RASTHOFER S, FRITZ C. FlowDroid: Precise context,flow,field, object-sensitive and lifecycle-aware taint analysis for Android apps[J]. In Proceedings of the ACM PLDI, 2014.
(責(zé)任編輯陳小明)
作者簡(jiǎn)介藺鳳池(1989—), 女, 江蘇徐州人, 2013級(jí)網(wǎng)絡(luò)安全保衛(wèi)學(xué)院碩士研究生。
中圖分類號(hào)D035.399