国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于函數(shù)調(diào)用關(guān)系的Android應(yīng)用權(quán)限泄露漏洞挖掘技術(shù)研究

2017-03-14 02:24:26譚翠江劉嘉勇
關(guān)鍵詞:函數(shù)調(diào)用測試用例漏洞

◆譚翠江 劉嘉勇

基于函數(shù)調(diào)用關(guān)系的Android應(yīng)用權(quán)限泄露漏洞挖掘技術(shù)研究

◆譚翠江 劉嘉勇

(四川大學(xué)電子信息學(xué)院 四川 610064)

自Google發(fā)布Android系統(tǒng)以來,各大Android應(yīng)用市場上APP的數(shù)量不斷增長,Android應(yīng)用程序安全問題也日益突出。本文通過對Android 應(yīng)用程序中常見的權(quán)限泄露漏洞形成原理進行研究,提出一種針對由暴露組件引起的權(quán)限泄露漏洞挖掘方法,旨在幫助開發(fā)者和用戶及時發(fā)現(xiàn)存在這種威脅的Android應(yīng)用程序,防止用戶的隱私泄露和財產(chǎn)損失。本文方法在對Android應(yīng)用程序進行靜態(tài)分析得到可疑路徑的基礎(chǔ)上構(gòu)造測試用例進行驗證測試,具有更強的針對性,避免了進行動態(tài)測試時的盲目性,可有效地發(fā)現(xiàn)Android應(yīng)用中存在的權(quán)限泄露漏洞。

Android;函數(shù)調(diào)用;權(quán)限泄露;漏洞挖掘

0 前言

近幾年,移動平臺發(fā)展迅速,逐漸成為人們上網(wǎng)的主要方式,其中Android平臺的發(fā)展最為顯著。根據(jù)市場研究公司Strategy Analytics發(fā)布的最新研究報告顯示,2016年第三季度Android手機目前的全球市場份額已經(jīng)高達87.5%,遠遠超過了其他手機系統(tǒng),占據(jù)全球手機操作系統(tǒng)第一的位置[1]。隨著Android智能設(shè)備的普及,日益嚴峻的Android平臺安全問題變得越來越不可忽視。根據(jù)AVD Android漏洞庫顯示,目前該漏洞庫已收錄662條漏洞信息,其中來自第三方應(yīng)用軟件的漏洞數(shù)量為349個,占了52.72%。因此保證第三方應(yīng)用軟件的安全對保障Android平臺安全顯得尤為重要。而在第三方應(yīng)用軟件中,由于開發(fā)者的疏忽或安全意識不強,常導(dǎo)致應(yīng)用軟件中存在權(quán)限泄露漏洞,對用戶的隱私和財產(chǎn)安全造成極大的威脅。因此,本文就針對由Android組件暴露引起的Android權(quán)限泄露漏洞提出一種基于函數(shù)調(diào)用關(guān)系分析的漏洞挖掘方法,并通過實驗的方式驗證了該方法的有效性和實用性。

1 相關(guān)技術(shù)研究

1.1 Android安全機制

Android系統(tǒng)基于Linux內(nèi)核,在繼承了Linux固有安全機制的同時,還增加了沙箱機制、權(quán)限機制和數(shù)字簽名機制。Android權(quán)限機制采用了安裝時期權(quán)限機制,即要求開發(fā)者預(yù)先聲明他們的權(quán)限請求,使得用戶可以在安裝時期對這些權(quán)限請求進行授權(quán),這區(qū)別于iOS采用的實時權(quán)限機制[2]。Android權(quán)限機制對Android應(yīng)用程序可以執(zhí)行的某些具體操作進行權(quán)限細分和訪問控制,以保證系統(tǒng)資源不被濫用。默認情況下,應(yīng)用程序在使用如網(wǎng)絡(luò)、短信、通話、SDCard存儲等系統(tǒng)資源之前,都必須在程序的AndroidManifest.xml文件中通過標簽來進行申明。如果沒有聲明特定的訪問權(quán)限,就無法訪問這些資源。此外,Android系統(tǒng)為每個應(yīng)用程序創(chuàng)建了一個獨立的沙箱,不同的應(yīng)用程序運行在各自的進行空間中,各個應(yīng)用程序在默認情況下只能訪問自身的資源,從而實現(xiàn)應(yīng)用程序之間的互不干擾[3]。

1.2 Intent機制

Android系統(tǒng)為支持不同應(yīng)用程序間的通信,提供了Intent機制來協(xié)助應(yīng)用程序組件間的交互。Intent是一種運行時綁定機制,它能在程序運行過程中連接兩個不同的組件,負責描述應(yīng)用中一次操作的動作、動作涉及數(shù)據(jù)以及附加數(shù)據(jù)。系統(tǒng)則根據(jù)此Intent的描述,找到對應(yīng)的組件,并將 Intent傳遞給調(diào)用的組件,從而完成組件的調(diào)用[4]。

Intent一般包含兩部分:目的和內(nèi)容,其中目的用來表示該Intent要傳遞給哪個組件,而內(nèi)容則表示向目的組件傳遞什么內(nèi)容。這些可以通過Intent的動作(Action)、數(shù)據(jù)(Data)、類別(Category)、類型(Type)、組件名稱(Component)以及擴展信息(Extra)等屬性來指定。Intent根據(jù)用法可以分為兩種:顯式Intent和隱式Intent。顯式Intent在構(gòu)造的時候需要指明接收對象,而隱式Intent在構(gòu)造時,并不知道明確的接收對象,需要用對接收對象進行過濾,找到合適的接收對象。

1.3 權(quán)限泄露漏洞概述

一般情況下,Android應(yīng)用程序所使用的組件需要在AndroidManifest.xml文件中進行聲明,如:Activity、Services等。在Android系統(tǒng)中,簽名相同且用戶ID相同的程序在執(zhí)行時共享同一個進程空間,彼此之間沒有組件訪問限制。而簽名不同、用戶ID不同的程序之間只能訪問處于暴露狀態(tài)的組件。

組件是否處于暴露狀態(tài)一方面可以通過組件的android:expor ted屬性值來判斷,當組件顯式地將android:exported的屬性值設(shè)為true時,組件處于暴露狀態(tài);當其值被設(shè)為false時,組件處于非暴露狀態(tài)。另一方面當組件沒有顯式地設(shè)置android:exported的屬性值時,組件是否處于暴露狀態(tài)由其是否設(shè)置了Intent過濾器(intent-filter)決定。如果組件設(shè)置了過濾器,則表示該組件可以被外部隱式的Intent訪問調(diào)用,否則該組件則不能被外部程序訪問調(diào)用。此外,如果組件在注冊時設(shè)置了android:permission屬性,則該組件在被外部應(yīng)用調(diào)用時,系統(tǒng)會檢查調(diào)用者是否具有對應(yīng)的權(quán)限,若外部應(yīng)用沒具備該權(quán)限,系統(tǒng)則會拋出異常。權(quán)限泄露模型如圖1所示:

圖1 權(quán)限泄露模型

當暴露的組件沒有設(shè)置android:permission屬性且在進程中存在敏感權(quán)限的API操作時,就有可能被攻擊者通過調(diào)用暴露的組件來繞過Android系統(tǒng)的權(quán)限機制,將外部應(yīng)用的權(quán)限提升至暴露組件所具有的權(quán)限,進行一些其本身無權(quán)進行的敏感操作,如打電話、發(fā)短信等,從而造成了Android應(yīng)用權(quán)限泄露[5]。

2 權(quán)限泄露漏洞挖掘

2.1 APK文件預(yù)處理

由前面的分析可知,導(dǎo)致Android 應(yīng)用權(quán)限泄露漏洞的組件需要一定的條件,即組件必須是暴露的,沒設(shè)置android:permissio n屬性且進行了敏感權(quán)限的API操作。因此在對APK進一步分析前需要先對APK文件進行預(yù)處理,提取后續(xù)分析所需的一些信息。整個預(yù)處理過程如圖2所示。首先對apk文件進行解壓縮,獲取APK包中的dex文件、AndroidManifest.xml文件。然后使用xml解析工具對AndroidManifest.xml文件進行解析,提取應(yīng)用程序申請的權(quán)限信息和程序注冊的組件信息,檢查各組件的andr oid:exported屬性值,以及android:permission屬性、Intent過濾器的設(shè)置情況,篩選出處于暴露狀態(tài)的組件。另一方面對dex文件進行反編譯,得到細粒度的smali代碼,為后面構(gòu)建函數(shù)調(diào)用關(guān)系圖做準備。

圖2 APK預(yù)處理過程

2.2 函數(shù)調(diào)用關(guān)系圖的建立

函數(shù)調(diào)用關(guān)系圖是一個有向圖,圖中的每個節(jié)點為應(yīng)用程序中的一個函數(shù),圖中的邊為函數(shù)的一個調(diào)用點。目前生成Android應(yīng)用程序函數(shù)調(diào)用關(guān)系圖的方法,一般是利用開源的Flowdroid或Androguard工具來生成,但生成的函數(shù)調(diào)用關(guān)系圖中包含了很多的與本文分析內(nèi)容無關(guān)的節(jié)點,增加了后續(xù)分析的復(fù)雜度,因而本文不采用上述方法生成程序的函數(shù)調(diào)用關(guān)系圖。

本文根據(jù)后續(xù)分析的需要,在smali代碼級別上構(gòu)建Android應(yīng)用程序的函數(shù)調(diào)用關(guān)系圖。主要過程是對預(yù)處理過程中得到的smali代碼進行搜索遍歷,提取程序中定義的方法以及各方法中調(diào)用的API函數(shù),并通過回溯,得到各個函數(shù)間的調(diào)用關(guān)系。

因為本文是針對由Intent機制調(diào)用Android暴露組件引起的權(quán)限泄露漏洞進行研究,而Acitivity、Service、BroadCastReceiver組件可由Intent機制訪問調(diào)用,所以只需關(guān)注這三類暴露組件入口函數(shù)后的函數(shù)調(diào)用關(guān)系即可。因此,將Android應(yīng)用程序中上述三類暴露組件的入口函數(shù)設(shè)置為起始節(jié)點,其中這三類Android組件的入口函數(shù)如表1所示[6]。然后對Android應(yīng)用程序的函數(shù)調(diào)用關(guān)系圖進一步優(yōu)化,去除其它與組件入口函數(shù)不連通的無關(guān)節(jié)點,由此可得到應(yīng)用程序中各個暴露組件對應(yīng)的函數(shù)調(diào)用關(guān)系圖。以Test.apk的MainActivity組件為例,得到的函數(shù)調(diào)用關(guān)系圖如圖3所示。

表1 Android組件入口函數(shù)

圖3 Test.apk的MainActivity組件函數(shù)調(diào)用關(guān)系圖

2.3 基于函數(shù)調(diào)用關(guān)系圖的分析

APK預(yù)處理階段得到了應(yīng)用程序所申請的權(quán)限信息,權(quán)限所對應(yīng)的API函數(shù)即為應(yīng)用程序中可能造成權(quán)限泄露的點。其中Android權(quán)限與API函數(shù)的對應(yīng)關(guān)系如表2所示,限于篇幅本文只列出了部分對應(yīng)關(guān)系。

表2 Android權(quán)限與API對應(yīng)表(部分)

圖4 深度優(yōu)先搜索算法示例

為了簡化分析,在生成的應(yīng)用程序暴露組件的函數(shù)調(diào)用關(guān)系圖中,將程序中可能導(dǎo)致用戶信息泄露的點,即權(quán)限所對應(yīng)的API函數(shù)標記為終止節(jié)點。結(jié)合組件的入口函數(shù),即函數(shù)調(diào)用關(guān)系圖的起始節(jié)點,所構(gòu)成的路徑即為存在權(quán)限泄露漏洞的可疑路徑。為了得到由暴露組件引發(fā)的權(quán)限泄露漏洞的全部可疑路徑,本文采用深度優(yōu)先搜索算法對暴露組件的函數(shù)調(diào)用關(guān)系圖進行搜索遍歷。深度優(yōu)先搜索算法是按照深度優(yōu)先展開搜索樹的搜索算法[7],可以有效地求出兩點間的所有路徑。以圖4為例,簡要說明深度優(yōu)先搜索算法搜索從v0到v4節(jié)點所有路徑的過程。

(1)首先建立一個存儲節(jié)點的棧結(jié)構(gòu),將起始節(jié)點v0入棧,并將其標記為入棧狀態(tài)。

(2)從v0節(jié)點出發(fā),找到下一個相鄰的非入棧節(jié)點v1、v2或v3,假設(shè)先訪問v1節(jié)點,將v1節(jié)點入棧,并標記為入棧狀態(tài)。

(3)從v1節(jié)點出發(fā),搜索下一個相鄰的非入棧節(jié)點。由于v1節(jié)點沒有下一個相鄰的節(jié)點,所以從棧頂彈出v1節(jié)點,并將v1節(jié)點標記為非入棧狀態(tài)。此時棧頂是v0節(jié)點。

(4)從v0節(jié)點出發(fā),找到下一個除v1節(jié)點外相鄰的非入棧節(jié)點v2或v3,假設(shè)先訪問v2節(jié)點,將v2節(jié)點入棧,并標記為入棧狀態(tài)。

(5)從v2節(jié)點出發(fā),找到v2節(jié)點的下一個相鄰的非入棧節(jié)點v4,將v4節(jié)點入棧,并標記為入棧狀態(tài)。

(6)由于v4節(jié)點是終止節(jié)點,因此得到了一條從起始節(jié)點v0到終止節(jié)點v4的路徑:v0-> v2-> v4。

(7)從棧頂彈出v4節(jié)點,并將v4節(jié)點標記為非入棧狀態(tài)。

(8)此時棧頂是v2節(jié)點,由于v2節(jié)點沒有除剛出棧的v4節(jié)點外的相鄰非入棧節(jié)點,因此將v2節(jié)點出棧,并標記為非入棧狀態(tài)。

(9)此時棧頂是v0節(jié)點,重復(fù)步驟(4)~(6)得到第二條從起始節(jié)點v0到終止節(jié)點v4的路徑:v0-> v3-> v4。

(10)重復(fù)步驟(7)(8),此時棧頂是v0節(jié)點,由于與v0節(jié)點相鄰的節(jié)點都已被訪問過,因此彈出v0節(jié)點,并標記為非入棧狀態(tài)。此時棧結(jié)構(gòu)為空,結(jié)束整個路徑搜索過程。

如圖3所示的Test.apk的MainActivity組件函數(shù)調(diào)用關(guān)系圖,以組件入口函數(shù)”MainActivity;onCreate()”節(jié)點為起始節(jié)點,應(yīng)用的權(quán)限泄露點”SmsManager;sendTextMessage()”節(jié)點為終止節(jié)點,使用深度優(yōu)先搜索算法進行路徑搜索,得到由起始節(jié)點到終止節(jié)點的所有路徑為:

(1)”MainActivity;onCreate()”->”MainActivity;fun1()”->”MainActivity;fun2()”->”SmsManager;sendTextMessage()”;

(2)”MainActivity;onCreate()”->”SmsManager;sendText Message()”;

即Test.apk的MainActivity中存在權(quán)限泄露的可疑路徑集為{(1)(2)}。

然而在得到的可疑路徑集中,并非所有的路徑都能在程序運行時得到執(zhí)行,大部分的路徑都需要滿足一定的條件才能執(zhí)行。因此需要對存在可疑路徑的危險組件進行動態(tài)測試才能最終確認應(yīng)用中是否存在權(quán)限泄露漏洞。

2.4 對可疑路徑進行測試

為了對得到的可疑路徑集進行測試,需要解決三個問題:

(1)構(gòu)造測試用例;

(2)將測試用例輸入到Android模擬器或真機中執(zhí)行;

(3)監(jiān)視測試用例運行結(jié)果。

對于測試用例的構(gòu)造,由前面得到的可疑路徑集,分別取出每一條可疑路徑,結(jié)合預(yù)處理過程中得到的暴露狀態(tài)的組件信息,得出可疑路徑所在的組件名、組件所設(shè)置的Intent過濾器信息和組件接收的各參數(shù)的數(shù)據(jù)類型。由此可以構(gòu)造一個顯式的Intent或隱式的Intent來模擬攻擊者對該組件進行訪問調(diào)用,其中需要傳遞的參數(shù)根據(jù)不同的數(shù)據(jù)類型分別設(shè)置默認值來進行測試。

為更加方便地解決第二個問題,本文采用Android系統(tǒng)提供的am命令將測試用例輸入Android模擬器進行測試。am命令使用方法如下:

am [subcommand] [options]

即命令后面跟著一個子命令,本文主要用到start、startservice、broadcast三個子命令,它們分別可以啟動Activity、Service組件和發(fā)送廣播。以start子命令為例,其后接一系列可選參數(shù)和選項。重點討論部分,這部分將構(gòu)造的顯式或隱式的Intent轉(zhuǎn)換成命令行的形式輸入android模擬器中。對于顯式的Intent,其轉(zhuǎn)換成命令行的規(guī)則為:

am start –n 包名/組件名。

對于隱式的Intent,其轉(zhuǎn)換成命令行的規(guī)則為: am start [-a ] [-d ] [-t ] [-c ] …

在向Android模擬器輸入測試用例后,需要監(jiān)測測試用例的運行情況,本文采用修改系統(tǒng)源碼的方式,在系統(tǒng)源碼相應(yīng)的API函數(shù)中加入打印日志信息語句來監(jiān)視相關(guān)API函數(shù)被調(diào)用情況,進而根據(jù)日志信息判斷漏洞是否存在。

3 實驗測試結(jié)果

為了驗證本方法的有效性,本文首先設(shè)計了一個存在兩處權(quán)限泄露漏洞的Android應(yīng)用來測試本方法對一個應(yīng)用中存在多處權(quán)限泄露的檢測效果。該應(yīng)用中包含了3個Activity、3個Servi ce。其中每類組件又分別設(shè)置為非暴露、暴露且設(shè)置了android: permission屬性、暴露沒設(shè)置android:permission屬性三種狀態(tài),且每個組件都進行了一次權(quán)限調(diào)用。實驗結(jié)果如表3所示。

表3 實驗結(jié)果

為進一步驗證方法的實用性,本文在Android應(yīng)用市場上隨機下載了涵蓋金融類、系統(tǒng)工具類、社交類、多媒體類和生活服務(wù)類共100個Android應(yīng)用依次進行測試。除了其中13個應(yīng)用程序由于進行了加固處理,在預(yù)處理階段反編譯時出錯,無法進一步分析外,剩余的應(yīng)用程序經(jīng)過預(yù)處理階段共發(fā)現(xiàn)了1136個暴露組件。生成函數(shù)調(diào)用關(guān)系圖進行分析后,共得到了9條造成權(quán)限泄露的可疑路徑。構(gòu)造Intent測試用例對可疑路徑進行測試后,從日志信息中發(fā)現(xiàn)成功地執(zhí)行了其中的三條可疑路徑,其中兩條權(quán)限泄露路徑屬于同一應(yīng)用。這表明利用本文的方法成功地從實驗隨機選取的100個Android應(yīng)用中挖掘出了兩個存在權(quán)限泄露漏洞的應(yīng)用。

通過上述實驗結(jié)果可以看出,本文的方法能有效地挖掘出Android應(yīng)用中由暴露組件引起的權(quán)限泄露漏洞。

4 結(jié)束語

本文通過對Android應(yīng)用進行預(yù)處理,獲取程序的暴露組件和申請的權(quán)限等信息后,結(jié)合暴露組件信息構(gòu)建程序的函數(shù)調(diào)用關(guān)系圖。再結(jié)合Android應(yīng)用權(quán)限與API函數(shù)的對應(yīng)表,以及Android組件的入口函數(shù),采用深度優(yōu)先搜索算法對函數(shù)調(diào)用關(guān)系圖進行搜索,得到應(yīng)用程序中存在權(quán)限泄露的可疑路徑集。最后再通過靜態(tài)分析的結(jié)果構(gòu)造測試用例對可疑路徑集進行驗證測試,大大改善了動態(tài)測試的盲目性,有效地挖掘出了Android應(yīng)用中存在的權(quán)限泄露漏洞。該方法不足之處在于,在構(gòu)造測試用例時,對于組件接收的參數(shù)只是根據(jù)類型設(shè)定了固定的默認值,這使得不能發(fā)現(xiàn)組件需要傳入特定數(shù)據(jù)才能觸發(fā)的漏洞,下一步研究工作將重點在這方面展開。

[1]手機中國2016年第三季度智能手機市場份額調(diào)研報告[R].http://www.cnmo.com/os/561651.html,2016.

[2]朱佳偉,喻梁文,關(guān)志.等.Android權(quán)限機制安全研究綜述[J].計算機應(yīng)用研究,2015.

[3]李淑民.Android智能手機隱私泄露機制及防范方法研究[D].北京交通大學(xué),2015.

[4]Chen F.METHOD,DEVICE AND TERMINAL FO R STARTING APPLICATION PROGRAM:,WO/2014/16 1292[P],2014.

[5]董國偉,王眉林,邵帥等.基于特征匹配的Android應(yīng)用漏洞分析框架[J].清華大學(xué)學(xué)報自然科學(xué)版,2016.

[6]李智,陳金威,陳世喆等.基于靜態(tài)污點分析法的Andr oid信息泄露研究[J].電子質(zhì)量,2015.

[7]龔建華.深度優(yōu)先搜索算法及其改進[J].現(xiàn)代電子技術(shù),2 007.

猜你喜歡
函數(shù)調(diào)用測試用例漏洞
漏洞
基于C語言的數(shù)學(xué)菜單的設(shè)計與實現(xiàn)
基于SmartUnit的安全通信系統(tǒng)單元測試用例自動生成
基于混合遺傳算法的回歸測試用例集最小化研究
基于函數(shù)調(diào)用序列模式和函數(shù)調(diào)用圖的程序缺陷檢測方法*
探討C++編程中避免代碼冗余的技巧
Unity3D項目腳本優(yōu)化分析與研究
中國新通信(2017年1期)2017-03-08 03:12:21
三明:“兩票制”堵住加價漏洞
漏洞在哪兒
兒童時代(2016年6期)2016-09-14 04:54:43
高鐵急救應(yīng)補齊三漏洞
化隆| 梓潼县| 日喀则市| 巩留县| 桑植县| 武乡县| 彝良县| 和顺县| 陆丰市| 内丘县| 郧西县| 白水县| 蒙城县| 金乡县| 兴山县| 武穴市| 苍溪县| 宜州市| 聂拉木县| 肇东市| 浮梁县| 沭阳县| 和龙市| 铁岭县| 江源县| 牙克石市| 泗洪县| 海兴县| 遂宁市| 黔江区| 岳阳市| 兴城市| 易门县| 德清县| 永仁县| 乐清市| 皮山县| 绥中县| 朔州市| 衡水市| 丹东市|