亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android13如何加強Intent?filters的安全性

發布時間:2022-05-26 13:37:48 來源:億速云 閱讀:349 作者:iii 欄目:開發技術

今天小編給大家分享一下Android13如何加強Intent filters的安全性的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    前言:

    在看這個變更之前,我們需要回憶下 Android 12 的一個安全性變更, 即聲明了 <intent-filter> 的Activity、BroadcastReceiver、Service 必須聲明 android:exported, 否則將會無法被啟動。

    Android 12 的這個變更是為了防止開發者在不知情的情況下,聲明了一個 intent-filter 就會使得這些組件對外公開,一定程度下強化了安全性。

    但是卻漏掉了顯式 Intent 啟動和 Broadcast Receiver 動態注冊兩種情況,便在 13 中分別推出了兩項變更來進行加強。

    • Intent filters block non- -matching intents

    • Safer exporting of context- -registered receivers

    Intent filters block non-matching intents

    Android 13 開始 Intent 過濾器會屏蔽不匹配的 intent,即便是指定了 Component 的顯式啟動。

    在 13 以前:

    • 開發者想給 Component 添加 支持

    • 這個 需要公開給外部 App 使用,便設定了 Component exported 為 true

    • 這時候該 Component 就出現了一個安全漏洞:外部 App 使用不同于 中聲明的 Action,甚至 mimeType 都不匹配均可以啟動它

    也許你覺得這并沒有什么,但是如果 App 只針對 過來的 Route 做了安全校驗,就造成了校驗上的疏漏。

    具體變更

    假如我們提供了的 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 采用了顯式啟動,即便是錯誤的 ACTION 是可以正常啟動我們的 Activity。

    private fun testIntentFilters() {
        Intent().setComponent(
            ComponentName("com.example.demoapplication",
                "com.example.demoapplication.MainActivity")
        ).apply {
            action = "android.intent.action.TEST_A"
            startActivity(this)
        }
    }

    而運行在 13 上的話,將無法啟動并會發生如下錯誤:

    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 完全符合才可以啟動。

    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)
        }
    }

    豁免

    如下的幾種場景下的 Intent 并不在本次變更的影響范圍內:

    • 目標 Component 沒有聲明 <intent-filter>

    • 同一個 App 內部發出的 Intent

    • 系統發出的 Intent,包括 SystemServer、采用 System UID 的系統 App

    • Root 進程發出的 Intent

    適配辦法

    如果目標運行的版本基于 Android 13,并且不是上述豁免對象的話,需要做些檢查和必要的修改。

    按照啟動方和目標方兩種情況進行適配辦法的探討:

    • 作為啟動方:

      • startActivity()

      • startActivityForResult()

      • sendBroadcast()

      • 是否存在采用顯式 Intent 方式啟動其他 App 或發送廣播的情況

      • 該 Component 是否聲明了 <intent-filter>

      • 防止其 Target 升級到了 Android 13 無法正常啟動,需要注意 Intent 的 action、data 等信息是否準確

    • 作為目標方:

      • Target 是否需要升級到 Android 13

      • 是否對外提供了 Component 并聲明了 <intent-filter>

      • 防止無法被正常啟動,需要告知啟動方 <intent-filter> 的信息

    殘留

    13 上實測發現 Service 組件在顯式啟動下,即便是錯誤的 ACTION,仍能被正常啟動。這是有意為之還是 Beta 版漏洞,源碼尚未公開,原因未知。

    • startService()

    • startForegroundService()

    • bindService()

    Safer exporting of context-registered receivers

    為了幫助提高運行時接收器的安全性,Android 13 允許您指定您應用中的特定廣播接收器是否應被導出以及是否對設備上的其他應用可見。

    如果導出廣播接收器,其他應用將可以向您的應用發送不受保護的廣播。此導出配置在以 Android 13 或更高版本為目標平臺的應用中可用,有助于防止一個主要的應用漏洞來源。

    具體變更

    TargetSDK 升級到 Android13 的 App 在動態注冊 Receiver 的時候不指明該 flag,那么會收到如下的 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

    目前上述限制不是默認生效的,需要開啟如下兼容性變更:

    • 開發者選項 -> App Compatibility Changes -> Your App -> DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED

    另外,當你的 Receiver 聲明了 RECEIVER_NOT_EXPORTED 的話,其他 App 向其發送廣播會失敗,并打印如下日志提醒你的 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

    豁免

    需要留意的是,系統級廣播是受保護的,普通 App 沒有權限發送。

    所以只是監聽系統廣播的話,動態注冊的 Receiver 無需指定上述 flag。即便指定了 RECEIVER_NOT_EXPORTED,和靜態注冊方式一致也能正常接收、不受影響。

    適配辦法

    找到所有動態注冊 Broadcast Receiver 的代碼。如果監聽的包含非系統廣播,請根據是否公開給其他 App 的需要使用來添加 flag 的聲明。

    • RECEIVER_EXPORTED

    • RECEIVER_NOT_EXPORTED

    context.registerReceiver(sharedBroadcastReceiver, intentFilter,
        RECEIVER_EXPORTED)
    context.registerReceiver(privateBroadcastReceiver, intentFilter,
        RECEIVER_NOT_EXPORTED)

    以上就是“Android13如何加強Intent filters的安全性”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    津南区| 巴彦县| 尉犁县| 大悟县| 那曲县| 亚东县| 普宁市| 齐河县| 七台河市| 湖州市| 铁岭县| 奎屯市| 夏津县| 晴隆县| 临海市| 深圳市| 永登县| 汉川市| 剑川县| 调兵山市| 仪陇县| 墨玉县| 扬中市| 台前县| 舞钢市| 祁阳县| 闽清县| 盖州市| 衡水市| 化隆| 噶尔县| 卢氏县| 安溪县| 泾源县| 永城市| 维西| 宿州市| 合水县| 揭西县| 大荔县| 新昌县|