張瑋偉
(疊拓信息技術(北京)有限公司南京分公司,江蘇 南京 211101)
近幾年,智能手機的普及不僅滿足了人們的溝通的需要,還可廣泛用于辦公、購物、學習等日常活動。Android 系統是主流的智能手機操作系統之一。Canaly 發布的報告[1]指出,2019 年Android 系統占有全球85.5%的市場份額。但是由于Android 系統的開放性和多樣性,隱私泄露的問題也越來越突出。Android 手機內通常存儲著一些有關用戶個人信息的隱私數據, 如短信、通訊錄、照片、地理位置等。如果這些信息被泄露, 可能會給用戶帶來嚴重的經濟損失和精神損失。360 互聯網安全中心發布的《2019 年手機安全狀況報告》[2]指出,2019 年全年新增惡意程序樣本約180.9 萬個,其中41.9%的新增惡意程序類型為隱私竊取。面對日益繁多的缺乏審查的應用程序,用戶難以察覺也無法阻止其對隱私數據的竊取。
Android 系統隱私安全的研究可以分為隱私檢測和隱私防護兩個方面。對于隱私檢測,可以分為靜態檢測和動態監測[3]。FlowDroid[4]提出一種針對安卓全生命周期的靜態污點分析方法,以apk 文件作為輸入,通過分析其反編譯后的文件,獲得調用圖CG (Call Graph) 和程序間控制流圖ICFG(Inter-procedural Control-Flow Graph)[5],再使用污點追蹤算法遍歷ICFG,生成數據流和流路徑[6]。FlowDroid 對于復雜的系統調用追蹤困難,不能檢測多線程引發的信息泄露。TaintDroid[7]是一個動態污點跟蹤和分析系統,能同時跟蹤多個敏感信息源。通過監控敏感數據的流動路徑并進行分析,得出有效的結果。該方案采用的動態污點追蹤實現機制在性能方面的消耗比較大。對于隱私防護,分為系統級和應用級。本文借助已有的Android 污點分析框架和Android 容器技術,通過分析應用程序的隱私泄露行為并對其進行控制,保護Android 手機用戶隱私數據。用戶可以獲得應用程序潛在的隱私泄露路徑,并對其進行配置,通過攔截和修改數據的方式,有效地保護用戶隱私數據安全。
本文設計一種動靜結合的Android 平臺的隱私數據保護方案,實現有效的Android 隱私數據保護軟件。軟件系統功能分為兩個部分:一部分是在服務端實現的靜態檢測實現方案,用于對輸入的apk 文件進行靜態分析并生成分析結果。另一部分是在客戶端的動態隱私保護功能,即在Android 客戶端應用級的動態隱私保護功能。通過是服務端提供的分析結果和用戶配置,實時攔截應用執行過程中的隱私行為,并對其數據進行控制。主要功能包括:
2.1.1 應用程序隱私分析。服務端通過分析應用程序代碼,得到隱私數據的泄露路徑信息。
2.1.2 隱私數據路徑信息分析轉換。客戶端將隱私數據的泄露路徑信息進行分析轉換,以便于進行攔截。
2.1.3 隱私攔截的配置和管理。用戶通過可視化界面,配置和管理隱私數據攔截措施。
2.1.4 隱私數據攔截。客戶端根據應用程序的隱私攔截配置,進行攔截或修改,達到隱私保護的目的。
系統的參與者包括用戶和管理員,用戶配置和管理隱私數據的攔截措施。管理員對應用程序隱私分析功能進行配置,包括分析依賴的數據配置和參數配置。用戶可以配置每個應用的啟用和關閉、配置每個應用的隱私攔截列表和運行該應用。由于其部分功能需要使用服務端程序,服務端向客戶端系統提供應用配置,因此,服務端系統作為外部參與者。管理員對服務端隱私分析功能進行配置,包括分析依賴的數據配置和參數配置。客戶端作為參與者,可以上傳應用程序和獲取應用程序的分析結果。
3.1 系統總體設計
根據需求分析結果,軟件總體框架如圖1 所示,分為服務端和客戶端兩個部分。客戶端提供動態隱私保護的功能,主要功能是對應用和系統交互的攔截和修改。客戶端包括攔截模塊和服務模塊,其中服務模塊又分為配置模塊和虛擬容器管理模塊。配置模塊負責客戶端配置的管理,提供配置給攔截模塊。虛擬容器管理模塊通過應用容器技術,以支持攔截模塊實現無需root 權限的方法攔截功能。對于每個容器中的第三方應用,都會被注入攔截模塊并應用其中的攔截邏輯,攔截模塊通過與服務模塊的通訊以獲得配置并生成攔截邏輯。

圖1 軟件總體框架
服務端用于靜態隱私檢測,其功能包括靜態分析、分析結果存儲和API 接口服務。服務端核心功能是靜態分析。由于FlowDroid 框架并不僅僅用于隱私檢測[4],其定義的污點數據并不全部符合本課題,需要對其配置文件進行修改,刪除無關的數據項。服務端功能模塊結構如圖2 所示,服務端分為靜態分析、分析結果存儲管理和API 接口服務三個模塊。其中以靜態分析模塊為核心,通過使用FlowDroid 對apk 文件生成分析結果。分析結果存儲管理模塊使用靜態分析模塊的輸出結果,進行存儲管理。過API 接口服務模塊從分析結果存儲管理模塊獲取分析結果,并下發配置給客戶端。API 接口服務模塊還負責客戶端配置請求的接收,并輸入靜態分析模塊。

圖2 服務端功能模塊結構圖
3.2 數據模型設計。系統中所涉及的數據實體主要包括用戶、應用程序、應用程序配置、數據泄露路徑和路徑攔截配置。用戶作為服務端識別客戶端的依據,關鍵的屬性包括識別編號、用戶名和用戶等級等。如圖3 實體關系圖所示,應用程序的關鍵屬性包括名稱、包名和安裝包文件。應用程序配置的關鍵屬性應用程序包名和啟用狀態。數據泄露路徑的關鍵屬性包括數據源、數據泄漏點和路徑編號。路徑攔截配置的關鍵屬性包括配置編號、偽數據泄漏點數據、偽數據源數

圖3 主要實體E-R 圖
3.3 服務端隱私分析功能設計。服務端主要分為靜態分析模塊、配置生成模塊和API 接口服務模塊。3.3.1 靜態分析模塊。如圖4 所示,在輸入apk 文件后,靜態分析模塊初始化配置并調用FlowDroid 進行分析,將得到的結果存儲至硬盤。3.3.2 配置生成模塊。FlowDroid 分析過程所依據的配置文件有AndroidCallbacks、EasyTaintWrapperSource 和SourcesAnd-Sinks。AndroidCallbacks 文件列出了Android Framework 提供的所有接口回調類。EasyTaintWrapperSource 文件列出了可能承載隱私數據的類,包括Java 集合類、Java 文件類和Android Intent 類等。SourcesAndSinks 文件作為AndroidCallbacks 和EasyTaintWrapperSource 文件的補充,定義了數據源和數據泄露點,例如位置信息數據源等。3.3.3 API 接口模塊。服務器的核心API 接口有兩個,分別為上傳apk 接口和獲取分析結果。其通過SpringBoot 的Controller 實現。主要涉及的是對HTTP 報文的處理,邏輯比較簡單。

圖4 靜態分析模塊時序圖
3.4 客戶端隱私保護功能設計。3.4.1 分析結果格式和轉換。由服務器獲得的分析結果為xml 格式,該格式文件由FlowDroid 生成。根節點為DataFlowResults,包含2 個子節點Results 和PerformanceData。PerformanceData 為分析時的性能數據,客戶端的實現不涉及這些數據,因此主要分析Results。Results 節點下有多個Result 節點,每個Result 節點對應一條由數據源Source 到數據泄露點Sink 的隱私泄露路徑,其中數據源Source 和數據泄露點Sink 是多對一的關系。數據源Source 和數據泄露點Sink 擁有同名的屬性Statement 和Method。Source 的Method 屬性表示該數據源對應的方法,數據由該方法的返回值流入路徑;Sink 的Method 屬性表示該數據泄露點對應的方法,數據由該方法的傳入參數流出路徑。為便于客戶端對服務端分析結果文件的使用和存儲,需要進行簡化和映射,通過類的設計,便于使用XStream 工具實現由xml 到類的互相轉換。3.4.2 配置管理。客戶端通過提供用戶界面供用戶進行配置管理,包括遠程獲取配置功能、配置增改查刪(CRUD)功能、配置存儲功能和其它應用程序配置讀取功能。為減少不必要的網絡帶寬流量消耗以及降低服務器壓力,客戶端優先通過計算文件特征碼的方式向服務器獲取可能存在的分析結果。若得到分析結果,則存入數據庫后,流程結束。若無結果,則上傳apk 文件,服務端分析后返回分析結果,客戶端得到分析結果并存入數據庫后,流程結束。為簡化用戶配置,需要簡化處理分析結果,從而減少用戶配置的難度。由數據源和數據泄露點的特征分析,數據源和數據泄露點一般都位于Android 框架層的API 代碼中。又由于數據泄露點類型眾多,單憑數據泄露點會存在許多誤攔截,而數據源一般都是從設備獲取的信息,如定位、聯系人等。因此,可對分析結果進行簡化,僅保留數據源信息,包括類名、方法名和返回類型,同時實現對返回數據的攔截。3.4.3 隱私數據攔截。本文使用Xposed[8]工具對Java 方法進行攔截。在某應用程序啟動后,其先讀取該應用程序配置文件,接著依據配置文件內容中的Source 配置,攔截對應的方法,根據空、初試值和自定義三種攔截模式和方法返回類型,生成返回數據,將其設為該方法的固定返回數據。具體流程包括:(1)讀取該應用程序配置文件。應用程序配置文件由客戶端進行管理,若使其它應用程序讀取配置文件,則需實現配置文件共享。在客戶端程序采用內容提供者(ContentProvider)的方式為其它應用提供配置查詢功能。其實現需在清單文件中聲明該Provider。(2)生成偽返回數據。由于返回類型可能為基本數據類型,也可能為某個類,因此需分別處理。Java 有8 個基本數據類型以及特殊的String類,對于基本數據類型,在攔截模式為“空”和“默認值”時,可都設定為默認值。而“自定義”模式則由用戶配置的數據(字符串格式)轉換而成。對于String 類,將字符串作為其值。對于其它類,則使用Java 反射的技術,通過該類的類名得到此類的Class 類實例clazz,再使用clazz.newInstance()方法得到初始化的類實例returnObj,此方式用于實現“默認值”模式。對于“空”模式,可直接將returnObj 設置為null;對于“自定義”模式,則要求用戶以Json 的方式配置,然后由Json 格式生成返回數據實例returnObj。3.4.4 免root 應用容器。根據現今的智能設備情況,root 權限不安全且難以獲取。因此本系統客戶端可采用VirtualXposed 容器以實現免root 使用,實現了對VirtualXposed 的基本控制,其主要利用VirtualXposed的廣播。
采用黑盒測試方法對系統主要功能進行測試。
4.1 服務端分析功能測試。4.1.1 apk 文件分析測試。測試數據:同上一步apk 文件上傳測試的測試數據。預期結果:在分析結果輸出目錄(在本次測試中為D:APSoutput)下生成分析結果文件(在本次測試中為5E7D6134D494CAC48A8A1E34BB 356577.xml)。測試結果:在分析結果輸出目錄下,存在分析結果文件。使用type 命令查看文件內容,其內容為xml格式。依據預期結果和測試結果,該測試通過。4.1.2 根據MD5 獲取結果測試。測試數據:第一個數據為LocationLeak.apk 文件的MD5 值。第二個數據為任意的MD5 值(F456F1BD9 A4D50FF96F60B0A43AD5AC0)。預期結果:對于第一個數據,Postman 收到與第3 項測試中相同的分析結果數據;對于第二個數據,Postman 收到404 錯誤。測試結果:對于第一個數據,Postman 收到了響應報文,該報文體包含了分析結果數據;對于第二個數據,Postman 收到404 響應錯誤。依據預期結果和測試結果,該測試通過。
4.2 客戶端攔截功能測試。4.2.1 分析結果文件的轉換。測試數據:安裝的LocationLeak.apk,此應用會向目標服務器發送位置信息。測試方法:安裝客戶端應用程序并打開,在界面中選擇LocationLeak 后跳轉至配置頁面,點擊右下角更新配置按鈕。預期結果:在當前界面顯示處理后的配置列表。測試結果:在該界面顯示了隱私泄露的數據源配置列表。依據預期結果和測試結果,該測試通過。4.2.2 攔截隱私數據并設置自定義測試。測試數據:安裝的LocationLeak.apk,此應用會向目標服務器發送位置信息。測試方法:啟用配置并配置第一項。選擇“自定義”選項后,在出現的文本框中輸入自定義數據12.345,點擊確定按鈕,啟動LocationLeak 應用,其只含位置信息獲取和泄露功能。預期結果:LocationLeak 的目標服務器收到了緯度(latitude) 為12.345 值的坐標數據。測試結果:根據LocationLeak 的目標服務器的日志,確認收到了緯度為12.345值的坐標數據。根據預期結果和測試結果,該測試通過。
本文通過分析應用行為,攔截關鍵函數的方式,為Android 系統隱私數據提供了有效保護。本文仍存在一些不足和需要優化的地方,例如沒有實現Android 容器功能,采用FlowDroid 進行污點數據分析比較耗時等。