Android 13 针对 Intent filters 安全的再加强

这篇具有很好参考价值的文章主要介绍了Android 13 针对 Intent filters 安全的再加强。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android 13 针对 Intent filters 安全的再加强

作者:李龙、TechMerger 君

在看这个变更之前,我们需要回忆下 Android 12 的一个安全性变更, 即声明了 <intent-filter> 的Activity、BroadcastReceiver、Service 必须声明 android:exported, 否则将会无法被启动。

Android 12 的这个变更是为了防止开发者在不知情的情况下,声明了一个 intent-filter 就会使得这些组件对外公开,一定程度下强化了安全性。

但是却漏掉了显示 Intent 启动Broadcast Receiver 动态注册两种情况,便在 13 中分别推出了两项变更来进行加强。

  1. Intent filters block non- -matching intents
  2. Safer exporting of context- -registered receivers

Intent filters block non-matching intents

Android 13 开始 Intent 过滤器会屏蔽不匹配的 intent,即便是指定了 Component 的显示启动。

在 13 以前:

  1. 开发者想给 Component 添加 支持

  2. 这个 需要公开给外部 App 使用,便设定了 Component exported 为 true

  3. 这时候该 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 并不在本次变更的影响范围内:

  1. 目标 Component 没有声明 <intent-filter>

  2. 同一个 App 内部发出的 Intent

  3. 系统发出的 Intent,包括 SystemServer、采用 System UID 的系统 App

  4. Root 进程发出的 Intent

适配办法

如果目标运行的版本基于 Android 13,并且不是上述豁免对象的话,需要做些检查和必要的修改。

按照启动方和目标方两种情况进行适配办法的探讨:

  1. 作为启动方:
    • 是否存在采用显示 Intent 方式启动其他 App 或发送广播的情况
      • startActivity()
      • startActivityForResult()
      • sendBroadcast()
    • 该 Component 是否声明了 <intent-filter>
    • 防止其 Target 升级到了 Android 13 无法正常启动,需要注意 Intent 的 action、data 等信息是否准确
  2. 作为目标方:
    • 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)

结语

无论是针对 Intent Fitler 匹配的要求升级还是动态注册的 Receiver Flag,都是为了增强组件安全。希望开发者在对待这些习以为常的三大组件时,多些思考、避免漏洞百出。文章来源地址https://www.toymoban.com/news/detail-469948.html

参考文章

  • Android 13’s Behavior changes
  • Intent 和 Intent 过滤器

到了这里,关于Android 13 针对 Intent filters 安全的再加强的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android页面跳转(Intent)

    布局 代码 隐式意图 没有明确指定组件名的Intent为隐式意图,系统会根据隐式意图中设置的动作(action)、类别(category)、数据UIL等来匹配最合适的组件。 首先在清单文件中使用意图过滤器设置活动的名字 action android:name=“HomeActivity” / category android:name=“android.intent.categ

    2023年04月09日
    浏览(28)
  • android使用相机 intent.resolveActivity returns null

    笔者使用java进行android开发,启动相机时 intent.resolveActivity returns null 笔者使用如下代码启动相机 控制台报错: 步骤1、 在packageappsrcmainAndroidManifest.xml中配置如下内容: 具体操作如下图所示: 具体代码: 问题产生的原因是在Android 11及更高版本中,由于引入了更严格的权限

    2024年01月21日
    浏览(36)
  • 无涯教程-Android Intent Standard Extra Data函数

    下表列出了各种重要的Android Intent Standard Extra Data。您可以查看Android官方文档以获取额外数据的完整列表- Sr.No Extra Data Description 1 EXTRA_ALARM_COUNT 用作AlarmManager intents(意图)中的int Extra字段,以告诉正在调用的应用程序intents(意图)释放了多少未决警报。 2 EXTRA_ALLOW_MULTIPLE 用于指示

    2024年02月10日
    浏览(43)
  • Android Activity启动流程一:从Intent到Activity创建

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 学习前,建议有相关知识储备: 【Android 基础】 应用(Application)启动流程 通过本文你可以学习到Activity启动流

    2024年02月10日
    浏览(35)
  • Android Studio:Intent与组件通信实现页面跳转功能

    📌Android Studio 专栏正在持续更新中,案例的原理图解析、各种模块分析💖这里都有哦,同时也欢迎大家订阅专栏,获取更多详细信息哦✊✊✊ ✨个人主页:零小唬的博客主页 🥂欢迎大家 👍点赞 📨评论 🔔收藏 ✨作者简介:20级计算机专业学生一枚,来自宁夏,可能会去

    2024年02月05日
    浏览(44)
  • Android 屏幕唤醒 + 屏幕解锁 + 开机广播android.intent.action.BOOT_COMPLETED

    Android API Level8以上的时候,程序可以安装在SD卡上。如果程序安装在SD卡上,那么在BOOT_COMPLETED广播发送之后,SD卡才会挂载,因此程序无法监听到该广播。 清单文件 目录下添加: android:installLocation=“internalOnly” android:installLocatio n的属性有\\\" auto \\\"、“ internalOnly ”、“ preferE

    2023年04月16日
    浏览(31)
  • Android kotlin系列讲解(入门篇)使用Intent在Activity之间穿梭

    返回总目录 上一篇: Android kotlin系列讲解(入门篇)Activity的理解与基本用法        你应该已经对创建 Activity 的流程比较熟悉了,那我现在在 ActivityTest 项目再快速地创建一个 Activity 。        还是右击 com.example.activitytest 包→ New → Activity → Empty Views Activity ,会弹出

    2024年02月12日
    浏览(27)
  • Android开发-Activity中“android:exported“属性的作用,以及“Permission Denial: starting Intent“错误解决

    如何在一个应用程序中,启动另外一个应用程序?最近正有这样的需求,也踩了一个小坑。本节介绍使用Activity中\\\"android:exported\\\"属性来实现这种访问。 Activity中\\\"android:exported\\\"属性说明: 在程序清单AndroidMenifest.xml文件中,可以设置这个属性。 Android中的Activity中\\\"android:exported\\\"属

    2024年02月06日
    浏览(40)
  • Android 11及以上出现 Intent.resolveActivity(context.getPackageManager()) == null的处理

    1、使用场景: App调用系统相机拍照设置图片。 2、问题描述:  targetSdkVersion = android 11的之后,以下代码captureIntent.resolveActivity(context.getPackageManager()) 直接返回了null。 3、系统环境: Android 11 , targetSdkVersion == 33 4、解决方案: (1)调用系统应用时: 方案1:在清单文件中添加

    2024年02月13日
    浏览(30)
  • 实时安全分析监控加强网络安全

    网络犯罪分子只需几分钟,有时甚至几秒钟即可泄露敏感数据。但是,IT 团队可能无法在数周内发现这些违规行为。通常,这些违规行为是由外部方或客户发现的,到那时为时已晚。随着网络漏洞的激增,对安全分析的需求空前高涨。 使用 Log360 的安全分析功能不仅可以实时

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包