◆吳中超 許國祥 王 瑜
(信息工程大學 河南 450001)
安卓應用中的信息泄露問題探究
◆吳中超 許國祥 王 瑜
(信息工程大學 河南 450001)
作為當今世界最流行的新興移動操作系統,安卓系統的應用安全重要性日益提高。安卓應用通信架構由服務器、客戶端兩部分構成,均存在敏感信息泄露的安全隱患。本文從這兩方面入手,分析安卓應用生態目前出現較多的信息泄露問題及導致危害,并分別探討了針對主要漏洞類型的應對手段。
安卓系統;移動互聯網;應用安全;信息泄露
移動操作系統的生態鏈正從智能手機拓展到諸如平板電腦、智能家居、可穿戴智能設備、車聯網、嵌入式系統等多種衍生產品中,日益驅動著互聯網技術的改變和發展。作為移動互聯網時代的突出標志之一,移動應用 APP聚集了大量的高附加值信息和資源。這些信息和資源不僅包含個人手機信息、身份信息、經緯度地理位置等,還包含了多個應用或網站的賬號密碼信息、個人電子郵件、隱私文件等諸多信息。
在過去的2016年中,國內個人信息泄露事件頻發。中國互聯網協會2016年發布的《中國網民權益保護調查報告》中指出,在整個2016年,中國網民因個人信息泄露、垃圾信息、詐騙信息等現象導致總體損失約915億元。其中,78.2%的網民個人身份信息被泄露過,包括網民的姓名、學歷、家庭住址、身份證號及工作單位等;63.4%的網民個人網上活動信息被泄露過,包括通話記錄、網購記錄、網站瀏覽痕跡、IP地址、軟件使用痕跡及地理位置等。在個人信息泄露帶來的不良影響上,82.3%的網民親身感受到了個人信息泄露對日常生活造成的影響。近年爆發的多個安卓系統漏洞,其影響力動輒覆蓋過億安卓手機用戶,造成大量用戶隱私泄露風險。
面對移動互聯網用戶隱私保護的嚴峻形勢,隱私泄露的檢測和保護近年來頗受關注。本文結合本人在清華大學網絡與信息安全實驗室參與的安卓APP滲透測試項目、全國高校校園網 APP測試項目及正在進行的研究工作,揭示了移動應用隱私泄露檢測和防護的總體進展,并針對影響范圍較廣的典型問題給出針對性修復方案。
Android應用程序運行中必然涉及數據的輸入、輸出。例如應用程序各個參數設置、程序運行中的狀態等數據都需要保存到外部存儲器上,否則系統關機之后數據將會丟失。
若應用程序中需要保存的數據較少,且數據格式簡單(字符串、整型值等),可使用 SharedPreferences進行保存。若應用程序有大量數據需要存儲、訪問,就需要用到數據庫。如果SharedPreferences創建時模式設為可讀可寫,則文件中內容極易被其他應用獲取。如果文件中內容為明文或明文編碼(base64等),則會造成敏感信息泄露。
例如,在某app中,應用會將使用過的用戶信息(包括用戶資料、id等)以明文的形式存儲在SharedPreferences文件中(如圖1所示),內容可直接被獲取。
改進方式:避免使用 MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE模式創建Shared Preferences文件;避免把密碼等敏感數據信息明文存放在 Shared Preferences文件中。

圖1 SharedPreferences文件內容
在安卓系統中,content Provider用來提供數據的統一訪問方式。如果某個應用中有數據需要提供給其他應用訪問,無論數據存儲在數據庫中,還是在文件甚至在網絡中,都可以通過content provider提供的接口來訪問。
如果在 AndroidManifest文件中將某個 Content Provider的exported屬性設置為true,則可在外界任意位置直接訪問其數據。如果此 Content Provider的實現有問題,則可能產生任意數據訪問、SQL注入、目錄遍歷等風險。
例如,在某校園網圖書館app中,利用drozer查詢應用中的provider信息,可發現該應用中有兩個content provider組件,繼續查詢其中設計的 provider uri;逐個進行查詢嘗試,發現其中存儲密碼值的uri可不需權限,直接查詢得到結果,如圖2所示。

圖2 用戶名、登錄密碼、郵箱等敏感信息
改進措施:對于需要開放的組件應設置合理的權限,如果只需要對同一個簽名的其它開放 content provider,則可以設置signature級別的權限。
SQL注入就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。它可以通過在Web表單中輸入惡意SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
若應用對傳入的查詢參數不做處理或檢驗,而直接拼接進sql查詢語句,則可能導致SQL注入。攻擊者可根據表中實際情況進行手動或編寫腳本自動化遍歷,以獲取數據庫中當前權限允許查詢的所有內容。
例如,某款app均存在sql不規范查詢(如圖3所示),可能導致注入攻擊。

圖3 不規范的sql查詢
對app中的sql不規范查詢點進行逐個注入嘗試,可獲取其中某應用的數據庫內容,如圖4所示。

圖4 數據庫內容
改進措施:在查詢代碼中使用參數化查詢,杜絕用戶參數直接拼接入SQL語句,以防止SQL注入攻擊的產生。
服務器通過操作Cookie類對象對客戶端Cookie進行操作。通過request.getCookie()獲取客戶端提交的所有Cookie(以Cookie[]數組形式返回),通過 response.addCookie(Cookiecookie)向客戶端設置Cookie。
HTTP協議不僅是無狀態的,而且是不安全的。使用 HTTP協議的數據不經過任何加密就直接在網絡上傳播,有被截獲的可能。使用HTTP協議傳輸機密內容是不合理的。如果不希望Cookie在HTTP等非安全協議中傳輸,可以設置Cookie的secure屬性為true。瀏覽器只會在HTTPS和SSL等安全協議中傳輸此類Cookie。如果cookie中設置了HttpOnly屬性,那么通過js腳本將無法讀取到cookie信息,這樣能有效的防止XSS攻擊,竊取cookie內容,這樣就增加了cookie的安全性。
結合webview控件中對敏感字符過濾存在問題,導致xss問題的出現。攻擊者可以獲取受害者cookie等敏感信息,達到仿冒登錄等目的。
發生意外事件時,許多web應用程序返回詳盡的錯誤信息。從僅僅披露錯誤類型的簡單內置消息到泄露許多應用程序狀態細節的詳細調試信息都涵蓋在錯誤消息中。
如果在解釋型web腳本語言中出現錯誤,應用程序通常會返回一條簡單的錯誤消息以揭示錯誤本質,還可能會有發生錯誤的文件的行號。大多數Web應用程序的語言編寫,例如Java、C#和 VB.NET等語言中如果出現無法處理的錯誤時,報錯信息中往往會顯示完整的棧追蹤。另外,數據庫、郵件服務器或SOAP服務器等后端組件也會返回詳盡的錯誤消息。
例如,在某app webview控件中,訪問服務器端提供web頁面時,查詢參數直接列在url中。若攻擊者沒有此項查詢權限,嘗試該查詢url使得缺失某項參數時,服務器會自動給出提示,提示如圖5所示。

圖5 服務器給出的提示
這實際上是暴露了服務器端數據庫中對應表中的表項名稱。攻擊者只需補齊服務器提示的這項參數,服務器就會再次提示下一參數,如此反復,最終給出服務器所需的所有參數。這給攻擊者帶來很大便利,能夠容易地掌握數據庫中各表項名稱,為 sql注入攻擊提供很大參考價值。
改進方式:只要有可能,應該禁止應用程序公布對攻擊者有用的信息;如果某些用戶需要訪問這些信息,應使用訪問控制對它們進行有效保護,并且只有在完全必要時才提供這些信息;如果必須向授權用戶透露敏感信息,那么在不必要時也不得披露現有數據。
SQL注入發生時,攻擊者將SQL代碼插入或添加到應用的輸入參數中,之后再將這些參數傳遞給后臺的SQL服務器加以解析并執行。如果應用未對SQL語句使用的參數進行正確性審查,未過濾其中的非法字符或敏感字等,尤其是如果直接將用戶輸入拼接到SQL語句執行,而非執行參數化查詢,則很可能會導致注入攻擊的產生。
例如,某app服務器存在sql注入漏洞,可構造注入腳本進行查詢。編寫腳本,對數據庫中相應表做遍歷,可以得到數據庫中所有用戶名稱及密碼等敏感信息,如圖6所示。

圖6 泄露的用戶名
改進方式:在SQL查詢語句中,應始終將用戶輸入作為潛在威脅數據,對其敏感操作符、敏感詞進行嚴格校驗,并防止用戶輸入直接拼接入sql語句,而應采用參數化查詢方式。
目錄遍歷是Http所存在的一個安全漏洞,它使得攻擊者能夠訪問受限制的目錄,并在服務器的根目錄以外執行命令。這個漏洞可能存在于服務器軟件本身,也可能存在于應用程序的代碼之中。利用目錄遍歷漏洞,攻擊者能夠跳出服務器的預定目錄,從而訪問到文件系統的其他部分,譬如攻擊者能夠看到一些受限制的文件,或者更危險的,攻擊者能夠執行一些造成整個系統崩潰的指令。
如果目錄遍歷漏洞與文件下載相結合,可以導致任意文件下載漏洞,使得系統密碼、關鍵配置等文件被盜取。如果目錄遍歷漏洞與文件上傳相結合,可以導致任意文件上傳漏洞,使得攻擊者可上傳任意腳本,可能導致任意代碼執行等。
例如,某app服務器中直接將用戶名稱拼接進用戶文件夾路徑,且未對用戶名稱做合法性校驗。我們可以發包手動構造一個名為../../../LY的用戶,則通過路徑拼接與跳轉可以訪問本來無權限訪問的文件。
手動ajax發包內容如圖7所示。

圖7 手動ajax發包內容
執行完成后得到異常用戶名。訪問系統中規定的下載文件鏈接 DownloadZip.do?folderName=LY&zipFileName= 通 過zipFileName 進行目錄跳轉從而實現任意文件讀。
zipFileName=../../../../../etc/passwd時,可以獲得記錄系統用戶密碼的關鍵文件:/etc/passwd
改進方式:對用戶輸入進行嚴格校驗,杜絕目錄跳轉字符拼接入目錄所在字符串。
目前的研究主要通過手工借助逆向分析或網絡抓包工具實現,人工梳理應用的代碼實現邏輯,再結合威脅模型,挖掘潛在的漏洞并實施攻擊。沒有嘗試漏洞挖掘的自動化實現方案,目前無法實現對大量Android應用的安全性分析。接下來的工作,可以結合手動漏洞挖掘過程發現的漏洞特征,采用一些程序分析的方法,開發一款針對Android應用登錄過程的自動化分析工具,實現對Android應用的批量掃描,再結合掃描結果進行針對性的人工分析,將大大提高漏洞挖掘效率。
[1]C.Gibler,J. Crussell, J. Erickson , and H. Chen.AndroidLeaks: Automatically Detecting Potential Privacy Leaks in Android Applications on a Large Scale, on International Conference on Trust & Trustworthy Computing,2012.
[2]E Chin,AP Felt ,K Greenwood ,D Wagner:Analyzing inter-application communication in Android,on International Conference on Mobile Systems,2011.
[3]Z Yang,M Yang:LeakMiner:Detect Information Leakage on Android with Static Taint Analysis,on Software Engineering,2013.
[4]L Lu,Z Li,Z Wu,W Lee,G Jiang:CHEX:statically vetting Android apps for component hijacking vulnerabilities,on Acm Conference on Computer & Communications Security,2012.