◆譚翠江 劉嘉勇
基于函數調用關系的Android應用權限泄露漏洞挖掘技術研究
◆譚翠江 劉嘉勇
(四川大學電子信息學院 四川 610064)
自Google發布Android系統以來,各大Android應用市場上APP的數量不斷增長,Android應用程序安全問題也日益突出。本文通過對Android 應用程序中常見的權限泄露漏洞形成原理進行研究,提出一種針對由暴露組件引起的權限泄露漏洞挖掘方法,旨在幫助開發者和用戶及時發現存在這種威脅的Android應用程序,防止用戶的隱私泄露和財產損失。本文方法在對Android應用程序進行靜態分析得到可疑路徑的基礎上構造測試用例進行驗證測試,具有更強的針對性,避免了進行動態測試時的盲目性,可有效地發現Android應用中存在的權限泄露漏洞。
Android;函數調用;權限泄露;漏洞挖掘
近幾年,移動平臺發展迅速,逐漸成為人們上網的主要方式,其中Android平臺的發展最為顯著。根據市場研究公司Strategy Analytics發布的最新研究報告顯示,2016年第三季度Android手機目前的全球市場份額已經高達87.5%,遠遠超過了其他手機系統,占據全球手機操作系統第一的位置[1]。隨著Android智能設備的普及,日益嚴峻的Android平臺安全問題變得越來越不可忽視。根據AVD Android漏洞庫顯示,目前該漏洞庫已收錄662條漏洞信息,其中來自第三方應用軟件的漏洞數量為349個,占了52.72%。因此保證第三方應用軟件的安全對保障Android平臺安全顯得尤為重要。而在第三方應用軟件中,由于開發者的疏忽或安全意識不強,常導致應用軟件中存在權限泄露漏洞,對用戶的隱私和財產安全造成極大的威脅。因此,本文就針對由Android組件暴露引起的Android權限泄露漏洞提出一種基于函數調用關系分析的漏洞挖掘方法,并通過實驗的方式驗證了該方法的有效性和實用性。
1.1 Android安全機制
Android系統基于Linux內核,在繼承了Linux固有安全機制的同時,還增加了沙箱機制、權限機制和數字簽名機制。Android權限機制采用了安裝時期權限機制,即要求開發者預先聲明他們的權限請求,使得用戶可以在安裝時期對這些權限請求進行授權,這區別于iOS采用的實時權限機制[2]。Android權限機制對Android應用程序可以執行的某些具體操作進行權限細分和訪問控制,以保證系統資源不被濫用。默認情況下,應用程序在使用如網絡、短信、通話、SDCard存儲等系統資源之前,都必須在程序的AndroidManifest.xml文件中通過
1.2 Intent機制
Android系統為支持不同應用程序間的通信,提供了Intent機制來協助應用程序組件間的交互。Intent是一種運行時綁定機制,它能在程序運行過程中連接兩個不同的組件,負責描述應用中一次操作的動作、動作涉及數據以及附加數據。系統則根據此Intent的描述,找到對應的組件,并將 Intent傳遞給調用的組件,從而完成組件的調用[4]。
Intent一般包含兩部分:目的和內容,其中目的用來表示該Intent要傳遞給哪個組件,而內容則表示向目的組件傳遞什么內容。這些可以通過Intent的動作(Action)、數據(Data)、類別(Category)、類型(Type)、組件名稱(Component)以及擴展信息(Extra)等屬性來指定。Intent根據用法可以分為兩種:顯式Intent和隱式Intent。顯式Intent在構造的時候需要指明接收對象,而隱式Intent在構造時,并不知道明確的接收對象,需要用
1.3 權限泄露漏洞概述
一般情況下,Android應用程序所使用的組件需要在AndroidManifest.xml文件中進行聲明,如:Activity、Services等。在Android系統中,簽名相同且用戶ID相同的程序在執行時共享同一個進程空間,彼此之間沒有組件訪問限制。而簽名不同、用戶ID不同的程序之間只能訪問處于暴露狀態的組件。
組件是否處于暴露狀態一方面可以通過組件的android:expor ted屬性值來判斷,當組件顯式地將android:exported的屬性值設為true時,組件處于暴露狀態;當其值被設為false時,組件處于非暴露狀態。另一方面當組件沒有顯式地設置android:exported的屬性值時,組件是否處于暴露狀態由其是否設置了Intent過濾器(intent-filter)決定。如果組件設置了過濾器,則表示該組件可以被外部隱式的Intent訪問調用,否則該組件則不能被外部程序訪問調用。此外,如果組件在注冊時設置了android:permission屬性,則該組件在被外部應用調用時,系統會檢查調用者是否具有對應的權限,若外部應用沒具備該權限,系統則會拋出異常。權限泄露模型如圖1所示:

圖1 權限泄露模型
當暴露的組件沒有設置android:permission屬性且在進程中存在敏感權限的API操作時,就有可能被攻擊者通過調用暴露的組件來繞過Android系統的權限機制,將外部應用的權限提升至暴露組件所具有的權限,進行一些其本身無權進行的敏感操作,如打電話、發短信等,從而造成了Android應用權限泄露[5]。
2.1 APK文件預處理
由前面的分析可知,導致Android 應用權限泄露漏洞的組件需要一定的條件,即組件必須是暴露的,沒設置android:permissio n屬性且進行了敏感權限的API操作。因此在對APK進一步分析前需要先對APK文件進行預處理,提取后續分析所需的一些信息。整個預處理過程如圖2所示。首先對apk文件進行解壓縮,獲取APK包中的dex文件、AndroidManifest.xml文件。然后使用xml解析工具對AndroidManifest.xml文件進行解析,提取應用程序申請的權限信息和程序注冊的組件信息,檢查各組件的andr oid:exported屬性值,以及android:permission屬性、Intent過濾器的設置情況,篩選出處于暴露狀態的組件。另一方面對dex文件進行反編譯,得到細粒度的smali代碼,為后面構建函數調用關系圖做準備。

圖2 APK預處理過程
2.2 函數調用關系圖的建立
函數調用關系圖是一個有向圖,圖中的每個節點為應用程序中的一個函數,圖中的邊為函數的一個調用點。目前生成Android應用程序函數調用關系圖的方法,一般是利用開源的Flowdroid或Androguard工具來生成,但生成的函數調用關系圖中包含了很多的與本文分析內容無關的節點,增加了后續分析的復雜度,因而本文不采用上述方法生成程序的函數調用關系圖。
本文根據后續分析的需要,在smali代碼級別上構建Android應用程序的函數調用關系圖。主要過程是對預處理過程中得到的smali代碼進行搜索遍歷,提取程序中定義的方法以及各方法中調用的API函數,并通過回溯,得到各個函數間的調用關系。
因為本文是針對由Intent機制調用Android暴露組件引起的權限泄露漏洞進行研究,而Acitivity、Service、BroadCastReceiver組件可由Intent機制訪問調用,所以只需關注這三類暴露組件入口函數后的函數調用關系即可。因此,將Android應用程序中上述三類暴露組件的入口函數設置為起始節點,其中這三類Android組件的入口函數如表1所示[6]。然后對Android應用程序的函數調用關系圖進一步優化,去除其它與組件入口函數不連通的無關節點,由此可得到應用程序中各個暴露組件對應的函數調用關系圖。以Test.apk的MainActivity組件為例,得到的函數調用關系圖如圖3所示。

表1 Android組件入口函數

圖3 Test.apk的MainActivity組件函數調用關系圖
2.3 基于函數調用關系圖的分析
APK預處理階段得到了應用程序所申請的權限信息,權限所對應的API函數即為應用程序中可能造成權限泄露的點。其中Android權限與API函數的對應關系如表2所示,限于篇幅本文只列出了部分對應關系。

表2 Android權限與API對應表(部分)

圖4 深度優先搜索算法示例
為了簡化分析,在生成的應用程序暴露組件的函數調用關系圖中,將程序中可能導致用戶信息泄露的點,即權限所對應的API函數標記為終止節點。結合組件的入口函數,即函數調用關系圖的起始節點,所構成的路徑即為存在權限泄露漏洞的可疑路徑。為了得到由暴露組件引發的權限泄露漏洞的全部可疑路徑,本文采用深度優先搜索算法對暴露組件的函數調用關系圖進行搜索遍歷。深度優先搜索算法是按照深度優先展開搜索樹的搜索算法[7],可以有效地求出兩點間的所有路徑。以圖4為例,簡要說明深度優先搜索算法搜索從v0到v4節點所有路徑的過程。
(1)首先建立一個存儲節點的棧結構,將起始節點v0入棧,并將其標記為入棧狀態。
(2)從v0節點出發,找到下一個相鄰的非入棧節點v1、v2或v3,假設先訪問v1節點,將v1節點入棧,并標記為入棧狀態。
(3)從v1節點出發,搜索下一個相鄰的非入棧節點。由于v1節點沒有下一個相鄰的節點,所以從棧頂彈出v1節點,并將v1節點標記為非入棧狀態。此時棧頂是v0節點。
(4)從v0節點出發,找到下一個除v1節點外相鄰的非入棧節點v2或v3,假設先訪問v2節點,將v2節點入棧,并標記為入棧狀態。
(5)從v2節點出發,找到v2節點的下一個相鄰的非入棧節點v4,將v4節點入棧,并標記為入棧狀態。
(6)由于v4節點是終止節點,因此得到了一條從起始節點v0到終止節點v4的路徑:v0-> v2-> v4。
(7)從棧頂彈出v4節點,并將v4節點標記為非入棧狀態。
(8)此時棧頂是v2節點,由于v2節點沒有除剛出棧的v4節點外的相鄰非入棧節點,因此將v2節點出棧,并標記為非入棧狀態。
(9)此時棧頂是v0節點,重復步驟(4)~(6)得到第二條從起始節點v0到終止節點v4的路徑:v0-> v3-> v4。
(10)重復步驟(7)(8),此時棧頂是v0節點,由于與v0節點相鄰的節點都已被訪問過,因此彈出v0節點,并標記為非入棧狀態。此時棧結構為空,結束整個路徑搜索過程。
如圖3所示的Test.apk的MainActivity組件函數調用關系圖,以組件入口函數”MainActivity;onCreate()”節點為起始節點,應用的權限泄露點”SmsManager;sendTextMessage()”節點為終止節點,使用深度優先搜索算法進行路徑搜索,得到由起始節點到終止節點的所有路徑為:
(1)”MainActivity;onCreate()”->”MainActivity;fun1()”->”MainActivity;fun2()”->”SmsManager;sendTextMessage()”;
(2)”MainActivity;onCreate()”->”SmsManager;sendText Message()”;
即Test.apk的MainActivity中存在權限泄露的可疑路徑集為{(1)(2)}。
然而在得到的可疑路徑集中,并非所有的路徑都能在程序運行時得到執行,大部分的路徑都需要滿足一定的條件才能執行。因此需要對存在可疑路徑的危險組件進行動態測試才能最終確認應用中是否存在權限泄露漏洞。
2.4 對可疑路徑進行測試
為了對得到的可疑路徑集進行測試,需要解決三個問題:
(1)構造測試用例;
(2)將測試用例輸入到Android模擬器或真機中執行;
(3)監視測試用例運行結果。
對于測試用例的構造,由前面得到的可疑路徑集,分別取出每一條可疑路徑,結合預處理過程中得到的暴露狀態的組件信息,得出可疑路徑所在的組件名、組件所設置的Intent過濾器信息和組件接收的各參數的數據類型。由此可以構造一個顯式的Intent或隱式的Intent來模擬攻擊者對該組件進行訪問調用,其中需要傳遞的參數根據不同的數據類型分別設置默認值來進行測試。
為更加方便地解決第二個問題,本文采用Android系統提供的am命令將測試用例輸入Android模擬器進行測試。am命令使用方法如下:
am [subcommand] [options]
即命令后面跟著一個子命令,本文主要用到start、startservice、broadcast三個子命令,它們分別可以啟動Activity、Service組件和發送廣播。以start子命令為例,其后接一系列可選參數和
am start –n 包名/組件名。
對于隱式的Intent,其轉換成命令行的規則為: am start [-a
在向Android模擬器輸入測試用例后,需要監測測試用例的運行情況,本文采用修改系統源碼的方式,在系統源碼相應的API函數中加入打印日志信息語句來監視相關API函數被調用情況,進而根據日志信息判斷漏洞是否存在。
為了驗證本方法的有效性,本文首先設計了一個存在兩處權限泄露漏洞的Android應用來測試本方法對一個應用中存在多處權限泄露的檢測效果。該應用中包含了3個Activity、3個Servi ce。其中每類組件又分別設置為非暴露、暴露且設置了android: permission屬性、暴露沒設置android:permission屬性三種狀態,且每個組件都進行了一次權限調用。實驗結果如表3所示。

表3 實驗結果
為進一步驗證方法的實用性,本文在Android應用市場上隨機下載了涵蓋金融類、系統工具類、社交類、多媒體類和生活服務類共100個Android應用依次進行測試。除了其中13個應用程序由于進行了加固處理,在預處理階段反編譯時出錯,無法進一步分析外,剩余的應用程序經過預處理階段共發現了1136個暴露組件。生成函數調用關系圖進行分析后,共得到了9條造成權限泄露的可疑路徑。構造Intent測試用例對可疑路徑進行測試后,從日志信息中發現成功地執行了其中的三條可疑路徑,其中兩條權限泄露路徑屬于同一應用。這表明利用本文的方法成功地從實驗隨機選取的100個Android應用中挖掘出了兩個存在權限泄露漏洞的應用。
通過上述實驗結果可以看出,本文的方法能有效地挖掘出Android應用中由暴露組件引起的權限泄露漏洞。
本文通過對Android應用進行預處理,獲取程序的暴露組件和申請的權限等信息后,結合暴露組件信息構建程序的函數調用關系圖。再結合Android應用權限與API函數的對應表,以及Android組件的入口函數,采用深度優先搜索算法對函數調用關系圖進行搜索,得到應用程序中存在權限泄露的可疑路徑集。最后再通過靜態分析的結果構造測試用例對可疑路徑集進行驗證測試,大大改善了動態測試的盲目性,有效地挖掘出了Android應用中存在的權限泄露漏洞。該方法不足之處在于,在構造測試用例時,對于組件接收的參數只是根據類型設定了固定的默認值,這使得不能發現組件需要傳入特定數據才能觸發的漏洞,下一步研究工作將重點在這方面展開。
[1]手機中國2016年第三季度智能手機市場份額調研報告[R].http://www.cnmo.com/os/561651.html,2016.
[2]朱佳偉,喻梁文,關志.等.Android權限機制安全研究綜述[J].計算機應用研究,2015.
[3]李淑民.Android智能手機隱私泄露機制及防范方法研究[D].北京交通大學,2015.
[4]Chen F.METHOD,DEVICE AND TERMINAL FO R STARTING APPLICATION PROGRAM:,WO/2014/16 1292[P],2014.
[5]董國偉,王眉林,邵帥等.基于特征匹配的Android應用漏洞分析框架[J].清華大學學報自然科學版,2016.
[6]李智,陳金威,陳世喆等.基于靜態污點分析法的Andr oid信息泄露研究[J].電子質量,2015.
[7]龔建華.深度優先搜索算法及其改進[J].現代電子技術,2 007.