这章来学习“发送隐式广播风险”,这个风险和动态注册Receiver风险有呼应之处,可以结合起来一起看。
一、漏洞原理
隐式广播是指未指定接收方(接收的范围),在发送广播的过程中所有的APP均能够接收到这个广播,那么就会存在广播被拦截的风险,若发送的广播携带数据那么就存在数据泄漏的风险,若发送的广播存在敏感操作那么就存在恶意劫持风险。从Android8.0开始就要显示的指定广播接收方,但是也可以绕过这个限制比如添加FLAG:FLAG_RECEIVER_INCLUDE_BACKGROUND,但不建议这样做,Google既然有这个限制说明确实很影响安全
二、检测手段
step1:
扫描全局代码,是否存在发送隐式广播(未指定接收范围的广播、未使用带权限的广播),具体看修复方法
step2:
汇总结果
三、修复方法
1、使用Intent.setPackage 、Intent.setComponent、Intent.setClassName、Intent.setClass、new Intent(context,receiver.class)
中任一种方法明确指定目标接收方
2、进程内发送消息建议使用LocalBroadcastManager
,或者使用其它手段发送消息
3、使用sendBoardcast(Intent, receiverPermission)
代替sendBoardcast(Intent)保证其他应用不能接收到该广播信息
四、相关资料
广播限制
如果应用注册为接收广播,则在每次发送广播时,应用的接收器都会消耗资源。 如果多个应用注册为接收基于系统事件的广播,则会引发问题:触发广播的系统事件会导致所有应用快速地连续消耗资源,从而降低用户体验。 为了缓解这一问题,Android 7.0(API 级别 24)对广播施加了一些限制,如后台优化中所述。 Android 8.0(API 级别 26)让这些限制更为严格。
- 适配 Android 8.0 或更高版本的应用无法继续在其清单中为隐式广播注册广播接收器。 隐式广播是一种不专门针对该应用的广播。 例如,ACTION_PACKAGE_REPLACED 就是一种隐式广播,因为该广播将被发送给所有已注册侦听器,让后者知道设备上的某些软件包已被替换。 不过,ACTION_MY_PACKAGE_REPLACED 不是隐式广播,因为不管已为该广播注册侦听器的其他应用有多少,它都会只被发送给软件包已被替换的应用。
- 应用可以继续在它们的清单中注册显式广播。
- 应用可以在运行时使用 Context.registerReceiver() 为任意广播(不管是隐式还是显式)注册接收器。
- 需要签名权限的广播不受此限制所限,因为这些广播只会发送到使用相同证书签名的应用,而不是发送到设备上的所有应用。
在许多情况下,之前注册隐式广播的应用使用 JobScheduler 作业可以获得类似的功能。 例如,一款社交照片应用可能需要不时地执行数据清理,并且倾向于在设备连接到充电器时执行此操作。 之前,应用已经在清单中为 ACTION_POWER_CONNECTED 注册了一个接收器;当应用接收到该广播时,它会检查清理是否必要。 为了迁移到 Android 8.0 或更高版本,应用将该接收器从其清单中移除。 应用将清理作业安排在设备处于空闲状态和充电时运行。
asjhan for Android reverse