Android?嵌套?Intent?隱患及解決方案
前言:
翻譯自
Nicole Borrelli在Medium上的 post 《Android Nesting Intents》。
大家 App 是否在某些情況下對(duì)外提供了一個(gè) Service 來(lái)執(zhí)行啟動(dòng)其他 App 的 Activity 組件的回調(diào)。比如說(shuō),接收的 Intent 請(qǐng)求會(huì)以 extra 參數(shù)的形式內(nèi)嵌著的其他 Intent ,而這個(gè) Intent 參數(shù)會(huì)被用作 startActivity() 調(diào)用。
大家有沒(méi)有意識(shí)到這種做法會(huì)讓我們的 App 變得脆弱、易攻擊?
如下的內(nèi)容將解釋采用這種做法會(huì)帶來(lái)的問(wèn)題,并提供一個(gè)解決方案,來(lái)確保你的 App 能以更加安全的方式來(lái)實(shí)現(xiàn)相同的功能。
帶來(lái)的問(wèn)題
我們期望這種類型的交互,會(huì)按照示意圖的設(shè)計(jì)來(lái)進(jìn)行:

上述流程圖展示了如何將一個(gè)用來(lái)啟動(dòng)回調(diào) Activity 的 Intent 添加到啟動(dòng) Service 的 Intent 中,以及該 Service 被用作啟動(dòng)參數(shù)提供的 Activity。
Client App 為 ClientCallbackActivity 創(chuàng)建了一個(gè) Intent 實(shí)例并將它以 extra 形式添加到了用于其他 Provider App 的 ApiService 的 Intent 屬性中。Provider App 處理完該請(qǐng)求后將使用 Client App 提供的 Intent 來(lái)啟動(dòng)目標(biāo) Activity。
注意:這里需要注意的是 Provider App 調(diào)用的 startActivity() 采用的是它自己的 Context,這將帶來(lái)兩個(gè)欠佳的后果。
- 因?yàn)?nbsp;
ClientCallbackActivity將被外部的 Provider App 啟動(dòng),所以它需要標(biāo)記為對(duì)外可見(jiàn)即exported,而這將允許 Provider App 以外的任何其他 App 都可以啟動(dòng)它 - 傳遞給 ApiService 的嵌套
Intent可被用來(lái)啟動(dòng) Provider App 的任何Activity,包括私有的、有潛在敏感信息的、對(duì)外不可見(jiàn)的所有 Activity!
為了進(jìn)一步說(shuō)明,請(qǐng)思考一下如果調(diào)用方 App 提供的內(nèi)嵌 Intent 并非指向自己的 Activity,相反其指向了 Provider App 內(nèi)部的私有 Activity,會(huì)發(fā)生什么?

上述流程圖展示了一個(gè)精心構(gòu)造的 Intent 如何被用來(lái)啟動(dòng) Provider App 的 ApiSensitiveActivity,盡管它對(duì)外不可見(jiàn)也不應(yīng)該被其他 App 啟動(dòng)。
因?yàn)椴捎昧饲短?Intent,對(duì)于 Provider App 來(lái)說(shuō)很難去防止其他 App 去訪問(wèn)它的私有的、有潛在敏感信息的 Activity 們。而且 Provider App 直接使用了 startActivity() 去處理 Intent,即便ApiSensitiveActivity 未被聲明為對(duì)外可見(jiàn)仍然可以被啟動(dòng)。
解決方案:PendingIntent
解決方案很簡(jiǎn)單:Provider App 不要接收 Intent,而是接收 PendingIntent。原因在于 Intent 和 PendingIntent 的區(qū)別: PendingIntent 總是使用創(chuàng)建它的 Context 進(jìn)行 Intent 的處理。

上述流程圖展示接收 PendingIntent 的話如何使用 App 創(chuàng)建它的 Context 進(jìn)行處理,這可以阻止訪問(wèn) Provider App 中非對(duì)外可見(jiàn)的 Activity 們。
因?yàn)榛卣{(diào)提供的是 PendingIntent 對(duì)象,當(dāng) Provider App 調(diào)用它的 send() 時(shí),startActivity() 請(qǐng)求會(huì)被當(dāng)做 Attacker App 這一方進(jìn)行處理。而 Attacker App 并不具備調(diào)用 Provider App 中 ApiSensitiveActivity 的特權(quán),所以系統(tǒng)將會(huì)阻止這個(gè)啟動(dòng)請(qǐng)求。
對(duì)于 Provider App 來(lái)說(shuō)這必然很有好處,但是我們自己的 Client App 呢?那么,如之前所說(shuō)我們提供的是 PendingIntent 類型,ClientCallbackActivity 改為私有、非公開(kāi)的話一樣可以啟動(dòng)。也就是說(shuō),這種做法增強(qiáng)了雙方 App 的安全。
如果你熟悉 Notification、Alarm Manager 等相關(guān)的 API,你應(yīng)該知道它們采用 PendingIntent 來(lái)激活某些操作以及向 App 發(fā)出 alarm 通知。它始終以創(chuàng)建它的 App 身份進(jìn)行處理,這也是系統(tǒng)選擇 PendingIntent 而非一般 Intent 的原因。
結(jié)語(yǔ)
無(wú)論是對(duì)于 Client App 還是對(duì)于 Provider App,采用 Intent 這種機(jī)制來(lái)實(shí)現(xiàn) Activity 啟動(dòng)回調(diào)的做法會(huì)導(dǎo)致雙方 App 的安全隱患。這源自于 Intent 會(huì)在調(diào)用它的 App 上下文進(jìn)行處理。而這個(gè)上下文造成了 Provider App 中非公開(kāi) Activity 被啟動(dòng)的可能性,同時(shí)也迫使 Client App 必須對(duì)外公開(kāi)處理回調(diào)的 Activity。
相較之下,PendingIntent 會(huì)在創(chuàng)建它的上下文進(jìn)行處理。這將允許 Provider App 可以自由使用、不會(huì)對(duì)外暴露 Activity,同時(shí)可以使得 Client App 指定任意 Activity 來(lái)處理回調(diào),包括非公開(kāi) Activity。
到此這篇關(guān)于Android 嵌套 Intent 隱患及解決方案的文章就介紹到這了,更多相關(guān)Android 嵌套 Intent 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android WebView實(shí)現(xiàn)文件下載功能
這篇文章主要為大家詳細(xì)介紹了Android WebView實(shí)現(xiàn)文件下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android開(kāi)發(fā)常用標(biāo)簽小結(jié)
這篇文章主要介紹了Android開(kāi)發(fā)常用標(biāo)簽,分析總結(jié)了Android開(kāi)發(fā)中常見(jiàn)標(biāo)簽的使用技巧,需要的朋友可以參考下2015-05-05
Android 8.0 慢充和快充提示語(yǔ)的實(shí)現(xiàn)原理
這篇文章主要介紹了Android 8.0 慢充和快充提示語(yǔ)的實(shí)現(xiàn)原理,感興趣的朋友跟隨腳本之家小編一起看看吧2018-05-05
Android入門(mén)之SwitchButton的使用教程
SwitchButton是個(gè)什么樣的東西呢?其實(shí)它就是一個(gè)開(kāi)關(guān)。我們?cè)谑謾C(jī)應(yīng)用中經(jīng)常使用到的。本文就來(lái)聊聊Android中的SwitchButton的使用,需要的可以參考一下2022-11-11
Android實(shí)現(xiàn)app開(kāi)機(jī)自啟動(dòng)功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)app開(kāi)機(jī)自啟動(dòng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android仿微信錄音功能(錄音后的raw文件轉(zhuǎn)mp3文件)
這篇文章主要介紹了Android中仿微信錄音功能錄音后的raw文件轉(zhuǎn)mp3文件,本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2019-11-11

