如何实现安全的系统BroadcastReceiver,修复动态注册的不安全漏洞
动态注册BroadcastReceiver接收系统广播的安全加固方案
系统广播是否自带权限校验?
并非所有系统广播都自带强制权限校验:
- 绝大多数核心系统广播(如开机完成、网络状态变化、电量变化等)的发送方为系统进程,本身持有系统级专属权限,普通第三方应用无法申请到这类权限,无法模拟发送这类广播
- 少数边缘系统广播无强制发送权限限制,同时如果你动态注册时未做任何接收限制,恶意应用可以构造相同Action的伪造广播触发你的接收器执行预期外的逻辑,这也是AppKnox报出漏洞的核心原因
安全加固操作方案
注册时指定发送方权限
调用带权限参数的registerReceiver()重载方法注册接收器,填入你接收的系统广播对应的官方要求发送方权限,只有持有该权限的发送方发出的广播才会被你的接收器接收,示例代码如下:// 以接收网络变化广播为例,对应的系统发送方权限为android.permission.CONNECTIVITY_INTERNAL registerReceiver( myBroadcastReceiver, intentFilter, "android.permission.CONNECTIVITY_INTERNAL", null )你可以查询Android官方开发者文档中对应系统广播的发送方权限要求,填入对应权限即可。
收紧IntentFilter匹配规则
仅在IntentFilter中添加你实际需要接收的系统广播Action,不要添加多余的匹配规则,避免接收器被非预期的广播触发。收到广播后做二次校验
接收器内部执行逻辑前,先做多层校验:- 校验广播的Action是否完全匹配你预期接收的系统广播Action
- 校验广播发送方的身份,可通过
getCallingPackage()获取发送方包名,或校验发送方签名是否为系统签名 - 对Intent携带的所有额外数据做合法性校验,拒绝处理格式/内容不符合预期的数据
及时注销接收器
动态注册的BroadcastReceiver不需要使用时,立即调用unregisterReceiver()注销,减少接收器的暴露时长,降低被攻击的风险
完成以上配置后即可解决AppKnox报出的不安全漏洞问题。
内容的提问来源于stack exchange,提问作者David Rojas
相关产品推荐
相关产品推荐

