宋宇波,陳琪,宋睿,胡愛群
(1.東南大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,江蘇 南京 211189;2.東南大學(xué)江蘇省計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)重點(diǎn)實(shí)驗(yàn)室,江蘇 南京 211189;3.網(wǎng)絡(luò)通信與安全紫金山實(shí)驗(yàn)室,江蘇 南京 211189;4.東南大學(xué)信息科學(xué)與工程學(xué)院,江蘇 南京 211189)
目前,手機(jī)已成為人們生活不可分割的一部分,人們通過手機(jī)進(jìn)行視頻通信、電子商務(wù)和網(wǎng)絡(luò)教學(xué)等活動(dòng)。由于手機(jī)和個(gè)人信息的高度捆綁,惡意攻擊者開始攻擊智能設(shè)備,導(dǎo)致用戶的敏感信息和個(gè)人隱私數(shù)據(jù)泄露。在眾多智能終端中,安裝了Android 系統(tǒng)的終端占有最大比例,這意味著Android系統(tǒng)所受到的惡意攻擊和安全威脅也最多。Android系統(tǒng)的安全機(jī)制存在幾個(gè)關(guān)鍵的薄弱環(huán)節(jié)。
1) Android 系統(tǒng)的碎片化問題給該系統(tǒng)的安全防護(hù)帶來了巨大的障礙。Google 官方發(fā)布的系統(tǒng)補(bǔ)丁只優(yōu)先提供給Android 系統(tǒng)的最新發(fā)行版本,通常并不承諾甚至拒絕前向兼容舊版本的系統(tǒng)[1]。因此,大量安裝了舊版本Android 系統(tǒng)的設(shè)備只能被動(dòng)地等待各級(jí)系統(tǒng)提供商發(fā)布更新補(bǔ)丁。
2) Android 系統(tǒng)采用基于權(quán)限的安全模型來保護(hù)用戶的敏感資源和個(gè)人隱私,然而這種通用的模型并不能滿足某些特定的安全需求。一些個(gè)人和組織出于使用環(huán)境或場(chǎng)景的考慮,有強(qiáng)烈動(dòng)機(jī)需要對(duì)特定應(yīng)用程序執(zhí)行定制的安全防護(hù)策略[2-3],僅依靠Android 系統(tǒng)的安全架構(gòu)完全無法滿足這一需求。
3) 與另一個(gè)主要的移動(dòng)設(shè)備操作系統(tǒng)iOS 不同,Android 系統(tǒng)并不強(qiáng)制要求統(tǒng)一的應(yīng)用程序發(fā)布和審查機(jī)制。Android 系統(tǒng)的應(yīng)用程序不需要經(jīng)過充分有效的審核流程就可以被安裝到設(shè)備上,這給Android 系統(tǒng)用戶帶來了巨大的安全風(fēng)險(xiǎn)。
針對(duì)上述安全漏洞和惡意攻擊方法,已經(jīng)有很多研究者提出了各種分析和檢測(cè)Android 系統(tǒng)惡意應(yīng)用的方案,并且開發(fā)了許多技術(shù)和工具[4-6]。研究者通常采用靜態(tài)代碼分析或動(dòng)態(tài)運(yùn)行時(shí)檢測(cè)等手段對(duì)惡意應(yīng)用軟件進(jìn)行檢測(cè)與甄別[7]。靜態(tài)檢測(cè)通常通過分析 Android應(yīng)用程序的AndroidManifest.xml 文件來考察應(yīng)用程序的權(quán)限調(diào)用情況,或者逆向得到應(yīng)用程序的源代碼,并對(duì)代碼的執(zhí)行邏輯進(jìn)行分析。然而,考慮到Android 應(yīng)用程序的軟件規(guī)模與日俱增,同時(shí)代碼混淆和加固技術(shù)被廣泛應(yīng)用于軟件發(fā)布和打包過程,靜態(tài)源代碼分析的甄別能力極其有限。相對(duì)地,動(dòng)態(tài)分析方法能夠從程序執(zhí)行邏輯層面考察應(yīng)用程序的行為,通常構(gòu)建獨(dú)立檢測(cè)環(huán)境并將應(yīng)用程序置于該環(huán)境中,通過污點(diǎn)分析、黑盒測(cè)試等方式對(duì)應(yīng)用程序進(jìn)行分析和測(cè)試[8]。然而,現(xiàn)在的惡意攻擊者能夠檢測(cè)應(yīng)用程序運(yùn)行時(shí)是否處于被監(jiān)控環(huán)境或仿真器環(huán)境下,進(jìn)而使其惡意邏輯失活從而逃避動(dòng)態(tài)運(yùn)行時(shí)檢測(cè)[9]。
靜態(tài)分析和動(dòng)態(tài)分析等手段是對(duì)惡意應(yīng)用程序進(jìn)行甄別,并對(duì)甄別出的應(yīng)用程序進(jìn)行相應(yīng)的封禁處理。這些已有的研究無法解決新的Android 版本中增加的動(dòng)態(tài)權(quán)限申請(qǐng)?zhí)匦詭淼淖R(shí)別困難問題,也無法解決利用反射特性等技術(shù)進(jìn)行動(dòng)態(tài)代碼構(gòu)造的惡意應(yīng)用程序的識(shí)別問題。
基于此,本文設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)Android 應(yīng)用程序的動(dòng)態(tài)策略權(quán)限控制系統(tǒng),可根據(jù)用戶需求實(shí)施權(quán)限控制和生成安全策略。該系統(tǒng)基于Android的虛擬機(jī)字節(jié)碼注入技術(shù),在目標(biāo)應(yīng)用程序涉及敏感操作和危險(xiǎn)權(quán)限調(diào)用的方法單元中添加安全策略執(zhí)行代碼,并通過Java 反射特性動(dòng)態(tài)地調(diào)用安全功能,在安全需求發(fā)生變更時(shí)動(dòng)態(tài)切換權(quán)限控制級(jí)別,而不需要重新注入字節(jié)碼或?qū)?yīng)用程序進(jìn)行重打包。通過這種權(quán)限策略控制,用戶和組織能夠根據(jù)需求動(dòng)態(tài)地允許或禁止應(yīng)用程序的權(quán)限授予和使用,從而更好地保護(hù)個(gè)人和組織隱私安全。
Android 移動(dòng)操作系統(tǒng)的安全性構(gòu)建在以權(quán)限系統(tǒng)為基礎(chǔ)的敏感資源訪問模型上,這些敏感資源包括但不限于位置信息,以及相機(jī)傳感器、麥克風(fēng)、通信錄和SMS(short messaging service)的信息等。通常,若一個(gè)Android 應(yīng)用程序企圖獲取對(duì)某個(gè)敏感資源的訪問權(quán)限,就必須在Android Manifest.xml清單中顯式地聲明所需的權(quán)限。而用戶可以選擇授予或者不授予該權(quán)限。但是,這樣的權(quán)限系統(tǒng)正在被一些應(yīng)用程序?yàn)E用,這些應(yīng)用程序聲明的權(quán)限遠(yuǎn)多于實(shí)現(xiàn)必要功能所必需的權(quán)限[10]。Felt 等[11]考察了應(yīng)用市場(chǎng)上的相當(dāng)一部分應(yīng)用程序,并發(fā)現(xiàn)大量應(yīng)用程序都存在上述問題。更糟糕的是,每當(dāng)操作系統(tǒng)或者應(yīng)用程序更新時(shí),這些惡意的應(yīng)用程序都可以通過更新累積的方式進(jìn)行特權(quán)升級(jí),從而在靜默狀態(tài)下轉(zhuǎn)換成惡意軟件[12]。
針對(duì)上述問題,近年來相關(guān)領(lǐng)域研究者主要采用靜態(tài)分析和動(dòng)態(tài)分析2 種思路來進(jìn)行惡意軟件檢測(cè)與防護(hù)。靜態(tài)分析方法主要利用靜態(tài)代碼分析的手段來檢查應(yīng)用程序是否包含異常的權(quán)限申請(qǐng)和信息流[13],具有較好的可擴(kuò)展性,可以從較大數(shù)量級(jí)的應(yīng)用程序中快速篩選出可疑的應(yīng)用程序。作為一個(gè)面向普通消費(fèi)者的商業(yè)級(jí)操作系統(tǒng),Android系統(tǒng)需要面對(duì)各種應(yīng)用場(chǎng)景,因此必須使用事件驅(qū)動(dòng)的設(shè)計(jì)思路,具體來說就是廣泛利用生命周期鉤子和GUI(graphical user interface)回調(diào)處理來處理用戶的實(shí)時(shí)請(qǐng)求。運(yùn)行時(shí)的權(quán)限申請(qǐng)控制和數(shù)據(jù)流并非總可以通過靜態(tài)代碼分析檢測(cè)出來,因?yàn)閼?yīng)用程序的執(zhí)行流程取決于具體的運(yùn)行時(shí)環(huán)境和用戶行為[14]。另外,靜態(tài)分析方法檢測(cè)通過動(dòng)態(tài)代碼構(gòu)造的惡意行為,如通過Java 反射機(jī)制調(diào)用敏感應(yīng)用程序接口(API,application programming interface)的能力極其有限。惡意攻擊者通常能夠輕易攻擊這一缺陷構(gòu)造,采用代碼混淆[15]或代碼異變[16]的方法來誤導(dǎo)靜態(tài)檢查機(jī)制。Suarez 等[17]提出了以資源為中心的新的靜態(tài)分析方法以克服上述的限制,但是惡意程序仍然可以通過采用資源混淆的方法來規(guī)避以資源調(diào)用為中心的檢測(cè)系統(tǒng)[18]。
相比之下,動(dòng)態(tài)分析提供了檢測(cè)和防護(hù)惡意應(yīng)用程序的補(bǔ)充和完善方法。常用的動(dòng)態(tài)檢測(cè)方法包括基于行為的惡意軟件檢測(cè)[19]、基于系統(tǒng)API 調(diào)用追蹤的程序行為建模[20-21]以及基于資源利用的已用程序行為分析[22]。在動(dòng)態(tài)分析領(lǐng)域,機(jī)器學(xué)習(xí)技術(shù)越來越廣泛地應(yīng)用于區(qū)分惡意應(yīng)用和良性應(yīng)用。然而,當(dāng)惡意應(yīng)用對(duì)系統(tǒng)調(diào)用進(jìn)行代碼混淆時(shí),基于系統(tǒng)調(diào)用分析的動(dòng)態(tài)檢測(cè)系統(tǒng)仍然有可能被規(guī)避[23]。
綜上所述,無論是靜態(tài)檢測(cè)還是動(dòng)態(tài)檢測(cè)方法,都存在固有的弊端,并不適用于全部的Android應(yīng)用程序。這些方法主要著眼于分類并甄別出惡意應(yīng)用,而很少討論應(yīng)該如何對(duì)甄別出的惡意應(yīng)用的攻擊行為進(jìn)行防護(hù)。
此外,也有一些研究在字節(jié)碼級(jí)別上對(duì)需要提供安全性的方法單元添加安全功能。Lee 等[24]提出了一種使用應(yīng)用程序包裝技術(shù)的方案,在代碼的方法上添加必要的安全功能。該方案在字節(jié)碼級(jí)別添加了安全功能,而不依賴Android 的Java 或Kotlin源代碼。具體地,該方案將所需的安全功能封裝成字節(jié)碼級(jí)別的smali 代碼,并在需要安全性的方法點(diǎn)上將這些代碼注入應(yīng)用程序中。這種方法的缺點(diǎn)很明顯,它是在靜態(tài)策略的基礎(chǔ)上運(yùn)行的,這意味著每當(dāng)更改安全策略時(shí),都需要重新提取并注入安全代碼,并重新包裝應(yīng)用程序。
針對(duì)這些問題,本文提出了一種基于虛擬機(jī)字節(jié)碼的動(dòng)態(tài)安全策略控制方法,該方法能夠檢測(cè)Android 應(yīng)用程序中涉及危險(xiǎn)權(quán)限請(qǐng)求和敏感數(shù)據(jù)訪問的代碼單元,并將用戶指定的安全策略以虛擬機(jī)字節(jié)碼的形式注入相應(yīng)代碼位置,依照用戶的安全需求對(duì)應(yīng)用程序的危險(xiǎn)行為進(jìn)行防護(hù)和控制,并根據(jù)用戶所指定的安全策略的變更而動(dòng)態(tài)調(diào)整控制級(jí)別。
本文提出了一種控制Android 應(yīng)用程序?qū)τ脩裘舾行畔⒃L問和危險(xiǎn)權(quán)限調(diào)用的隱私保護(hù)系統(tǒng)(下文簡(jiǎn)稱為本系統(tǒng)),其基于安全策略生成的虛擬機(jī)字節(jié)碼注入技術(shù),通過在目標(biāo)應(yīng)用程序中注入控制機(jī)制以限制危險(xiǎn)權(quán)限的訪問并強(qiáng)制規(guī)范應(yīng)用程序的行為。本系統(tǒng)基于動(dòng)態(tài)安全策略生成機(jī)制,這意味著系統(tǒng)所應(yīng)用的安全策略可以根據(jù)用戶需求動(dòng)態(tài)調(diào)整,該機(jī)制通過將安全約束規(guī)范和具體代碼行為解耦合來實(shí)現(xiàn)動(dòng)態(tài)性和靈活性。動(dòng)態(tài)策略生成機(jī)制保證即使用戶或組織頻繁地修改安全策略,本系統(tǒng)也不需要重新編譯應(yīng)用程序或?qū)?yīng)用程序進(jìn)行重打包。
圖1 是本系統(tǒng)的結(jié)構(gòu)概覽。本系統(tǒng)能夠根據(jù)用戶和組織的需求,通過數(shù)學(xué)和形式邏輯的相關(guān)理論抽象出特定的行為模型。該行為模型將數(shù)據(jù)流、事件時(shí)間、用戶身份與角色因素列入考慮,并得到抽象的安全策略。同時(shí),本系統(tǒng)提供了一個(gè)安全策略生成器(SSG,security strategy generator)。SSG 能夠通過執(zhí)行一組細(xì)粒度的安全規(guī)則將用戶輸入的抽象策略轉(zhuǎn)換成具體的權(quán)限控制策略。實(shí)例化的安全策略將指導(dǎo)系統(tǒng)生成一個(gè)包含安全方法的字節(jié)碼安全運(yùn)行庫,其中包含了執(zhí)行安全策略的代碼。安全運(yùn)行庫被嵌入應(yīng)用程序字節(jié)碼級(jí)的危險(xiǎn)權(quán)限請(qǐng)求和敏感API 調(diào)用位置,并與原始應(yīng)用字節(jié)碼一起被重新打包生成一個(gè)包含安全決策中心(SDC,security decision center)的應(yīng)用程序。應(yīng)用程序中嵌入了一系列的策略執(zhí)行器(PE,policy executor),這些PE 能夠在應(yīng)用觸發(fā)權(quán)限請(qǐng)求行為時(shí)向安全決策中心發(fā)出事件通知,并向安全決策中心索取安全策略指定的授權(quán)操作以執(zhí)行具體的策略。
圖1 本系統(tǒng)的結(jié)構(gòu)概覽
要實(shí)現(xiàn)能夠滿足細(xì)粒度控制需求的安全策略生成機(jī)制,首先需要對(duì)用戶的行為模型進(jìn)行抽象。行為模型抽象的目的是梳理用戶實(shí)體和應(yīng)用程序?qū)嶓w間的交互方式,并將實(shí)體間的詳細(xì)交互流程進(jìn)行抽象以便于工程實(shí)現(xiàn)。本文所提的行為模型能夠提供數(shù)據(jù)機(jī)密性、用戶的感知與控制、訪問權(quán)限控制和信任管理等多層次的安全功能。為了實(shí)現(xiàn)上述需求,行為模型需要對(duì)數(shù)據(jù)流、事件時(shí)間、用戶身份與角色、環(huán)境與場(chǎng)景、信任關(guān)系等因素進(jìn)行邏輯學(xué)抽象。
安全策略生成機(jī)制使用事件?條件?動(dòng)作(ECA,event-condition-action)規(guī)則來提取抽象策略和詳細(xì)執(zhí)行策略。ECA 模板的抽象語法如算法1 所示。SSG持續(xù)監(jiān)視從模板實(shí)例化的ECA,PE 表示特定組合的所有條件,Ci∈PE 表示特定模式的事件使特定組合的所有條件得到滿足,此時(shí)執(zhí)行相應(yīng)的授權(quán)操作。
算法1事件條件操作規(guī)則
輸入事件模式集合E,用戶指定的條件C,用戶指定的時(shí)延D,信任類型T,應(yīng)用程序控制單元個(gè)數(shù)n,規(guī)則模板R
上述活動(dòng)模式是指與臨時(shí)或規(guī)律的行為或交互相匹配的模式,指定這種模式能夠支持檢測(cè)性和預(yù)防性的安全策略。上述條件可能對(duì)應(yīng)各種復(fù)雜的執(zhí)行流程和分支場(chǎng)景,如事件模式、外部行為、定時(shí)條件、執(zhí)行條件、上下文、用戶身份或角色、用戶和行為可行度等。上述權(quán)限操作的執(zhí)行具體是指對(duì)臨時(shí)操作的授權(quán)或拒絕,也可以更細(xì)粒度地根據(jù)安全需求有選擇地修改行為的屬性或延遲行為的執(zhí)行。規(guī)則模板甚至支持將行為進(jìn)行模塊化,這樣就能將不同的行為按照一定規(guī)則進(jìn)行組合、循環(huán)或分支判斷,以支持額外的活動(dòng)或動(dòng)態(tài)地更新模型的信任等級(jí),如提升或降低模型的信任度。例如,行為模塊化支持實(shí)現(xiàn)以下操作,在特定應(yīng)用程序觸發(fā)了某些指定的隱私敏感行為時(shí)通過SMS 或電子郵件通知用戶。
本文使用中間層的Dalvik 字節(jié)碼,而不使用反編譯源代碼,這是因?yàn)榻陙鞧oogle 官方鼓勵(lì)開發(fā)者使用Kotlin 語言進(jìn)行Android 開發(fā),但是不管是Kotlin 還是Java 編寫的應(yīng)用程序,在編譯階段都將統(tǒng)一編譯Android 系統(tǒng)專有的基于寄存器的Dalvik 字節(jié)碼。另外,成熟的Android 應(yīng)用程序開發(fā)者出于應(yīng)用安全角度和知識(shí)產(chǎn)權(quán)保護(hù)角度,通常會(huì)對(duì)應(yīng)用程序源代碼進(jìn)行代碼混淆、加固或代碼加殼等操作,這極大地增加了將二進(jìn)制代碼或字節(jié)碼還原到Java 或Kotlin 源代碼的難度。即使將二進(jìn)制文件或字節(jié)碼還原為原始代碼,其因代碼混淆帶來的極低可讀性也會(huì)使這樣的努力得不償失。
代碼1 展示了對(duì)Android 應(yīng)用程序進(jìn)行反編譯的一個(gè)實(shí)例,該實(shí)例將一個(gè)應(yīng)用程序的二進(jìn)制文件反編譯為Dalvik 字節(jié)碼的smali 表示。
代碼1
在代碼1 中,應(yīng)用程序試圖調(diào)用Telephony-Manager 類中的get DeviceId(String)方法。該方法能夠得到用戶設(shè)備的唯一標(biāo)識(shí)符,該標(biāo)識(shí)符通常被應(yīng)用程序用來對(duì)用戶進(jìn)行追蹤和識(shí)別,以對(duì)用戶行為進(jìn)行建?;蚍治鲇脩舻男袨槠谩?/p>
1) 安全策略的實(shí)例化
本系統(tǒng)會(huì)根據(jù)用戶或組織制定的安全策略向應(yīng)用程序植入特定的安全控制代碼。此外,為了實(shí)現(xiàn)動(dòng)態(tài)性,在代碼植入時(shí),除了用戶或組織指定的安全策略,本系統(tǒng)還會(huì)檢測(cè)應(yīng)用程序中尚未被用戶指定的敏感API 調(diào)用或危險(xiǎn)權(quán)限請(qǐng)求。這樣,在嵌入了安全策略的Android 應(yīng)用程序運(yùn)行時(shí),當(dāng)?shù)竭_(dá)敏感API 調(diào)用方法時(shí),安全決策中心將首先檢查用戶或組織是否已經(jīng)為該API 調(diào)用定義了安全策略。如果用戶針對(duì)該API 調(diào)用定義了安全策略,安全決策中心會(huì)通知策略執(zhí)行器執(zhí)行相應(yīng)的安全策略代碼;如果用戶未定義相關(guān)策略,安全決策中心會(huì)略過該API 調(diào)用并繼續(xù)檢測(cè)其他的API 調(diào)用。部分敏感的API 調(diào)用如表1 所示。
表1 部分敏感的API 調(diào)用
需要說明的是,未定義策略時(shí)嵌入的安全代碼并不會(huì)對(duì)應(yīng)用程序的性能造成過大的影響,應(yīng)用程序?qū)⒁詭缀蹩梢院雎缘臅r(shí)延繼續(xù)運(yùn)行?;谶@樣的設(shè)計(jì),本系統(tǒng)提出的字節(jié)碼嵌入技術(shù)能夠在用戶或組織想要更改安全策略時(shí)動(dòng)態(tài)地響應(yīng)用戶的需求,而不需要重新嵌入安全策略字節(jié)碼或?qū)?yīng)用程序進(jìn)行重打包,因?yàn)楸疚脑诔醮芜M(jìn)行代碼靜態(tài)分析和字節(jié)碼植入時(shí)已經(jīng)考慮了所有可能的安全控制需求。
注入應(yīng)用程序的安全代碼,更具體地說就是一系列的策略執(zhí)行器,將以代理模式被添加到應(yīng)用程序的相應(yīng)位置中。通過將策略執(zhí)行器以安全代理的形式封裝起來,本系統(tǒng)可以極大地減少對(duì)原始應(yīng)用程序代碼的侵入性,并為修改后的應(yīng)用程序提供更高的穩(wěn)健性和可用性。在靜態(tài)分析階段,本系統(tǒng)將通過分析應(yīng)用程序的Android Manifest.xml 文件和應(yīng)用程序的反編譯字節(jié)碼確定在該應(yīng)用程序中所涉及的所有敏感操作和權(quán)限申請(qǐng),并針對(duì)性地抽取相應(yīng)的策略執(zhí)行器組成用于注入程序的運(yùn)行庫。隨后,系統(tǒng)將在原始應(yīng)用程序的敏感操作和權(quán)限申請(qǐng)涉及的所有方法前后注入對(duì)執(zhí)行器的調(diào)用,這些調(diào)用將根據(jù)用戶或組織的聲明來決定是否調(diào)用相關(guān)的策略執(zhí)行器,并在相關(guān)權(quán)限操作之前或之后進(jìn)行相應(yīng)的安全操作。以設(shè)備定位信息的控制為例,Dalvik 字節(jié)碼展示了一個(gè)應(yīng)用程序獲取定位數(shù)據(jù)的方法單元,如代碼2 所示??梢钥吹剑_發(fā)者預(yù)先在類中聲明了一個(gè)android.location.Location Manage類實(shí)例Xl,用于向操作系統(tǒng)的定位管理器申請(qǐng)定位數(shù)據(jù);隨后,通過 Location Manager 類的getLast Known Location()方法獲取設(shè)備的最后位置。值得注意的是,該應(yīng)用程序在打包時(shí)使用了代碼混淆技術(shù),因此方法名A()和字段名Xl 都是無意義的字符串。
代碼2
上述私有方法封裝了定位數(shù)據(jù)的獲取方式,當(dāng)應(yīng)用程序在業(yè)務(wù)邏輯中需要請(qǐng)求設(shè)備定位時(shí)將會(huì)申請(qǐng)?jiān)L問該類的公有方法。Dalvik 字節(jié)碼()展示了該類的一個(gè)關(guān)鍵公有方法,如代碼3 所示。該方法通過調(diào)用上述私有方法向應(yīng)用程序的其他業(yè)務(wù)邏輯部分暴露了一個(gè)定位數(shù)據(jù)申請(qǐng)接口。代碼3 定義了一個(gè)名為 gn()的公有方法。該方法首先檢查了Android Manifest.xml 清單中是否聲明了ACCESS_FINE_LOCATION 權(quán)限,并確認(rèn)用戶已經(jīng)向應(yīng)用授予了該權(quán)限;隨后,調(diào)用上面定義的A(Ljava/lang/String;)方法以獲取設(shè)備的定位數(shù)據(jù)。
代碼3
顯然,公有方法gn()Landroid/location/Location訪問定位數(shù)據(jù)的關(guān)鍵接口。為了對(duì)該應(yīng)用程序的定位數(shù)據(jù)訪問行為進(jìn)行控制,需要在gn()方法中注入安全策略控制代碼。為了保證用戶能夠根據(jù)具體需求對(duì)應(yīng)用行為進(jìn)行不同程度的限制,本文注入的安全策略代碼不會(huì)將控制邏輯固化到gn()方法單元中,而是通過Java 反射策略調(diào)用安全決策中心來實(shí)現(xiàn)動(dòng)態(tài)控制。需要注意的是,對(duì)gn()方法的修改將影響虛擬機(jī)寄存器的分配。
圖2 展示了在Android 應(yīng)用程序的敏感操作前后注入安全策略執(zhí)行代碼的流程。當(dāng)應(yīng)用程序執(zhí)行到該敏感操作時(shí),策略執(zhí)行器會(huì)向安全決策中心請(qǐng)求安全策略。若安全策略中包含了對(duì)該敏感操作的限制規(guī)則,安全決策中心指示策略執(zhí)行器進(jìn)行相應(yīng)的權(quán)限控制和安全操作。例如,若安全策略對(duì)該敏感操作涉及的危險(xiǎn)權(quán)限做出了禁止聲明,策略執(zhí)行器就會(huì)直接忽略對(duì)該方法的調(diào)用;類似地,若安全策略指示對(duì)該敏感操作進(jìn)行延遲或條件修改,策略執(zhí)行器也會(huì)執(zhí)行相應(yīng)的安全操作。上述操作都是指在敏感操作之前進(jìn)行的安全代理,對(duì)于在敏感操作之后進(jìn)行的安全代理,只能對(duì)操作進(jìn)行修改或延遲,因?yàn)槊舾胁僮饕呀?jīng)執(zhí)行,無法對(duì)其進(jìn)行禁止。
圖2 在敏感操作前后注入安全策略執(zhí)行代碼流程
將安全策略注入Android 應(yīng)用程序后,安全決策中心將在應(yīng)用程序的主活動(dòng)中的onCreate()方法中初始化。在有些情況下,會(huì)因?yàn)樵O(shè)備、版本或其他原因而導(dǎo)致安全決策中心初始化失敗而導(dǎo)致安全策略處于不可用的狀態(tài),這時(shí)被安全強(qiáng)化的應(yīng)用程序?qū)⒃儐栍脩羰欠裰卦嚦跏蓟踩珱Q策中心,若用戶拒絕重試并試圖在此情況下繼續(xù)運(yùn)行應(yīng)用程序,應(yīng)用程序執(zhí)行到敏感操作或危險(xiǎn)權(quán)限調(diào)用時(shí)會(huì)對(duì)用戶提出安全警告。此外,在應(yīng)用程序執(zhí)行期間,軟件資源、硬件問題或功耗等原因都可能導(dǎo)致安全策略中心變?yōu)椴豢捎脿顟B(tài),為了保證安全性和穩(wěn)健性,應(yīng)用程序?qū)⒃趫?zhí)行到安全敏感操作或權(quán)限申請(qǐng)時(shí)提示用戶,讓用戶自行決定是否繼續(xù)執(zhí)行相關(guān)操作,并為應(yīng)用程序接下來可能遭遇的安全決策征求用戶的默認(rèn)許可或拒絕。用戶所進(jìn)行的決策可以作為后續(xù)相關(guān)操作出現(xiàn)時(shí)的默認(rèn)操作,系統(tǒng)將會(huì)緩存用戶所給出的決策,并在下次出現(xiàn)類似決策時(shí)提供參考,以實(shí)現(xiàn)對(duì)于同一安全決策的一致性。
2) 安全策略的動(dòng)態(tài)調(diào)整
注入了安全策略的 Android 應(yīng)用程序已經(jīng)可以按照用戶指定的安全需求完成相應(yīng)的安全操作。但是隨著場(chǎng)景需求、信任關(guān)系、用戶身份與角色等因素發(fā)生變化,用戶對(duì)安全策略的要求也在隨時(shí)發(fā)生變化,需要對(duì)安全策略進(jìn)行動(dòng)態(tài)調(diào)整。如前文所述,以往的研究在這一階段束手無策,只能針對(duì)新的安全需求重新生成安全策略實(shí)例并將其重新注入應(yīng)用程序中,然后將新的應(yīng)用程序安裝至用戶的設(shè)備中。這種操作方式對(duì)安全策略的使用是災(zāi)難性的,考慮到個(gè)人或組織時(shí)常變動(dòng)的安全需求,這種反復(fù)地重新編譯與打包所帶來的時(shí)間成本和操作成本是無法容忍的。這也是之前的研究和設(shè)計(jì)難以投入使用的根本原因。本系統(tǒng)在初次進(jìn)行字節(jié)碼注入時(shí)就會(huì)通過靜態(tài)分析手段尋找應(yīng)用程序中的所有敏感數(shù)據(jù)訪問請(qǐng)求和危險(xiǎn)權(quán)限操作,并在所有相關(guān)的API 調(diào)用位置前后都嵌入策略執(zhí)行器。這就意味著只要安全決策中心給出特定的控制指令,所有敏感API 調(diào)用都能夠被本系統(tǒng)限制或直接屏蔽。這種動(dòng)態(tài)控制的實(shí)現(xiàn)直接依賴于Dalvik 虛擬機(jī)環(huán)境和Java 語言的反射特性。反射機(jī)制利用了虛擬機(jī)執(zhí)行語言的自省能力,能夠在程序運(yùn)行時(shí)以數(shù)據(jù)流的方式提供對(duì)代碼邏輯的控制。更具體地,基于Dalvik虛擬機(jī)的反射技術(shù)允許在程序運(yùn)行時(shí)動(dòng)態(tài)加載和使用類,并通過字符串形式的控制信息調(diào)整對(duì)方法、字段、類和接口的調(diào)用方式。反射技術(shù)可以將程序的以上邏輯單元變量化和參數(shù)化,使方法、類和接口可以作為參數(shù)傳輸。因此,只需預(yù)先定義所有可能的控制代碼,應(yīng)用程序在運(yùn)行時(shí)就可以根據(jù)安全策略選取匹配的方法或接口。
為了幫助用戶調(diào)整安全策略并向應(yīng)用程序推送調(diào)整后的安全策略,本系統(tǒng)在安全決策中心中添加了網(wǎng)絡(luò)通信模塊,該網(wǎng)絡(luò)通信模塊能夠以HTTP通信的形式向服務(wù)器請(qǐng)求安全策略,服務(wù)器也能夠以WebSocket 的方式向所有注入了安全策略的應(yīng)用程序推送新的安全策略,使所有程序都能夠保持和最新安全策略的同步,如圖3 所示。
圖3 安全決策中心與服務(wù)器通信
為了對(duì)本文所提Android 應(yīng)用程序隱私保護(hù)系統(tǒng)進(jìn)行測(cè)試和評(píng)估,本節(jié)從國(guó)內(nèi)各大應(yīng)用市場(chǎng)中隨機(jī)采集了一些應(yīng)用程序,并以此為載體對(duì)系統(tǒng)進(jìn)行了詳細(xì)的分析。評(píng)估主要考察的是注入安全策略后應(yīng)用程序的可用性和穩(wěn)健性,以及注入的安全策略對(duì)應(yīng)用程序所產(chǎn)生的性能方面的影響。
為了保證數(shù)據(jù)集的隨機(jī)性和普適性,本節(jié)選取了市場(chǎng)份額較高的4 家應(yīng)用市場(chǎng):騰訊應(yīng)用寶、360 手機(jī)助手、華為應(yīng)用市場(chǎng)、小米應(yīng)用商店。從這4 家應(yīng)用市場(chǎng)中采用隨機(jī)方式分別爬取了60 個(gè)應(yīng)用程序,將這些應(yīng)用程序中的重復(fù)項(xiàng)去除后得到了129 個(gè)應(yīng)用程序。需要強(qiáng)調(diào)的是,爬蟲在采集應(yīng)用程序時(shí)并未對(duì)應(yīng)用程序做任何限定或要求,而是采用完全隨機(jī)的方式進(jìn)行爬取。這也意味著實(shí)驗(yàn)中并沒有對(duì)應(yīng)用程序的類型、下載量、大小等性質(zhì)做出假設(shè),這是為了保證數(shù)據(jù)集的隨機(jī)性和普適性。
來自不同應(yīng)用市場(chǎng)的應(yīng)用程序數(shù)量如圖4 所示。需要說明的是,本文在去除重復(fù)應(yīng)用時(shí)以應(yīng)用商店的市場(chǎng)份額作為優(yōu)先級(jí),即以來自騰訊應(yīng)用寶中應(yīng)用程序集合為基礎(chǔ),并去除從其他3 家應(yīng)用市場(chǎng)中爬取的應(yīng)用程序集合中的重復(fù)項(xiàng)。然后,對(duì)360手機(jī)助手中獲取的應(yīng)用程序進(jìn)行類似操作,刪除剩余2 家應(yīng)用市場(chǎng)中相對(duì)應(yīng)的重復(fù)項(xiàng),依次類推。因此,圖4 中應(yīng)用市場(chǎng)所提供的應(yīng)用程序數(shù)量是依次減少的。數(shù)據(jù)源中應(yīng)用程序的類型分布如圖5 所示。從圖5 可以看到,本文采集的應(yīng)用程序中,游戲與娛樂類程序占比最高,為30.23%;網(wǎng)絡(luò)購物與金融、影視與音樂、生活方式類程序占比也較高,分別為16.28%、12.41%和10.85%。上述統(tǒng)計(jì)結(jié)果與日常生活中的直觀體驗(yàn)相符,說明本文采集的應(yīng)用程序集合基本符合日常生活中應(yīng)用程序的分布情況。
圖4 各應(yīng)用市場(chǎng)對(duì)數(shù)據(jù)源的貢獻(xiàn)
圖5 數(shù)據(jù)源中應(yīng)用程序的類型分布
根據(jù)用戶和組織的不同需求,針對(duì)特定的應(yīng)用場(chǎng)景和安全需求生成相應(yīng)的安全策略,系統(tǒng)需要首先通過對(duì)用戶指定的Android 應(yīng)用程序進(jìn)行靜態(tài)分析,獲取該應(yīng)用程序涉及的所有敏感API 調(diào)用和危險(xiǎn)權(quán)限請(qǐng)求;然后將獲取到的信息轉(zhuǎn)化成策略點(diǎn),通過對(duì)策略點(diǎn)的操作,決定是否同意應(yīng)用程序的危險(xiǎn)請(qǐng)求以及更細(xì)粒度的API 調(diào)用。除了特定Android應(yīng)用程序所涉及的具體調(diào)用或權(quán)限申請(qǐng),本系統(tǒng)還要考慮用戶自身的環(huán)境與需求。例如,在一些保密工作場(chǎng)景和會(huì)議過程中,不允許應(yīng)用程序擁有隨時(shí)訪問麥克風(fēng)的權(quán)限;在家庭場(chǎng)景中面對(duì)可能的來電需求,則需要允許特定的應(yīng)用程序擁有訪問麥克風(fēng)的基本權(quán)限。
以應(yīng)用程序訪問設(shè)備定位信息為例,這一行為對(duì)應(yīng)著多種具有API 調(diào)用以及應(yīng)用程序要求在位置改變時(shí)執(zhí)行回調(diào),或者要求操作系統(tǒng)返回設(shè)備的最后位置,或者以一定時(shí)間間隔輪詢定位傳感器等。則對(duì)應(yīng)的安全策略可以描述為
其中,策略由是否獲取系統(tǒng)服務(wù)權(quán)限(GSS,get system service)、是否允許獲取位置更新權(quán)限(RLU,request location updates)、是否獲取最后的位置信息(GLKL,get last known location)組成;每個(gè)權(quán)限的回答存在以下3 種可能,Permit 表示一直允許,F(xiàn)orbid 表示一直禁止,DelaySetting 表示一定時(shí)間間隔刷新權(quán)限。不同權(quán)限的不同值構(gòu)成不同的安全策略。將抽象的安全策略進(jìn)行實(shí)例化,生成一個(gè)包含安全方法的字節(jié)碼安全運(yùn)行庫。針對(duì)具體的應(yīng)用程序,對(duì)其APK 安裝包進(jìn)行解包,獲取DEX 格式文件、Manifest 文件以及各種靜態(tài)資源,如圖像和顏色配置等。將實(shí)例化后的安全策略嵌入DEX 文件中,使用ApkTool 對(duì)應(yīng)用程序進(jìn)行沖編譯和打包。因?yàn)橹挥泻灻膽?yīng)用程序安裝包才能通過Android操作系統(tǒng)的檢測(cè)并成功安裝到用戶設(shè)備中,所以需要使用signAPK 對(duì)得到新的APK 文件進(jìn)行簽名。
穩(wěn)健性是指在對(duì)應(yīng)用程序進(jìn)行修改和重新打包后,應(yīng)用程序能否正常運(yùn)行。對(duì)于安全策略的穩(wěn)健性,本文從2 個(gè)維度進(jìn)行評(píng)價(jià):一個(gè)維度是本文系統(tǒng)執(zhí)行特定安全策略對(duì)應(yīng)用程序正常運(yùn)行的影響;另一個(gè)維度是對(duì)于不同的操作系統(tǒng)版本和不同的硬件平臺(tái),注入了安全策略的應(yīng)用程序能否正常工作。
圖6(a)展示了當(dāng)運(yùn)行環(huán)境限制在同一操作系統(tǒng)和同一硬件環(huán)境時(shí),本系統(tǒng)對(duì)Android 應(yīng)用程序穩(wěn)健性的影響。本實(shí)驗(yàn)使用搭載Android 10 系統(tǒng)的華為P30 Pro 手機(jī)對(duì)數(shù)據(jù)集合中的所有應(yīng)用程序進(jìn)行了測(cè)試。由圖6(a)的數(shù)據(jù)可以看出,在限制了軟硬件環(huán)境的情況下,85.27%的應(yīng)用程序基本能夠正常運(yùn)行,其中大部分應(yīng)用程序能夠保持長(zhǎng)時(shí)間的正常運(yùn)行,20.16%的應(yīng)用程序在執(zhí)行特定安全策略時(shí)偶有閃退情況發(fā)生;8.53% 的應(yīng)用程序發(fā)生了無法打開或者正常功能受到影響的情況;6.2%的應(yīng)用程序在嵌入安全策略字節(jié)碼后的重編譯過程中發(fā)生異常而導(dǎo)致無法重打包。
圖6 穩(wěn)健性測(cè)試結(jié)果
圖6(b)展示了不同軟硬件條件下安全策略對(duì)應(yīng)用程序穩(wěn)健性的影響。除了圖6(a)實(shí)驗(yàn)中所使用的搭載Android 10 系統(tǒng)的華為P30 Pro 手機(jī),本實(shí)驗(yàn)還使用了搭載Android 10 系統(tǒng)的小米MI 9 手機(jī)、搭載Android 9 的華為 Mate 20 手機(jī),以及搭載Android 9 系統(tǒng)的小米R(shí)edmi K20 Pro 手機(jī)。實(shí)驗(yàn)結(jié)果表明,本系統(tǒng)在不同的軟硬件環(huán)境下并未表現(xiàn)出太大的差別。這在一定程度上體現(xiàn)了本系統(tǒng)對(duì)應(yīng)用程序穩(wěn)健性的影響不大。
對(duì)于手機(jī)應(yīng)用程序來說,另一重要的評(píng)估是字節(jié)碼的注入對(duì)應(yīng)用程序性能的影響。在實(shí)驗(yàn)仿真中,性能考慮的是注入字節(jié)碼對(duì)應(yīng)用程序啟動(dòng)時(shí)間、大小(即所占內(nèi)存)以及功耗的影響。
圖7 反映了本系統(tǒng)注入的安全策略對(duì)Android應(yīng)用程序啟動(dòng)時(shí)間的影響。實(shí)驗(yàn)結(jié)果表明,盡管不同應(yīng)用程序的啟動(dòng)時(shí)間分布廣泛,但注入安全策略對(duì)啟動(dòng)時(shí)間的影響與應(yīng)用程序原始的啟動(dòng)時(shí)間并無明顯關(guān)聯(lián)。對(duì)于原始啟動(dòng)時(shí)間小于1 s 的應(yīng)用程序,安全策略對(duì)啟動(dòng)時(shí)間的平均影響約為0.411 s,實(shí)驗(yàn)數(shù)據(jù)的標(biāo)準(zhǔn)差為0.080 4 s;對(duì)于原始啟動(dòng)時(shí)間大于5 s 的大型應(yīng)用,安全策略的平均影響僅為0.635 s,標(biāo)準(zhǔn)差僅為0.069 9 s。盡管如此,需要特別注意的是,對(duì)于那些原始啟動(dòng)時(shí)間較短的應(yīng)用程序來說,注入安全策略所造成的用戶直觀影響更大。因?yàn)樵谶@種情況下安全策略帶來的開銷所占的比例更高,而這種對(duì)比會(huì)使用戶明顯感覺到程序變慢。事實(shí)上,注入的安全策略并非在程序啟動(dòng)同時(shí)被立即調(diào)用,而是在程序執(zhí)行到特定位置或進(jìn)行敏感操作時(shí)才會(huì)被調(diào)用。因此,理論上程序啟動(dòng)時(shí)會(huì)對(duì)啟動(dòng)時(shí)間產(chǎn)生額外開銷的只是安全決策中心的初始化過程,而這個(gè)過程本身對(duì)程序資源的消耗相對(duì)程序自身的初始化過程所產(chǎn)生的開銷要小得多。實(shí)驗(yàn)的結(jié)果符合理論分析。
圖7 安全策略對(duì)應(yīng)用啟動(dòng)時(shí)間的影響
圖8 展示了注入了安全策略前后應(yīng)用程序大小的變化。從實(shí)驗(yàn)結(jié)果可以很直觀地看到,注入安全策略對(duì)應(yīng)用程序的大小帶來的影響相比于應(yīng)用程序原始大小幾乎可以忽略不計(jì)。對(duì)于原始體積小于10 MB 的應(yīng)用程序,注入安全策略所帶來的平均體積影響僅為246.13 KB;對(duì)于原始體積大于200 MB的大型應(yīng)用,注入安全策略所帶來的平均體積影響也僅為1 296.95 KB。但是需要說明的是,安全策略對(duì)應(yīng)用程序大小的影響和應(yīng)用程序原始大小呈現(xiàn)出明顯的正相關(guān)。
圖8 安全策略對(duì)應(yīng)用大小的影響
從圖8 可以看到,盡管不同應(yīng)用程序本身的大小分布廣泛,但是安全策略注入所帶來的空間開銷占重打包后應(yīng)用程序總大小的比例始終保持在一定范圍內(nèi)。換言之,隨著應(yīng)用程序規(guī)模的增大,注入的安全策略字節(jié)碼規(guī)模也增多了。從理論上分析,注入的字節(jié)碼可分為2 個(gè)部分,即安全決策中心和各個(gè)策略執(zhí)行代理。安全決策中心的大小一般是相對(duì)固定的,策略執(zhí)行代理與具體的應(yīng)用程序有關(guān)。更具體地,當(dāng)應(yīng)用程序中涉及更多的敏感操作和權(quán)限調(diào)用時(shí),所需的策略執(zhí)行器就相對(duì)更多。因此,與其說安全策略帶來的空間開銷和應(yīng)用程序原始體積有關(guān),不如說是和應(yīng)用程序中包含的敏感操作和權(quán)限調(diào)用數(shù)量有關(guān)。
對(duì)于安全策略對(duì)應(yīng)用程序功耗的影響,本文以數(shù)據(jù)源中2 個(gè)常用應(yīng)用程序?yàn)榛A(chǔ)進(jìn)行了詳細(xì)測(cè)試。用一臺(tái)搭載Android 10 系統(tǒng)的華為P30 Pro 手機(jī)進(jìn)行相關(guān)操作。在每次測(cè)試開始之前,將手機(jī)充電至80%,隨后要求受試者使用手機(jī)打開注入了安全策略的特定應(yīng)用程序,并依照程序的正常功能連續(xù)使用60 min。在使用的第5 min、第10 min、第20 min、第30 min、第45 min 和第60 min 分別記錄此時(shí)手機(jī)的剩余電量,并依照記錄數(shù)據(jù)繪制功耗曲線。為了和原始情況進(jìn)行對(duì)比,對(duì)于每個(gè)應(yīng)用程序,受試者按照上述流程使用未經(jīng)安全策略注入的原始程序,在使用應(yīng)用程序過程中分別同時(shí)運(yùn)行市場(chǎng)上現(xiàn)有的安全類App(Bitdefender 和Avria)進(jìn)行用電量損耗對(duì)比,2 個(gè)應(yīng)用程序都能夠提供權(quán)限的監(jiān)控。每個(gè)應(yīng)用程序在不同的條件下重復(fù)實(shí)驗(yàn)4 次。圖9 揭示了這2 組實(shí)驗(yàn)的實(shí)驗(yàn)結(jié)果。從實(shí)驗(yàn)數(shù)據(jù)可以看出,本系統(tǒng)所注入的安全策略對(duì)應(yīng)用程序所產(chǎn)生的功耗影響較小,在長(zhǎng)達(dá)60 min 的使用過程中最多給功耗造成2%的差距?,F(xiàn)有的市場(chǎng)上的安全類應(yīng)用程序的功耗有8%的差距,這從說明了本系統(tǒng)對(duì)應(yīng)用程序的性能并不會(huì)產(chǎn)生用戶可感知級(jí)別的影響。需要說明的是,由于實(shí)驗(yàn)過程中沒有對(duì)更多的應(yīng)用程序進(jìn)行功耗測(cè)試,因此本部分所進(jìn)行的測(cè)試只能部分反映本系統(tǒng)對(duì)功耗的影響,更全面的分析仍然需要依賴對(duì)更多應(yīng)用程序進(jìn)行的測(cè)試。
圖9 不同方法對(duì)應(yīng)用功耗的影響
Android 系統(tǒng)提供了基于權(quán)限控制的安全機(jī)制,但是該機(jī)制的粗粒度控制方式不能滿足相當(dāng)一部分用戶或組織的安全需求,而且存在可以被惡意攻擊者利用的系統(tǒng)性漏洞。為了防止應(yīng)用程序?yàn)E用危險(xiǎn)權(quán)限和用戶敏感信息,本文設(shè)計(jì)并實(shí)現(xiàn)了基于字節(jié)碼注入的Android 應(yīng)用程序隱私防護(hù)系統(tǒng)。該系統(tǒng)的安全策略注入機(jī)制利用了基于虛擬字節(jié)碼的安全策略生成與注入技術(shù),該技術(shù)能夠在Android 應(yīng)用程序中植入對(duì)危險(xiǎn)權(quán)限和敏感API 調(diào)用的控制策略,并根據(jù)用戶或組織的需求進(jìn)行動(dòng)態(tài)的調(diào)整。在大多數(shù)情況,安全策略的注入不會(huì)對(duì)應(yīng)用程序的可用性造成影響,并在此基礎(chǔ)上可對(duì)85.33% 的敏感API 調(diào)用和危險(xiǎn)權(quán)限請(qǐng)求進(jìn)行有效限制。