我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android13 加强Intent filters 的安全性

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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,并且不是上述豁免对象的话,需要做些检查和必要的修改。

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

  • 作为启动方:
    • 是否存在采用显式 Intent 方式启动其他 App 或发送广播的情况
      • startActivity()
      • startActivityForResult()
      • sendBroadcast()
    • 该 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)

结语

无论是针对 Intent Fitler 匹配的要求升级还是动态注册的 Receiver Flag,都是为了增强组件安全。希望开发者在对待这些习以为常的三大组件时,多些思考、避免漏洞百出。

到此这篇关于Android13 加强Intent filters 的安全性的文章就介绍到这了,更多相关Android Intent filters 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android13 加强Intent filters 的安全性

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android13如何加强Intent filters的安全性

今天小编给大家分享一下Android13如何加强Intent filters的安全性的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一
2023-06-30

SSH安全性的加强步骤

本篇内容主要讲解“SSH安全性的加强步骤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SSH安全性的加强步骤”吧!OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationM
2023-06-05

PHP8如何通过Sanitize Filters来增强应用程序的安全性?

PHP是一门广泛应用于Web开发的脚本语言,而安全性一直是Web应用程序开发者需要关注的重要问题。PHP8提供了一种称为Sanitize Filters的机制,通过对用户输入进行过滤和清理,可以增强应用程序的安全性。本文将详细介绍PHP8中
2023-10-22

Linux服务器安全:加强Web接口安全性的关键方法

加强Web接口安全性的关键方法包括:实施访问控制(强身份验证、角色和权限)保护输入和输出(输入验证、输出编码、防止SQL注入)保护通信(HTTPS、TLS、CSP)监控和日志记录(IDS、审计日志、定期扫描)最佳实践(保持软件更新、移除未使用的功能、安全配置、用户教育)通过这些措施,组织可以保护数据、维持可用性并维护客户信任。
Linux服务器安全:加强Web接口安全性的关键方法
2024-04-12

如何通过PHP8的Sanitize Filters提高应用程序的安全性?

如何通过PHP8的Sanitize Filters提高应用程序的安全性?随着网络应用的普及和用户隐私保护的重要性逐渐增加,开发者们对于应用程序的安全性变得越来越关注。PHP8的引入了Sanitize Filters,使开发人员能够更加方便地
2023-10-22

如何设置CentOS防火墙以加强安全性

要设置CentOS防火墙以加强安全性,可以按照以下步骤进行:1. 检查防火墙状态:可以使用以下命令来检查防火墙的状态:```shellsudo systemctl status firewalld```2. 启动防火墙:如果防火墙未启动,可
2023-10-10

怎么加强服务器的安全

这篇文章主要介绍“怎么加强服务器的安全”,在日常操作中,相信很多人在怎么加强服务器的安全问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么加强服务器的安全”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!1.
2023-06-27

如何加强云服务器的安全

加强云服务器的安全可以采取以下措施:使用强密码:确保所有登录凭证和密码都足够强大,包括数字、字母、特殊字符的组合,并定期更改密码。多因素认证:启用多因素认证,以增强身份验证过程,提高账户安全性。及时更新补丁:及时应用操作系统和软件的安全补丁
如何加强云服务器的安全
2024-05-07

加强阿里云服务器安全性的方法与建议

随着互联网技术的快速发展,越来越多的企业和个人开始使用阿里云服务器来存储和处理敏感数据。然而,网络安全威胁也日益增加,因此,如何加强阿里云服务器的安全性成为了企业和个人关注的重要问题。本文将介绍一些提高阿里云服务器安全性的方法和建议。阿里云服务器安全性:阿里云服务器是阿里云提供的一种高性能、高可用的计算服务,可以
加强阿里云服务器安全性的方法与建议
2023-11-20

Oracle Index与数据库安全性的增强

Oracle Index可以帮助提高数据库的性能和安全性。通过为数据库中的表和列创建索引,可以加快数据检索和查询的速度,从而提高系统的性能。同时,索引还可以帮助减少数据库中的重复数据和提高数据的完整性,从而增强数据库的安全性。在数据库安全
Oracle Index与数据库安全性的增强
2024-08-15

加强您的Linux服务器安全性:配置和管理身份验证

加强Linux服务器安全性:身份验证配置与管理身份验证是Linux服务器安全性的基石,通过实施强密码、启用多因素身份验证和限制登录尝试等措施,可以防止未授权访问和恶意活动。管理身份验证涉及帐户锁定、定期审查和启用日志记录。其他考虑因素包括使用身份验证服务器、实施单点登录和部署入侵检测系统。定期评估和渗透测试有助于识别和修复安全漏洞。强大的身份验证措施可显著增强服务器安全性,保护敏感数据并维护系统完整性。
加强您的Linux服务器安全性:配置和管理身份验证
2024-04-09

怎么增强服务器租用的安全性

使用强密码:确保服务器的密码足够复杂,包含大小写字母、数字和特殊字符,并定期更换密码。双重验证:启用双重验证机制,例如短信验证码或身份验证器,以增加服务器的安全性。及时更新系统和软件:定期更新服务器操作系统和软件程序,以修补已知的漏洞和安全
怎么增强服务器租用的安全性
2024-04-25

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录