broadany漏洞利用研究_第1頁
broadany漏洞利用研究_第2頁
broadany漏洞利用研究_第3頁
broadany漏洞利用研究_第4頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Broadanywhere 漏洞利用研究一、 Account 管理機制從 Android2.0 開始,系統(tǒng)引入了 Account 管理機制, Account 管理機制提供了集中化管理帳戶 API 以及安全用戶口令和令牌的功能。系統(tǒng)中,可以同時多個帳戶(設(shè)置添加帳戶可以查看),比如、Miscrosoft Exchange、支付寶、等等。Account 機制涉及 AuthenticationService 和 Client 兩個組成元素,它們之間的的通訊統(tǒng)一由AccountManagerService 調(diào)度,AccountManagerService 是 Android 上的一個系統(tǒng)服務(wù)。而給開發(fā)

2、者的接口是 AccountManager。當(dāng) Client 首次使用時,會向 AuthenticationService發(fā)起 addAccount 請求,示意圖如下:普通應(yīng)用(記為 AppA)去請求添加某類賬戶時,會調(diào)用 AccountManager.addAccount,然后AccountManager 會去查找提供賬號的應(yīng)用(記為 AppB)的 Authenticator 類,調(diào)用 Authenticator.addAccount;AppA 再根據(jù) AppB 返回的 Intent 去調(diào)起 AppB 的賬戶登錄界面。二、關(guān)于 System 用戶在 Android 中,系統(tǒng)用戶擁有很高的權(quán)限,

3、通過閱讀系統(tǒng)源碼ActivityManagerService.java 中的ActivityManagerService.checkComponentPermission 函數(shù)可以發(fā)現(xiàn),system 用戶可以完全無視權(quán)限檢查,不管組件是否為 exported,最后都直接返回 PERMISSION_GRANTED。即擁有系統(tǒng)權(quán)限的用戶幾乎可以調(diào)用所有的組件。關(guān)鍵的代碼如下:三、關(guān)于 android 系統(tǒng)的 Intent 機制Intent 是一種運行時綁定(run-time binding)機制,它能在程序運行過程中連接兩個不同的組件。通過 Intent,你的程序可以向 Android 表達某種請

4、求或者意愿,Android 會根據(jù)意愿的內(nèi)容選擇適當(dāng)?shù)慕M件來完成請求。比一個 Activity 希望打開網(wǎng)頁瀏覽器查看某一網(wǎng)頁的內(nèi)容,那么這個Activity 只需要發(fā)出WEB_SEARCH_ACTION 給Android,Android 就會根據(jù)Intent的請求內(nèi)容各組件時的IntentFilter,找到網(wǎng)頁瀏覽器的Activity 來瀏覽網(wǎng)頁。Android 的三個基本組件,Activity,Service 和 Broadcast Receiver 都是通過 Intent 機制激活的,不同類型的組件有不同的傳遞 Intent 方式:1、要激活一個新的 Activity,或者讓一個現(xiàn)有的

5、Activity 做新的操作,可以通過調(diào)用Context.startActivity()或者 Activity.startActivityForResult()。2、要啟動一個新的 Service,或者向一個已有的 Service 傳遞新的指令,調(diào)用Context.startService()或者調(diào)用 Context.bindService()將調(diào)用此的上下文對象與 Service 綁定。3、Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()這三個可以Broadcast Intent

6、。之后,所有已注冊的并且擁有與之相匹配 IntentFilter 的 BroadcastReceiver 就會被激活。Intent 一旦發(fā)出,Android 都會準(zhǔn)確找到相匹配的一個或多個 Activity,Service 或者BroadcastReceiver 作響應(yīng)。所以,不同類型的Intent 消息出現(xiàn)重疊,即Broadcast 的Intent消息只會給 BroadcastReceiver,而決給 Activity 或者 Service。由startActivity()傳遞的消息也只會發(fā)給 Activity,由 startService()傳遞的 Intent 只會給 Service。I

7、ntent 主要由如下幾個部分的1、 Action:用來指明要實施的動作是什么,比如說 ACTION_VIEW, ACTION_EDIT 等。一些常用的 Action: ACTION_CALL activity 啟動一個。ACTION_EDIT activity 顯示用戶編輯的數(shù)據(jù)。ACTION_MAIN activity 作為 Task 中第一個 Activity 啟動。ACTION_SYNC activity 同步與服務(wù)器上的數(shù)據(jù)。ACTION_BATTERY_LOW broadcast receiver 電池過低警告。ACTION_HEADSET_PLUG broadcast recei

8、ver 插拔耳機警告。ACTION_SCREEN_ON broadcast receiver 屏幕變亮警告。ACTION_TIMEZONE_CHANGED broadcast receiver 改變時區(qū)警告。2、 Data: 要事實的具體的數(shù)據(jù),一般由一個 Uri 變量來表示3、 Category:一個字符串,包含了關(guān)于處理該 intent 的組件的種類的信息。一個 intent對象可以有任意個 category。intent 類定義了許多 category 常數(shù).addCategory()為一個intent 對象增加一個 category,removeCategory 刪除一個 catego

9、ry,getCategories()獲取 intent 所有的 category.4、 Type:顯式指定 Intent 的數(shù)據(jù)類型(MIME)(多用途互聯(lián)網(wǎng)郵件擴展,MultipurposeInternet Mail Extensions)。比如,一個組件是可以顯示圖片數(shù)據(jù)的而不能聲音文件。很多情況下,data 類型可在 URI 中找到,比如 content:開頭的 URI,表明數(shù)據(jù)由上的 content provider 提供。但是通過設(shè)置這個屬性,可以強制采用顯式指定的類型而不再進行推導(dǎo)。5、 component:指定 Intent 的目標(biāo)組件的類名稱。通常 Android 會根據(jù) In

10、tent 中包含的其它屬性的信息,比如 action、data/type、category 進行查找,最終找到一個與之匹配的目標(biāo)組件。但是,如果 component 這個屬性有指定的話,將直接使用它指定的組件,而不再執(zhí)行上述查找過程。指定了這個屬性以后,Intent 的其它所有屬性都是可選的。6、 extras:附加信息,例如 ACTION_TIMEZONE_CHANGED 的 intent 有一個"time-zone"附加信息來指明新的時區(qū),而 ACTION_HEADSET_PLUG 有一個“state”附加信息來指示耳機是入還是被拔出。intent 對象有一系列 put

11、.()和 set.()來設(shè)定和獲取附加信息。在應(yīng)用中,我們可以以兩種形式來使用 Intent:1、顯式 Intent:指定了 component 屬性的 Intent(調(diào)用 setComponent(ComponentName)或者 setClass(Context, Class)來指定)。通過指定具體的組件類,通知應(yīng)用啟動對應(yīng)的組件。2、隱式 Intent:沒有指定 comonent 屬性的 Intent。這些 Intent 需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此 Intent 的組件。對于直接 Intent,Android 不需要去做,因為目標(biāo)組件已

12、經(jīng)很明確,Android 需要的是那些間接 Intent,通過將 Intent給可以處理此 Intent 的 Activity、Service 或Broadcast Receiver。四、關(guān)于 PendingIntentIntent 是一個意圖,一個描述了想要啟動一個 Activity、Broadcast 或是 Service 的意圖。它主要持有的信息是它想要啟動的組件(Activity、Broadcast 或是 Service),在開發(fā)操作中,需要通過 startActivity , startService 或 sendBroadcast來啟動這個意圖執(zhí)行某些操作。PendingInten

13、t 可以認為是對 Intent 的包裝,實際上就是,供當(dāng)前 App 或之外的其他 App調(diào)用,而常見的是供外部 App 使用,外部 App 執(zhí)行這個 PendingIntent 時,間接地調(diào)用里面的Intent,即外部 App 延時執(zhí)行 PendingIntent 中描述的 Intent 及其最終行為,PendingIntent 主要持有的信息是它所包裝的 Intent 和當(dāng)前 App Context,即使當(dāng)前 App 已經(jīng)不了,也能通過于 PendingIntent 里的 Context 來執(zhí)行 Intent。當(dāng)你把 PendingIntent 遞交給別的程序進行處理時,PendingInt

14、ent 仍然擁有 PendingIntent 原程序所擁有的權(quán)限。在 PendingIntent.java 文件中,我們可以看到有如下幾個比較常見的靜態(tài)函數(shù):·public static PendingIntentgetActivity(Context context, int reqode,Intent intent, int flags)·public static PendingIntentgetBroadcast(Context context, int reqode,Intent intent, int flags)·public static Pend

15、ingIntentgetService(Context context, int reqode,Intent intent, int flags)·public static PendingIntentgetActivities(Context context, int reqode,Intent intents, int flags)·public static PendingIntent getActivities(Context context, int reqode,Intent intents, int flags, Bundle options)它們就是我們常用

16、的獲取 PendingIntent 的動作了。通過這幾個函數(shù),我們可以從系統(tǒng)中取得用于啟動相應(yīng)組件的對象。PendingIntent 幾個常量:1.FLAG_CANCEL_CURRENT :如果 AlarmManager 管理的 PendingIntent 已經(jīng),那么將會取消當(dāng)前的 PendingIntent,從而創(chuàng)建一個新的 PendingIntent。2.FLAG_UPDATE_CURRENT:如果 AlarmManager 管理的 PendingIntent 已經(jīng),可以讓新的Intent 更新之前 PendingIntent 中的 Intent 對象數(shù)據(jù),例如更新 Intent 中的 E

17、xtras。另外,我們也可以在 PendingIntent 的原進程中調(diào)用 PendingIntent 的 cancel ()把其從系統(tǒng)中移除掉。3.FLAG_NO_CREATE :如果 AlarmManager 管理的 PendingIntent 已經(jīng),那么將不進行任何操作,直接返回已經(jīng)的 PendingIntent,如果 PendingIntent 不了,那么返回 null。五、漏洞分析Broadanywhere 漏洞發(fā)生在 Step 1 之前,Setting 調(diào)用了 AccountManager.addAccount。在傳遞的 AddAccountOptions 參數(shù)時加入了一個 Pen

18、dingIntent,根據(jù)源代碼可知其 intent 類型是 Broadcast。而且這個 PendingIntent 是 Settings 創(chuàng)建的,擁有 system 權(quán)限。注意 PendingIntent.getBroadcast 調(diào)用的參數(shù)中,傳入的是一個"空"的 Intent 對象,這是該漏洞利用的關(guān)鍵。通過研究 PendingIntent 的實現(xiàn)原理可知,PenddingIntent 對象可以按預(yù)先指定的動作進行觸發(fā),當(dāng)這個對象傳遞(通過 binder)到其他進程(不同 uid 的用戶),其他進程利用這個PenddingInten 對象,可以原進程的權(quán)限執(zhí)行指定的

19、觸發(fā)動作。另外,由于觸發(fā)的動作是由系統(tǒng)進程執(zhí)行的,因此哪怕原進程已經(jīng)不了,PenddingIntent 對象上的觸發(fā)動作依然有效。PeddingIntent 是一個 Parcelable 對象,包含了一個叫名 mTarget 成員。這個字段其實是個BinerProxy 對象,真正的實現(xiàn)邏輯在 PenddingIntentRecored.java。從源碼分析可知,PendingIntent.getBroadcast 最終調(diào)用的是 ActivityManagerService 中的 getIntentSender 方法。關(guān)鍵代碼如下:從這個過程可以看出,AMS 會把生成 PenddingIntent 的進程(Caller)信息保存到PendingIntentRecord.Key,并為其維護一個 PendingIntentRecord 對象,這個對象是一個BinderStub。PendingIntent 提供了一系列的 send進行動作觸發(fā),最終是調(diào)用 PendingIntentRecord 的send:再查看 sendInner:分析 Broadcast

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論