◆吳 丹 劉嘉勇 賈 鵬 肖順陶
(四川大學電子信息學院 四川 610064)
基于特征匹配的Android App漏洞檢測系統設計與實現
◆吳 丹 劉嘉勇 賈 鵬 肖順陶
(四川大學電子信息學院 四川 610064)
由于Android系統的開放性和開源性,Android應用數量極其豐富,涉及到日常工作和生活的各個方面。同時由于各種Android市場對應用審核不嚴格,投放到市場中的Android應用存在著大量的已知類型的安全漏洞,這些漏洞給用戶的隱私和財產帶來了極大的威脅。如何快速有效的檢測出Android應用程序中已知類型的漏洞并定位漏洞所在代碼段,成為Android安全領域的一個熱門研究內容。本文針對Android應用漏洞檢測技術進行了研究,對已知漏洞進行歸納、分析,提取漏洞特征信息,提出并實現了一個基于特征匹配的Android應用漏洞檢測系統。該系統由數據庫、檢測腳本、Web頁面三個部分組成。經實驗表明,該系統能夠有效檢測并定位Android應用中存在的已知類型漏洞。
Android; 特征匹配; 漏洞檢測
近年來,隨著移動互聯網的高速發展,移動智能設備已成為人們日常生活的重要依賴,而Android操作系統的市場占有率處于領先地位。Android操作系統快速發展的同時,也伴隨著嚴重的安全問題,在Android系統中已經發現大量安全漏洞,這些安全漏洞主要源于內核、系統框架、以及應用軟件(Application,App)。由于Android生態系統的開放性,Android應用的數量呈現井噴式增長,由于開發人員安全意識不足,在程序設計中存在邏輯缺陷,或者在開發過程中產生疏漏沒有對輸入信息做驗證,并且Android應用市場混亂且缺乏有效的管理機制,這些應用的安全質量難以得到保證,安全漏洞的數量正在逐年上升。
隨著安全漏洞日益凸顯,引發人們對Android App安全的高度重視。本文主要研究了Android 應用漏洞檢測技術,主要工作如下:
(1)建立Android App的漏洞特征庫,該漏洞庫主要是給檢測腳本提供漏洞特征。
(2)編寫檢測腳本,對反編譯Android安裝包(Android Package,APK)得到的源碼、資源文件,以漏洞特征庫中的數據為參數,通過特征匹配及判定規則判斷該App是否存在漏洞。
(3)搭建web頁面,以B/S(瀏覽器/客戶端)的形式,將APK文件上傳、檢測和展示。通過web界面,可以向漏洞特征庫添加新的漏洞特征。
1.1 Android 安全機制
Android 是以 Linux 為內核實現的,保留了Linux 中的一些安全機制[1],并根據Android系統的特點,設置了一系列安全機制,其中與Android App相關的安全機制有APK簽名、權限限制、應用程序沙箱等機制。APK簽名機制基于JAR簽名,Android使用該機制來確保應用更新包是來自于同一作者,從而建立應用程序之間的信任關系[2]; Android App 的權限在AndroidManifest.xml文件中定義,在App進行安裝時,系統根據該文件來決定是否賦予App某些權限; 在安裝App時,系統給App賦予一個唯一的用戶標識(UID),App啟動后就在特定進程內以該UID運行,并擁有一個只屬于該App的專用目錄。Android系統的簽名、權限、沙箱機制為Android應用程序的發布、安裝與運行提供了安全保障。
1.2 Android App 安全性分析
目前Android App 存在很多安全性問題,本文將安全性問題歸納為以下幾類:(1)App權限通常在Android manifest.xml文件中配置。若配置文件設置不當,會造成權限申請不足,或者造成權限申請過度[3];(2)Android App的敏感數據在網絡中進行傳輸時,未使用SSL/TLS加密或防范措施不當,造成敏感數據泄漏、HTTPS中間人劫持、SSL證書替換等;(3)Android APP中主要通過共享配置文件(Shared Preferences)、SQLite數據庫、原始文件方式來存儲數據,若App數據讀寫不當,將會造成數據泄漏;(4)Android 日志信息主要記錄在開發時生成的調試信息,可能會記錄診斷信息、賬號密碼或其他敏感信息,造成數據泄露;(5)Android App組件同時作為數據源和數據目的池,經常成為潛在的攻擊面,如果沒有進行安全防護,或者被授予權限的惡意文件訪問,可能遭到一系列的危害。
以上的安全性問題會直接導致Android App產生各種安全漏洞。Android App常見的安全漏洞有組件和權限內暴露漏洞、WebView組件遠程代碼執行漏洞、弱隨機數漏洞、Intent注入漏洞、SQL注入漏洞、敏感數據泄露漏洞、運行代碼加載漏洞[4],這些漏洞若被攻擊者利用將會造成嚴重影響。
一個典型的API使用不當的例子是WebView遠程代碼執行漏洞,該漏洞源于程序沒有正確地對addJavascriptInterface方法的使用進行限制,攻擊者可通過使用Java Reflection API來利用該漏洞執行任意Java對象的方法。該漏洞可導致合法用戶被安裝惡意扣費軟件、發送欺詐短信、竊取通訊錄和短信以及被遠程控制等嚴重后果[5]。
1.3 Android App 漏洞檢測方法
目前常用于Android App漏洞檢測的方法有靜態分析和動態分析。靜態分析是在不運行App的情況下對反編譯APK后得到的代碼進行分析,通過構建特殊數據流來檢測App中存在的漏洞,具有覆蓋面廣的優點; 動態分析是將App運行在模擬器或Android操作系統中,使用命令行啟動activity或其他組件,根據App行為是否異常或崩潰來檢測App中的漏洞。
本文所設計的檢測系統使用靜態分析方法來檢測Android App 中的漏洞,主要采用特征匹配的方法,根據已知漏洞的特征定位到關鍵API,并通過分析上下文環境來判斷Android App 中是否存在漏洞。
本文設計了一個基于特征匹配的Android App漏洞檢測系統,其大致思路為上傳APK文件,利用檢測腳本反編譯APK生成Smali文件,然后從數據庫讀取漏洞信息特征并根據判定規則進行特征匹配。本章將詳細介紹該系統的整體架構和功能模塊設計。
2.1 系統總體設計
本文將Android漏洞檢測系統分為漏洞信息數據庫、檢測腳本模塊、web頁面展示模塊等三個部分,而檢測腳本模塊又由靜態分析模塊、漏洞掃描模塊兩個部分。系統框架圖如圖1所示:

圖1 系統框架圖
2.2 漏洞數據庫
本文從國內知名漏洞庫中共選取、歸納、分析Android App漏洞八類,具體為:(1)Android組件暴露漏洞:Content Provider組件暴露;(2)遠程代碼執行漏洞:Web組件遠程代碼執行漏洞、Master Key I型漏洞;(3)遠程安全繞過漏洞:Fragment漏洞、電話撥打權限繞過漏洞;(4)Android信息泄漏漏洞:Android SQLite Databases漏洞;(5)https中間人劫持漏洞:SSL_WEBVIEW型中間人劫持漏洞;(6)SSL信任所有證書漏洞;(7)Manifest.xml不安全屬性配置漏洞;(8)下載替換漏洞。提取每種漏洞類型的漏洞特征信息,存入漏洞庫的漏洞特征信息表中。例如,組件暴露漏洞是因為組件在被調用時未做驗證,或在調用其他組件時未做驗證,其特征為Android Manifest文件中android:exported的值設置為true,未使用android:protectionLevel值為signature驗證調用來源。
漏洞信息數據庫包括掃描結果存儲表、漏洞特征信息表,分別用于存儲漏洞掃描相關結果以及漏洞特征信息。漏洞特征信息表為漏洞掃描模塊提供了必要的特征信息; 掃描結果存儲表主要存儲漏洞掃描模塊生成的數據,用于結果的展示和文檔生成。
漏洞特征信息表是可擴展性的,可通過Web頁面提供的借口持續性向該表中添加新的漏洞特征信息。漏洞特征信息表的字段結構如表1所示:

表1 漏洞特征信息表字段結構
2.3 靜態分析模塊
靜態分析模塊主要完成對APK的靜態分析工作,為后續的漏洞掃描提供數據。其分析目標主要有APK文件列表、Manifest配置文件、資源文件、權限、四大組件(Service、Activity、Broadcast和Content Provider)、敏感API調用。靜態分析模塊分為三部分來實現:APK文件分析模塊、DEX文件反編譯模塊、Smali文件分析模塊,其模塊執行流程如圖2所示。

圖2 靜態分析模塊執行流程圖
APK文件分析模塊主要對APK進行解包操作并返回文件類型及APK的基本信息、解析Manifest配置文件以及獲取APK中的所有文件; DEX反編譯模塊即利用工具將DEX文件轉換為Jar文件、Smali文件,并獲取其中所有類列表及方法; Smali文件分析模塊用于實現對DEX反編譯后的Smali文件的處理分析工作等。
2.4 漏洞掃描模塊
漏洞掃描模塊利用靜態分析模塊中的分析結果、Mongo DB數據庫中的漏洞特征信息表中的數據作為輸入數據,通過字符串搜索引擎進行特征匹配,從而完成對應用程序的漏洞檢測,最后將掃描結果數據存儲到Mongo DB數據庫中。其運行關系如圖3所示:

圖3 漏洞掃描模塊運行關系圖
漏洞掃描模塊主要分為兩部分:漏洞檢測模塊、轉存掃描結果模塊。漏洞檢測模塊通過讀取Mongo DB數據庫中存儲的漏洞特征信息,用于實現漏洞信息列表中所有漏洞的掃描工作; 轉存掃描結果模塊主要用于將漏洞檢測模塊的檢測結果轉存到漏洞信息數據庫中,用于漏漏洞掃描結果的展示與查詢。
2.5 Web頁面展示模塊

圖4 APK文件上傳模塊執行流程圖
用戶界面模塊目的是為實現APK自動化掃描提供操作接口,其主要頁面有文件上傳、掃描統計、用戶管理、漏洞特征管理等。
上傳掃描頁面提供APK文件上傳接口、APK文件檢測入口、掃描結果展示及掃描報告下載等功能,其執行流程如圖4所示。
掃描統計頁面將掃描過的APK信息、文檔以列表形式展示,提供查看詳情、刪除、下載功能; 用戶管理頁面,可以實現添加用戶、刪除用戶、修改用戶等功能,并將修改后的用戶信息寫入Mongo DB數據庫; 漏洞特征頁面的主要功能有:展示已有的漏洞特征信息、添加新的漏洞特征信息、刪除漏洞特征信息。
3.1 系統測試運行環境
基于以上設計,本文實現了Android App漏洞檢測系統。為了驗證該系統的有效性,本文搭建系統運行環境并上傳APK文件進行測試,系統運行環境如表2所示:

表2 漏洞信息特征表字段結構
3.2 測試文件來源
實驗的測試文件均是從Android應用市場下載的流行應用,Android應用類型包括美食、購物、娛樂、社交、通訊、體育、天氣、娛樂、商務辦公、出行導航、視頻播放等,APK文件一共達到100個。
3.3 測試結果展示

圖5 APK文件初步掃描結果統計
本文首先通過Web頁面上傳待檢測APK,上傳后即開始自動檢測并對漏洞進行分類處理,檢測完成后自動展示檢測的統計結果。如圖5所示。

圖6 APK文件漏洞類型統計
查看該APK文件檢測結果詳情,詳情中分別統計漏洞類型數,高、中、低等級的漏洞數據,以及一個漏洞在源碼中出現的次數。漏洞類型統計結果如圖6所示。
可以查看漏洞詳情、展示修復建議等,并展示該漏洞的出處,其具體詳情如圖7所示。最后在掃描結果的基礎上對APK文件進行人工分析,確認了APK確實存在檢測系統所檢測出的漏洞,從而證明了該系統能夠有效、快速地檢測出Android App中的已知漏洞。在測試過程中還發現,不能對加固、加殼的APK文件完成自動化檢測。

圖7 APK漏洞檢測詳情
針對目前Android App的安全問題,歸納Android App已知漏洞特征信息,本文設計并實現了一個Android App漏洞檢測系統。系統由Mongo DB數據庫、檢測腳本、Web三個層面構成,Mongo DB數據庫存儲漏洞信息特征、漏洞掃描結果,檢測腳本完成對APK文件信息提取、DEX文件反編譯、關鍵字匹配等操作,Web頁面為系統提供可視化操作接口,簡化流程,為實現Android App漏洞自動化掃描提供了有利條件。該系統的實現,節省了Android App漏洞掃描的時間和成本。系統存在的不足是目前針對已加固、加殼的APK文件無法完成自動化檢測,需要先將其手動脫殼才能進行漏洞掃描。并且該系統的檢測結果依賴特征庫中的特征,在一定程度上會產生誤報和漏報。系統仍需繼續豐富漏洞特征信息數據庫,并且綜合利用靜態分析、動態分析技術來降低誤報率和漏洞率,以實現Android App漏洞的全自動化檢測。
[1]楊剛,溫濤,張玉清.Android漏洞庫的設計與實現[J].信息網絡安全,2015.
[2](美)Nikolay Elenkov著.Android安全架構深究[M].劉惠明譯.北京:電子工業出版社,2016.
[3](美)Joshua J.Drake,(美)Collin Mulliner,(西)Pau Oliva Fora,(美)Stephen A.Ridley,(美)Zach Lanier,(德)Georg Wincherski 著.諸葛建偉,楊坤,肖梓航 譯.Android安全攻防權威指南[M].
[4]董國偉,王眉林,邵帥,朱龍華.基于特征匹配的Android 應用漏洞分析框架[J].清華大學學報自然科學報,2016.
[5]推酷.WebView遠程代碼執行漏洞淺析[OL].http://www.tuicool.com/articles/jeYVFrN,2015.
[6]卿斯漢.Android安全研究進展[J].軟件學報,2016.