Android13?加強(qiáng)Intent?filters?的安全性
前言:
在看這個(gè)變更之前,我們需要回憶下 Android 12 的一個(gè)安全性變更, 即聲明了 <intent-filter>
的Activity、BroadcastReceiver、Service 必須聲明 android:exported
, 否則將會(huì)無法被啟動(dòng)。
Android 12 的這個(gè)變更是為了防止開發(fā)者在不知情的情況下,聲明了一個(gè) intent-filter 就會(huì)使得這些組件對(duì)外公開,一定程度下強(qiáng)化了安全性。
但是卻漏掉了顯式 Intent 啟動(dòng)和 Broadcast Receiver 動(dòng)態(tài)注冊(cè)兩種情況,便在 13 中分別推出了兩項(xiàng)變更來進(jìn)行加強(qiáng)。
- Intent filters block non- -matching intents
- Safer exporting of context- -registered receivers
Intent filters block non-matching intents
Android 13 開始 Intent 過濾器會(huì)屏蔽不匹配的 intent,即便是指定了 Component 的顯式啟動(dòng)。
在 13 以前:
- 開發(fā)者想給 Component 添加 支持
- 這個(gè) 需要公開給外部 App 使用,便設(shè)定了 Component exported 為 true
- 這時(shí)候該 Component 就出現(xiàn)了一個(gè)安全漏洞:外部 App 使用不同于 中聲明的 Action,甚至 mimeType 都不匹配均可以啟動(dòng)它
也許你覺得這并沒有什么,但是如果 App 只針對(duì) 過來的 Route 做了安全校驗(yàn),就造成了校驗(yàn)上的疏漏。
具體變更
假如我們提供了的 Activity 像如下一樣聲明:
<activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.TEST" /> <data android:mimeType="vnd.android.cursor.dir/event"/> </intent-filter> </activity>
在 13 之前,其他 App 采用了顯式啟動(dòng),即便是錯(cuò)誤的 ACTION 是可以正常啟動(dòng)我們的 Activity。
private fun testIntentFilters() { Intent().setComponent( ComponentName("com.example.demoapplication", "com.example.demoapplication.MainActivity") ).apply { action = "android.intent.action.TEST_A" startActivity(this) } }
而運(yùn)行在 13 上的話,將無法啟動(dòng)并會(huì)發(fā)生如下錯(cuò)誤:
PackageManager: Intent does not match component's intent filter: Intent { act=android.intent.action.TEST_A cmp=com.example.demoapplication/.MainActivity }
PackageManager: Access blocked: ComponentInfo{com.example.demoapplication/com.example.demoapplication.MainActivity}
除了 ACTION 修改正確以外,data 也要滿足即 Intent-filter 完全符合才可以啟動(dòng)。
private fun testIntentFilters() { Intent().setComponent( ComponentName("com.example.demoapplication", "com.example.demoapplication.MainActivity") ).apply { action = "android.intent.action.TEST" data = CalendarContract.Events.CONTENT_URI startActivity(this) } }
豁免
如下的幾種場(chǎng)景下的 Intent 并不在本次變更的影響范圍內(nèi):
- 目標(biāo) Component 沒有聲明
<intent-filter>
- 同一個(gè) App 內(nèi)部發(fā)出的 Intent
- 系統(tǒng)發(fā)出的 Intent,包括
SystemServer
、采用 System UID 的系統(tǒng) App Root
進(jìn)程發(fā)出的 Intent
適配辦法
如果目標(biāo)運(yùn)行的版本基于 Android 13,并且不是上述豁免對(duì)象的話,需要做些檢查和必要的修改。
按照啟動(dòng)方和目標(biāo)方兩種情況進(jìn)行適配辦法的探討:
- 作為啟動(dòng)方:
- 是否存在采用顯式 Intent 方式啟動(dòng)其他 App 或發(fā)送廣播的情況
- startActivity()
- startActivityForResult()
- sendBroadcast()
- 該 Component 是否聲明了
<intent-filter>
- 防止其 Target 升級(jí)到了 Android 13 無法正常啟動(dòng),需要注意 Intent 的 action、data 等信息是否準(zhǔn)確
- 是否存在采用顯式 Intent 方式啟動(dòng)其他 App 或發(fā)送廣播的情況
- 作為目標(biāo)方:
- Target 是否需要升級(jí)到 Android 13
- 是否對(duì)外提供了 Component 并聲明了
<intent-filter>
- 防止無法被正常啟動(dòng),需要告知啟動(dòng)方
<intent-filter>
的信息
殘留
13 上實(shí)測(cè)發(fā)現(xiàn) Service 組件在顯式啟動(dòng)下,即便是錯(cuò)誤的 ACTION,仍能被正常啟動(dòng)。這是有意為之還是 Beta 版漏洞,源碼尚未公開,原因未知。
- startService()
- startForegroundService()
- bindService()
Safer exporting of context-registered receivers
為了幫助提高運(yùn)行時(shí)接收器的安全性,Android 13 允許您指定您應(yīng)用中的特定廣播接收器是否應(yīng)被導(dǎo)出以及是否對(duì)設(shè)備上的其他應(yīng)用可見。
如果導(dǎo)出廣播接收器,其他應(yīng)用將可以向您的應(yīng)用發(fā)送不受保護(hù)的廣播。此導(dǎo)出配置在以 Android 13 或更高版本為目標(biāo)平臺(tái)的應(yīng)用中可用,有助于防止一個(gè)主要的應(yīng)用漏洞來源。
具體變更
TargetSDK 升級(jí)到 Android13 的 App 在動(dòng)態(tài)注冊(cè) Receiver 的時(shí)候不指明該 flag,那么會(huì)收到如下的 crash:
java.lang.SecurityException: com.example.demoapplication: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
目前上述限制不是默認(rèn)生效的,需要開啟如下兼容性變更:
- 開發(fā)者選項(xiàng) -> App Compatibility Changes -> Your App ->
DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED
另外,當(dāng)你的 Receiver 聲明了 RECEIVER_NOT_EXPORTED 的話,其他 App 向其發(fā)送廣播會(huì)失敗,并打印如下日志提醒你的 Receiver 需要公開:
BroadcastQueue: Exported Denial: sending Intent { act=com.example.demoapplication.RECEIVER flg=0x10 }, action: com.example.demoapplication.RECEIVER from com.example.tiramisu_demo (uid=10161)
due to receiver ProcessRecord{8e5f11c 16942:com.example.demoapplication/u0a158} (uid 10158) not specifying RECEIVER_EXPORTED
豁免
需要留意的是,系統(tǒng)級(jí)廣播是受保護(hù)的,普通 App 沒有權(quán)限發(fā)送。
所以只是監(jiān)聽系統(tǒng)廣播的話,動(dòng)態(tài)注冊(cè)的 Receiver 無需指定上述 flag。即便指定了 RECEIVER_NOT_EXPORTED,和靜態(tài)注冊(cè)方式一致也能正常接收、不受影響。
適配辦法
找到所有動(dòng)態(tài)注冊(cè) Broadcast Receiver 的代碼。如果監(jiān)聽的包含非系統(tǒng)廣播,請(qǐng)根據(jù)是否公開給其他 App 的需要使用來添加 flag 的聲明。
RECEIVER_EXPORTED
RECEIVER_NOT_EXPORTED
context.registerReceiver(sharedBroadcastReceiver, intentFilter, RECEIVER_EXPORTED) context.registerReceiver(privateBroadcastReceiver, intentFilter, RECEIVER_NOT_EXPORTED)
結(jié)語(yǔ)
無論是針對(duì) Intent Fitler 匹配的要求升級(jí)還是動(dòng)態(tài)注冊(cè)的 Receiver Flag,都是為了增強(qiáng)組件安全。希望開發(fā)者在對(duì)待這些習(xí)以為常的三大組件時(shí),多些思考、避免漏洞百出。
到此這篇關(guān)于Android13 加強(qiáng)Intent filters 的安全性的文章就介紹到這了,更多相關(guān)Android Intent filters 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin面向?qū)ο笾R(shí)點(diǎn)講解
面向?qū)ο缶幊掏ㄟ^對(duì)事物的抽象,大大的簡(jiǎn)化了程序的開發(fā)難度。我們常用的編程語(yǔ)言:Java、C++、Python都屬于面向?qū)ο缶幊?。Kotlin與java類似,也是一種面向?qū)ο缶幊陶Z(yǔ)言。本文從面向?qū)ο笕齻€(gè)基本特征:封裝、繼承、多態(tài),來闡述一下Kotlin中的面向?qū)ο缶幊?/div> 2022-12-12Android百度地圖實(shí)現(xiàn)搜索和定位及自定義圖標(biāo)繪制并點(diǎn)擊時(shí)彈出泡泡
這篇文章主要介紹了Android百度地圖實(shí)現(xiàn)搜索和定位及自定義圖標(biāo)繪制并點(diǎn)擊時(shí)彈出泡泡的相關(guān)資料,需要的朋友可以參考下2016-01-01Android自定義View圓形和拖動(dòng)圓、跟隨手指拖動(dòng)效果
單純的自定義一個(gè)圓非常簡(jiǎn)單 只需要幾步就完成 拖動(dòng)圓添加實(shí)現(xiàn)觸摸事件即可 。接下來通過本文給大家分享Android自定義View圓形和拖動(dòng)圓、跟隨手指拖動(dòng)效果,感興趣的朋友一起看看吧2017-09-09Android中區(qū)別Drawable Bitmap Canvas Paint
本文主要介紹Android中Drawable Bitmap Canvas Paint 之間的區(qū)別,這里對(duì)這幾個(gè)概念做出詳細(xì)介紹,開發(fā)Android游戲的朋友可以參考下2016-07-07詳解Flutter?響應(yīng)式狀態(tài)管理框架GetX
這篇文章主要為大家介紹了Flutter?響應(yīng)式狀態(tài)管理框架GetX詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09android第三方分享方式的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了android第三方分享方式的簡(jiǎn)單實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Activity實(shí)例詳解之啟動(dòng)activity并返回結(jié)果
這篇文章主要介紹了Activity實(shí)例詳解之啟動(dòng)activity并返回結(jié)果 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09最新評(píng)論