張瑋偉
(疊拓信息技術(shù)(北京)有限公司南京分公司,江蘇 南京 211101)
近幾年,智能手機(jī)的普及不僅滿足了人們的溝通的需要,還可廣泛用于辦公、購物、學(xué)習(xí)等日?;顒?dòng)。Android 系統(tǒng)是主流的智能手機(jī)操作系統(tǒng)之一。Canaly 發(fā)布的報(bào)告[1]指出,2019 年Android 系統(tǒng)占有全球85.5%的市場(chǎng)份額。但是由于Android 系統(tǒng)的開放性和多樣性,隱私泄露的問題也越來越突出。Android 手機(jī)內(nèi)通常存儲(chǔ)著一些有關(guān)用戶個(gè)人信息的隱私數(shù)據(jù), 如短信、通訊錄、照片、地理位置等。如果這些信息被泄露, 可能會(huì)給用戶帶來嚴(yán)重的經(jīng)濟(jì)損失和精神損失。360 互聯(lián)網(wǎng)安全中心發(fā)布的《2019 年手機(jī)安全狀況報(bào)告》[2]指出,2019 年全年新增惡意程序樣本約180.9 萬個(gè),其中41.9%的新增惡意程序類型為隱私竊取。面對(duì)日益繁多的缺乏審查的應(yīng)用程序,用戶難以察覺也無法阻止其對(duì)隱私數(shù)據(jù)的竊取。
Android 系統(tǒng)隱私安全的研究可以分為隱私檢測(cè)和隱私防護(hù)兩個(gè)方面。對(duì)于隱私檢測(cè),可以分為靜態(tài)檢測(cè)和動(dòng)態(tài)監(jiān)測(cè)[3]。FlowDroid[4]提出一種針對(duì)安卓全生命周期的靜態(tài)污點(diǎn)分析方法,以apk 文件作為輸入,通過分析其反編譯后的文件,獲得調(diào)用圖CG (Call Graph) 和程序間控制流圖ICFG(Inter-procedural Control-Flow Graph)[5],再使用污點(diǎn)追蹤算法遍歷ICFG,生成數(shù)據(jù)流和流路徑[6]。FlowDroid 對(duì)于復(fù)雜的系統(tǒng)調(diào)用追蹤困難,不能檢測(cè)多線程引發(fā)的信息泄露。TaintDroid[7]是一個(gè)動(dòng)態(tài)污點(diǎn)跟蹤和分析系統(tǒng),能同時(shí)跟蹤多個(gè)敏感信息源。通過監(jiān)控敏感數(shù)據(jù)的流動(dòng)路徑并進(jìn)行分析,得出有效的結(jié)果。該方案采用的動(dòng)態(tài)污點(diǎn)追蹤實(shí)現(xiàn)機(jī)制在性能方面的消耗比較大。對(duì)于隱私防護(hù),分為系統(tǒng)級(jí)和應(yīng)用級(jí)。本文借助已有的Android 污點(diǎn)分析框架和Android 容器技術(shù),通過分析應(yīng)用程序的隱私泄露行為并對(duì)其進(jìn)行控制,保護(hù)Android 手機(jī)用戶隱私數(shù)據(jù)。用戶可以獲得應(yīng)用程序潛在的隱私泄露路徑,并對(duì)其進(jìn)行配置,通過攔截和修改數(shù)據(jù)的方式,有效地保護(hù)用戶隱私數(shù)據(jù)安全。
本文設(shè)計(jì)一種動(dòng)靜結(jié)合的Android 平臺(tái)的隱私數(shù)據(jù)保護(hù)方案,實(shí)現(xiàn)有效的Android 隱私數(shù)據(jù)保護(hù)軟件。軟件系統(tǒng)功能分為兩個(gè)部分:一部分是在服務(wù)端實(shí)現(xiàn)的靜態(tài)檢測(cè)實(shí)現(xiàn)方案,用于對(duì)輸入的apk 文件進(jìn)行靜態(tài)分析并生成分析結(jié)果。另一部分是在客戶端的動(dòng)態(tài)隱私保護(hù)功能,即在Android 客戶端應(yīng)用級(jí)的動(dòng)態(tài)隱私保護(hù)功能。通過是服務(wù)端提供的分析結(jié)果和用戶配置,實(shí)時(shí)攔截應(yīng)用執(zhí)行過程中的隱私行為,并對(duì)其數(shù)據(jù)進(jìn)行控制。主要功能包括:
2.1.1 應(yīng)用程序隱私分析。服務(wù)端通過分析應(yīng)用程序代碼,得到隱私數(shù)據(jù)的泄露路徑信息。
2.1.2 隱私數(shù)據(jù)路徑信息分析轉(zhuǎn)換??蛻舳藢㈦[私數(shù)據(jù)的泄露路徑信息進(jìn)行分析轉(zhuǎn)換,以便于進(jìn)行攔截。
2.1.3 隱私攔截的配置和管理。用戶通過可視化界面,配置和管理隱私數(shù)據(jù)攔截措施。
2.1.4 隱私數(shù)據(jù)攔截??蛻舳烁鶕?jù)應(yīng)用程序的隱私攔截配置,進(jìn)行攔截或修改,達(dá)到隱私保護(hù)的目的。
系統(tǒng)的參與者包括用戶和管理員,用戶配置和管理隱私數(shù)據(jù)的攔截措施。管理員對(duì)應(yīng)用程序隱私分析功能進(jìn)行配置,包括分析依賴的數(shù)據(jù)配置和參數(shù)配置。用戶可以配置每個(gè)應(yīng)用的啟用和關(guān)閉、配置每個(gè)應(yīng)用的隱私攔截列表和運(yùn)行該應(yīng)用。由于其部分功能需要使用服務(wù)端程序,服務(wù)端向客戶端系統(tǒng)提供應(yīng)用配置,因此,服務(wù)端系統(tǒng)作為外部參與者。管理員對(duì)服務(wù)端隱私分析功能進(jìn)行配置,包括分析依賴的數(shù)據(jù)配置和參數(shù)配置??蛻舳俗鳛閰⑴c者,可以上傳應(yīng)用程序和獲取應(yīng)用程序的分析結(jié)果。
3.1 系統(tǒng)總體設(shè)計(jì)
根據(jù)需求分析結(jié)果,軟件總體框架如圖1 所示,分為服務(wù)端和客戶端兩個(gè)部分。客戶端提供動(dòng)態(tài)隱私保護(hù)的功能,主要功能是對(duì)應(yīng)用和系統(tǒng)交互的攔截和修改??蛻舳税〝r截模塊和服務(wù)模塊,其中服務(wù)模塊又分為配置模塊和虛擬容器管理模塊。配置模塊負(fù)責(zé)客戶端配置的管理,提供配置給攔截模塊。虛擬容器管理模塊通過應(yīng)用容器技術(shù),以支持?jǐn)r截模塊實(shí)現(xiàn)無需root 權(quán)限的方法攔截功能。對(duì)于每個(gè)容器中的第三方應(yīng)用,都會(huì)被注入攔截模塊并應(yīng)用其中的攔截邏輯,攔截模塊通過與服務(wù)模塊的通訊以獲得配置并生成攔截邏輯。
圖1 軟件總體框架
服務(wù)端用于靜態(tài)隱私檢測(cè),其功能包括靜態(tài)分析、分析結(jié)果存儲(chǔ)和API 接口服務(wù)。服務(wù)端核心功能是靜態(tài)分析。由于FlowDroid 框架并不僅僅用于隱私檢測(cè)[4],其定義的污點(diǎn)數(shù)據(jù)并不全部符合本課題,需要對(duì)其配置文件進(jìn)行修改,刪除無關(guān)的數(shù)據(jù)項(xiàng)。服務(wù)端功能模塊結(jié)構(gòu)如圖2 所示,服務(wù)端分為靜態(tài)分析、分析結(jié)果存儲(chǔ)管理和API 接口服務(wù)三個(gè)模塊。其中以靜態(tài)分析模塊為核心,通過使用FlowDroid 對(duì)apk 文件生成分析結(jié)果。分析結(jié)果存儲(chǔ)管理模塊使用靜態(tài)分析模塊的輸出結(jié)果,進(jìn)行存儲(chǔ)管理。過API 接口服務(wù)模塊從分析結(jié)果存儲(chǔ)管理模塊獲取分析結(jié)果,并下發(fā)配置給客戶端。API 接口服務(wù)模塊還負(fù)責(zé)客戶端配置請(qǐng)求的接收,并輸入靜態(tài)分析模塊。
圖2 服務(wù)端功能模塊結(jié)構(gòu)圖
3.2 數(shù)據(jù)模型設(shè)計(jì)。系統(tǒng)中所涉及的數(shù)據(jù)實(shí)體主要包括用戶、應(yīng)用程序、應(yīng)用程序配置、數(shù)據(jù)泄露路徑和路徑攔截配置。用戶作為服務(wù)端識(shí)別客戶端的依據(jù),關(guān)鍵的屬性包括識(shí)別編號(hào)、用戶名和用戶等級(jí)等。如圖3 實(shí)體關(guān)系圖所示,應(yīng)用程序的關(guān)鍵屬性包括名稱、包名和安裝包文件。應(yīng)用程序配置的關(guān)鍵屬性應(yīng)用程序包名和啟用狀態(tài)。數(shù)據(jù)泄露路徑的關(guān)鍵屬性包括數(shù)據(jù)源、數(shù)據(jù)泄漏點(diǎn)和路徑編號(hào)。路徑攔截配置的關(guān)鍵屬性包括配置編號(hào)、偽數(shù)據(jù)泄漏點(diǎn)數(shù)據(jù)、偽數(shù)據(jù)源數(shù)
圖3 主要實(shí)體E-R 圖
3.3 服務(wù)端隱私分析功能設(shè)計(jì)。服務(wù)端主要分為靜態(tài)分析模塊、配置生成模塊和API 接口服務(wù)模塊。3.3.1 靜態(tài)分析模塊。如圖4 所示,在輸入apk 文件后,靜態(tài)分析模塊初始化配置并調(diào)用FlowDroid 進(jìn)行分析,將得到的結(jié)果存儲(chǔ)至硬盤。3.3.2 配置生成模塊。FlowDroid 分析過程所依據(jù)的配置文件有AndroidCallbacks、EasyTaintWrapperSource 和SourcesAnd-Sinks。AndroidCallbacks 文件列出了Android Framework 提供的所有接口回調(diào)類。EasyTaintWrapperSource 文件列出了可能承載隱私數(shù)據(jù)的類,包括Java 集合類、Java 文件類和Android Intent 類等。SourcesAndSinks 文件作為AndroidCallbacks 和EasyTaintWrapperSource 文件的補(bǔ)充,定義了數(shù)據(jù)源和數(shù)據(jù)泄露點(diǎn),例如位置信息數(shù)據(jù)源等。3.3.3 API 接口模塊。服務(wù)器的核心API 接口有兩個(gè),分別為上傳apk 接口和獲取分析結(jié)果。其通過SpringBoot 的Controller 實(shí)現(xiàn)。主要涉及的是對(duì)HTTP 報(bào)文的處理,邏輯比較簡(jiǎn)單。
圖4 靜態(tài)分析模塊時(shí)序圖
3.4 客戶端隱私保護(hù)功能設(shè)計(jì)。3.4.1 分析結(jié)果格式和轉(zhuǎn)換。由服務(wù)器獲得的分析結(jié)果為xml 格式,該格式文件由FlowDroid 生成。根節(jié)點(diǎn)為DataFlowResults,包含2 個(gè)子節(jié)點(diǎn)Results 和PerformanceData。PerformanceData 為分析時(shí)的性能數(shù)據(jù),客戶端的實(shí)現(xiàn)不涉及這些數(shù)據(jù),因此主要分析Results。Results 節(jié)點(diǎn)下有多個(gè)Result 節(jié)點(diǎn),每個(gè)Result 節(jié)點(diǎn)對(duì)應(yīng)一條由數(shù)據(jù)源Source 到數(shù)據(jù)泄露點(diǎn)Sink 的隱私泄露路徑,其中數(shù)據(jù)源Source 和數(shù)據(jù)泄露點(diǎn)Sink 是多對(duì)一的關(guān)系。數(shù)據(jù)源Source 和數(shù)據(jù)泄露點(diǎn)Sink 擁有同名的屬性Statement 和Method。Source 的Method 屬性表示該數(shù)據(jù)源對(duì)應(yīng)的方法,數(shù)據(jù)由該方法的返回值流入路徑;Sink 的Method 屬性表示該數(shù)據(jù)泄露點(diǎn)對(duì)應(yīng)的方法,數(shù)據(jù)由該方法的傳入?yún)?shù)流出路徑。為便于客戶端對(duì)服務(wù)端分析結(jié)果文件的使用和存儲(chǔ),需要進(jìn)行簡(jiǎn)化和映射,通過類的設(shè)計(jì),便于使用XStream 工具實(shí)現(xiàn)由xml 到類的互相轉(zhuǎn)換。3.4.2 配置管理。客戶端通過提供用戶界面供用戶進(jìn)行配置管理,包括遠(yuǎn)程獲取配置功能、配置增改查刪(CRUD)功能、配置存儲(chǔ)功能和其它應(yīng)用程序配置讀取功能。為減少不必要的網(wǎng)絡(luò)帶寬流量消耗以及降低服務(wù)器壓力,客戶端優(yōu)先通過計(jì)算文件特征碼的方式向服務(wù)器獲取可能存在的分析結(jié)果。若得到分析結(jié)果,則存入數(shù)據(jù)庫后,流程結(jié)束。若無結(jié)果,則上傳apk 文件,服務(wù)端分析后返回分析結(jié)果,客戶端得到分析結(jié)果并存入數(shù)據(jù)庫后,流程結(jié)束。為簡(jiǎn)化用戶配置,需要簡(jiǎn)化處理分析結(jié)果,從而減少用戶配置的難度。由數(shù)據(jù)源和數(shù)據(jù)泄露點(diǎn)的特征分析,數(shù)據(jù)源和數(shù)據(jù)泄露點(diǎn)一般都位于Android 框架層的API 代碼中。又由于數(shù)據(jù)泄露點(diǎn)類型眾多,單憑數(shù)據(jù)泄露點(diǎn)會(huì)存在許多誤攔截,而數(shù)據(jù)源一般都是從設(shè)備獲取的信息,如定位、聯(lián)系人等。因此,可對(duì)分析結(jié)果進(jìn)行簡(jiǎn)化,僅保留數(shù)據(jù)源信息,包括類名、方法名和返回類型,同時(shí)實(shí)現(xiàn)對(duì)返回?cái)?shù)據(jù)的攔截。3.4.3 隱私數(shù)據(jù)攔截。本文使用Xposed[8]工具對(duì)Java 方法進(jìn)行攔截。在某應(yīng)用程序啟動(dòng)后,其先讀取該應(yīng)用程序配置文件,接著依據(jù)配置文件內(nèi)容中的Source 配置,攔截對(duì)應(yīng)的方法,根據(jù)空、初試值和自定義三種攔截模式和方法返回類型,生成返回?cái)?shù)據(jù),將其設(shè)為該方法的固定返回?cái)?shù)據(jù)。具體流程包括:(1)讀取該應(yīng)用程序配置文件。應(yīng)用程序配置文件由客戶端進(jìn)行管理,若使其它應(yīng)用程序讀取配置文件,則需實(shí)現(xiàn)配置文件共享。在客戶端程序采用內(nèi)容提供者(ContentProvider)的方式為其它應(yīng)用提供配置查詢功能。其實(shí)現(xiàn)需在清單文件中聲明該P(yáng)rovider。(2)生成偽返回?cái)?shù)據(jù)。由于返回類型可能為基本數(shù)據(jù)類型,也可能為某個(gè)類,因此需分別處理。Java 有8 個(gè)基本數(shù)據(jù)類型以及特殊的String類,對(duì)于基本數(shù)據(jù)類型,在攔截模式為“空”和“默認(rèn)值”時(shí),可都設(shè)定為默認(rèn)值。而“自定義”模式則由用戶配置的數(shù)據(jù)(字符串格式)轉(zhuǎn)換而成。對(duì)于String 類,將字符串作為其值。對(duì)于其它類,則使用Java 反射的技術(shù),通過該類的類名得到此類的Class 類實(shí)例clazz,再使用clazz.newInstance()方法得到初始化的類實(shí)例returnObj,此方式用于實(shí)現(xiàn)“默認(rèn)值”模式。對(duì)于“空”模式,可直接將returnObj 設(shè)置為null;對(duì)于“自定義”模式,則要求用戶以Json 的方式配置,然后由Json 格式生成返回?cái)?shù)據(jù)實(shí)例returnObj。3.4.4 免root 應(yīng)用容器。根據(jù)現(xiàn)今的智能設(shè)備情況,root 權(quán)限不安全且難以獲取。因此本系統(tǒng)客戶端可采用VirtualXposed 容器以實(shí)現(xiàn)免root 使用,實(shí)現(xiàn)了對(duì)VirtualXposed 的基本控制,其主要利用VirtualXposed的廣播。
采用黑盒測(cè)試方法對(duì)系統(tǒng)主要功能進(jìn)行測(cè)試。
4.1 服務(wù)端分析功能測(cè)試。4.1.1 apk 文件分析測(cè)試。測(cè)試數(shù)據(jù):同上一步apk 文件上傳測(cè)試的測(cè)試數(shù)據(jù)。預(yù)期結(jié)果:在分析結(jié)果輸出目錄(在本次測(cè)試中為D:APSoutput)下生成分析結(jié)果文件(在本次測(cè)試中為5E7D6134D494CAC48A8A1E34BB 356577.xml)。測(cè)試結(jié)果:在分析結(jié)果輸出目錄下,存在分析結(jié)果文件。使用type 命令查看文件內(nèi)容,其內(nèi)容為xml格式。依據(jù)預(yù)期結(jié)果和測(cè)試結(jié)果,該測(cè)試通過。4.1.2 根據(jù)MD5 獲取結(jié)果測(cè)試。測(cè)試數(shù)據(jù):第一個(gè)數(shù)據(jù)為L(zhǎng)ocationLeak.apk 文件的MD5 值。第二個(gè)數(shù)據(jù)為任意的MD5 值(F456F1BD9 A4D50FF96F60B0A43AD5AC0)。預(yù)期結(jié)果:對(duì)于第一個(gè)數(shù)據(jù),Postman 收到與第3 項(xiàng)測(cè)試中相同的分析結(jié)果數(shù)據(jù);對(duì)于第二個(gè)數(shù)據(jù),Postman 收到404 錯(cuò)誤。測(cè)試結(jié)果:對(duì)于第一個(gè)數(shù)據(jù),Postman 收到了響應(yīng)報(bào)文,該報(bào)文體包含了分析結(jié)果數(shù)據(jù);對(duì)于第二個(gè)數(shù)據(jù),Postman 收到404 響應(yīng)錯(cuò)誤。依據(jù)預(yù)期結(jié)果和測(cè)試結(jié)果,該測(cè)試通過。
4.2 客戶端攔截功能測(cè)試。4.2.1 分析結(jié)果文件的轉(zhuǎn)換。測(cè)試數(shù)據(jù):安裝的LocationLeak.apk,此應(yīng)用會(huì)向目標(biāo)服務(wù)器發(fā)送位置信息。測(cè)試方法:安裝客戶端應(yīng)用程序并打開,在界面中選擇LocationLeak 后跳轉(zhuǎn)至配置頁面,點(diǎn)擊右下角更新配置按鈕。預(yù)期結(jié)果:在當(dāng)前界面顯示處理后的配置列表。測(cè)試結(jié)果:在該界面顯示了隱私泄露的數(shù)據(jù)源配置列表。依據(jù)預(yù)期結(jié)果和測(cè)試結(jié)果,該測(cè)試通過。4.2.2 攔截隱私數(shù)據(jù)并設(shè)置自定義測(cè)試。測(cè)試數(shù)據(jù):安裝的LocationLeak.apk,此應(yīng)用會(huì)向目標(biāo)服務(wù)器發(fā)送位置信息。測(cè)試方法:啟用配置并配置第一項(xiàng)。選擇“自定義”選項(xiàng)后,在出現(xiàn)的文本框中輸入自定義數(shù)據(jù)12.345,點(diǎn)擊確定按鈕,啟動(dòng)LocationLeak 應(yīng)用,其只含位置信息獲取和泄露功能。預(yù)期結(jié)果:LocationLeak 的目標(biāo)服務(wù)器收到了緯度(latitude) 為12.345 值的坐標(biāo)數(shù)據(jù)。測(cè)試結(jié)果:根據(jù)LocationLeak 的目標(biāo)服務(wù)器的日志,確認(rèn)收到了緯度為12.345值的坐標(biāo)數(shù)據(jù)。根據(jù)預(yù)期結(jié)果和測(cè)試結(jié)果,該測(cè)試通過。
本文通過分析應(yīng)用行為,攔截關(guān)鍵函數(shù)的方式,為Android 系統(tǒng)隱私數(shù)據(jù)提供了有效保護(hù)。本文仍存在一些不足和需要優(yōu)化的地方,例如沒有實(shí)現(xiàn)Android 容器功能,采用FlowDroid 進(jìn)行污點(diǎn)數(shù)據(jù)分析比較耗時(shí)等。