網站首頁 編程語言 正文
前言:
翻譯自?
Nicole Borrelli
?在?Medium
?上的 post?《Android Nesting Intents》。
大家 App 是否在某些情況下對外提供了一個?Service
?來執行啟動其他 App 的?Activity
?組件的回調。比如說,接收的?Intent
?請求會以 extra 參數的形式內嵌著的其他 Intent ,而這個 Intent 參數會被用作?startActivity()
?調用。
大家有沒有意識到這種做法會讓我們的 App 變得脆弱、易攻擊?
如下的內容將解釋采用這種做法會帶來的問題,并提供一個解決方案,來確保你的 App 能以更加安全的方式來實現相同的功能。
帶來的問題
我們期望這種類型的交互,會按照示意圖的設計來進行:
上述流程圖展示了如何將一個用來啟動回調 Activity 的 Intent 添加到啟動 Service 的 Intent 中,以及該 Service 被用作啟動參數提供的 Activity。
Client App 為?ClientCallbackActivity
?創建了一個 Intent 實例并將它以 extra 形式添加到了用于其他 Provider App 的?ApiService
?的 Intent 屬性中。Provider App 處理完該請求后將使用 Client App 提供的 Intent 來啟動目標 Activity。
注意:這里需要注意的是 Provider App 調用的 startActivity() 采用的是它自己的?Context,這將帶來兩個欠佳的后果。
- 因為?
ClientCallbackActivity
?將被外部的 Provider App 啟動,所以它需要標記為對外可見即?exported
,而這將允許 Provider App 以外的任何其他 App 都可以啟動它 - 傳遞給 ApiService 的嵌套?
Intent
?可被用來啟動 Provider App 的任何?Activity
,包括私有的、有潛在敏感信息的、對外不可見的所有 Activity!
為了進一步說明,請思考一下如果調用方 App 提供的內嵌 Intent 并非指向自己的 Activity,相反其指向了 Provider App 內部的私有 Activity,會發生什么?
上述流程圖展示了一個精心構造的 Intent 如何被用來啟動 Provider App 的 ApiSensitiveActivity,盡管它對外不可見也不應該被其他 App 啟動。
因為采用了嵌套 Intent,對于 Provider App 來說很難去防止其他 App 去訪問它的私有的、有潛在敏感信息的 Activity 們。而且 Provider App 直接使用了?startActivity()
?去處理 Intent,即便ApiSensitiveActivity
?未被聲明為對外可見仍然可以被啟動。
解決方案:PendingIntent
解決方案很簡單:Provider App 不要接收?Intent
,而是接收?PendingIntent
。原因在于 Intent 和 PendingIntent 的區別: PendingIntent 總是使用創建它的 Context 進行 Intent 的處理。
上述流程圖展示接收 PendingIntent 的話如何使用 App 創建它的 Context 進行處理,這可以阻止訪問 Provider App 中非對外可見的 Activity 們。
因為回調提供的是 PendingIntent 對象,當 Provider App 調用它的?send()
?時,startActivity()
?請求會被當做 Attacker App 這一方進行處理。而 Attacker App 并不具備調用 Provider App 中 ApiSensitiveActivity 的特權,所以系統將會阻止這個啟動請求。
對于 Provider App 來說這必然很有好處,但是我們自己的 Client App 呢?那么,如之前所說我們提供的是 PendingIntent 類型,ClientCallbackActivity 改為私有、非公開的話一樣可以啟動。也就是說,這種做法增強了雙方 App 的安全。
如果你熟悉 Notification、Alarm Manager 等相關的 API,你應該知道它們采用 PendingIntent 來激活某些操作以及向 App 發出 alarm 通知。它始終以創建它的 App 身份進行處理,這也是系統選擇 PendingIntent 而非一般 Intent 的原因。
結語
無論是對于 Client App 還是對于 Provider App,采用?Intent
?這種機制來實現 Activity 啟動回調的做法會導致雙方 App 的安全隱患。這源自于 Intent 會在調用它的 App 上下文進行處理。而這個上下文造成了 Provider App 中非公開 Activity 被啟動的可能性,同時也迫使 Client App 必須對外公開處理回調的 Activity。
相較之下,PendingIntent
?會在創建它的上下文進行處理。這將允許 Provider App 可以自由使用、不會對外暴露 Activity,同時可以使得 Client App 指定任意 Activity 來處理回調,包括非公開 Activity。
原文鏈接:https://juejin.cn/post/7101274784935182366
相關推薦
- 2022-07-09 python沒有gpu,如何改用cpu跑代碼_python
- 2023-03-02 docker-compose安裝RabbitMQ及插件操作步驟_docker
- 2022-11-13 Git如何恢復到之前版本_相關技巧
- 2022-10-27 python圖像填充與裁剪/resize的實現代碼_python
- 2022-10-08 C#中32位浮點數Float(Real)一步步按位Bit進行分析_C#教程
- 2022-05-23 C#中using語句的用法_C#教程
- 2022-06-29 python鏈表的基礎概念和基礎用法詳解_python
- 2023-10-13 el-table中點擊跳轉到詳情頁的兩種方法
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支