ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Android 广播接收器(Broadcast Receivers)安全指南:注册、访问控制与 MASTG 检测实践

Android 广播接收器(Broadcast Receivers)安全指南:注册、访问控制与 MASTG 检测实践 文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载本文基于 OWASP MASTG 知识库中的 Android Broadcast Receivers 专题文档系统讲解广播接收器的注册方式、发送机制、隐式/显式广播差异与访问控制模型并结合仓库内对应的测试用例MASTG-TEST-0366、最佳实践MASTG-BEST-0052与可运行 DemoMASTG-DEMO-0130给出从原理到攻防验证的完整实战路径。读完本文你将掌握如何正确配置android:exported、android:permission与运行时注册 flags 来收敛攻击面以及如何用adb、drozer 等方法枚举和嗅探广播以验证安全问题。什么是广播接收器广播接收器broadcast receiver是 Android 的应用组件之一用于响应来自其他应用或系统发出的广播消息。应用以发布-订阅publish-subscribe消息机制使用广播系统会为启动完成、网络连接变化等事件派发广播应用也可以发送自己的广播用于组件间通信或与其他应用通信。在代码层面一个广播接收器继承自BroadcastReceiver类并实现onReceive方法广播到达时系统在接收器线程上回调该方法。广播构建在Intent与 MASTG-KNOW-0025。注册方式一个广播接收器可以通过两种方式被系统感知。Manifest 声明的接收器在AndroidManifest.xml中使用receiver元素声明通常附带一个 intent filterreceiver android:name.MyReceiver android:exportedfalse intent-filter action android:namecom.example.app.MY_ACTION / /intent-filter /receiverManifest 声明的接收器可以用android:permission属性限制哪些应用可以向其发送广播发送方必须持有该命名权限否则广播不会送达接收器。上下文注册的接收器运行时注册上下文注册的接收器在运行时通过调用registerReceiver()并携带一个IntentFilter注册使用unregisterReceiver()注销。它们只在注册上下文Context有效期间接收广播。Context.registerReceiver()是 Android 平台 API常用重载包括registerReceiver(BroadcastReceiver receiver, IntentFilter filter)registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags)registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags)ContextCompat.registerReceiver()是 AndroidX 兼容包装可在各受支持 Android 版本上以一致方式使用运行时接收器导出 flags常用重载包括ContextCompat.registerReceiver(Context context, BroadcastReceiver receiver, IntentFilter filter, int flags)ContextCompat.registerReceiver(Context context, BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags)对上下文注册的接收器安全控制通过相应registerReceiver()重载的以下参数设置flags控制接收器能否接收其他应用的广播。需要接收其他应用广播时使用RECEIVER_EXPORTED只应接收本应用或系统 UID 的广播时使用RECEIVER_NOT_EXPORTED。自 Android 14API level 34起目标 SDK 为 Android 14 及以上的应用在注册非仅系统广播的接收器时必须显式指定运行时导出 flags否则注册行为受限甚至失败。参见 Android 14 行为变更。broadcastPermission要求发送方持有指定权限后广播才会被派发给接收器若为null则不要求发送方权限。发送广播应用通过Context上的方法发送广播sendBroadcast以不确定顺序派发给所有感兴趣的接收器。sendOrderedBroadcast按优先级一次只派发给一个接收器允许某个接收器中止广播或将数据传给下一个接收器。LocalBroadcastManager历史上用于把广播限制在单个应用内现已弃用Google 推荐改用LiveData等可观察数据持有者进行应用内通信。隐式广播与显式广播广播的隐式/显式之分与 Intent 的解析规则一脉相承详见 MASTG-KNOW-0025隐式广播不指定目标应用。系统收到隐式广播后会列出所有注册了该 action 的接收器并逐一派发。显式广播在 Intent 上指定了目标包名或组件名。后台执行限制会约束隐式广播目标 SDK 为 Android 8.0API level 26及以上的应用不能在 Manifest 中注册大多数隐式广播仅存在少量例外上下文注册的接收器不受影响。粘性广播sticky broadcasts 由已弃用的sendStickyBroadcast系列方法发送派发后仍会保留且不提供任何访问控制属于需要规避的遗留风险。优先级接收器在有序广播ordered broadcast中的优先级可以通过 intent filter 中的android:priority属性设置也可以用IntentFilter.setPriority编程设置。同优先级的接收器按任意顺序运行。访问控制谁能给你发广播、你能收到谁的广播其他应用能否向接收器发送广播、或接收应用自身发出的广播由以下机制共同决定android:exported针对 Manifest 声明的接收器为true时其他应用的组件可以在无android:permission等控制拦截的情况下向接收器发送广播为false时仅限本应用、相同 user ID 的应用或特权系统组件访问。当 Manifest 接收器声明了 intent filter 时历史上默认值为true未声明时默认为false。自 Android 12API level 31起存在 intent filter 时必须显式声明该属性否则应用无法安装。android:permission针对 Manifest 声明的接收器要求发送方持有指定权限才能将广播送达接收器发送方未获授权则 Intent 不会被派发。与自定义权限及合适的android:protectionLevel。registerReceiver()的flags参数针对上下文注册的接收器RECEIVER_EXPORTED使接收器对其他应用可见RECEIVER_NOT_EXPORTED阻止其他应用向该接收器发送广播。registerReceiver()的broadcastPermission参数针对上下文注册的接收器设置后要求发送方持有命名权限广播才会被派发为null则不要求。显式目标限制在 Intent 上设置明确的包名或组件可将派发范围限制到该应用相关安全考量见 Security considerations and best practices 与 Insecure broadcast receivers。如何对导出组件整体收紧访问见 MASTG-BEST-0052。源码视角导出且未受保护的接收器MASTG-TEST-0366以上原理在 OWASP MASTG 中直接对应一条测试用例 MASTG-TEST-0366导出且未受保护的、暴露敏感功能的广播接收器。其判定标准是如果某个导出接收器未用带合适保护级别的android:permission保护且onReceive执行了安全相关操作或泄露敏感数据例如读取 intent extras 后发送消息或改变状态测试即失败。可复现的失败样本MASTG-DEMO-0130仓库中的 MASTG-DEMO-0130 是一个刻意构造的漏洞样本——小型密码保险箱。其PasswordResetReceiver从newpass这个未经校验的 intent extra修改存储密码并记录旧密码。从源码 MastgTest.kt 可以看到问题定位// FAIL: [MASTG-TEST-0366] PasswordResetReceiver is exported and does not need any special permissions. class PasswordResetReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val newPassword intent.getStringExtra(newpass) ?: return val prefs context.getSharedPreferences(MastgTest.PREFS, Context.MODE_PRIVATE) val oldPassword prefs.getString(MastgTest.KEY_PASSWORD_STORE, ) Log.d(MASTG-DEMO, Password changed from $oldPassword to $newPassword) prefs.edit().putString(MastgTest.KEY_PASSWORD_STORE, newPassword).apply() } }对应的 AndroidManifest.xml 中接收器被声明为android:exportedtrue且没有声明任何android:permissionreceiver android:nameorg.owasp.mastestapp.MastgTest$PasswordResetReceiver android:exportedtrue intent-filter action android:nameorg.owasp.mastestapp.RESET_PASSWORD / /intent-filter /receiver因此任何应用包括通过adb的外部分发者都可以发送广播覆盖密码VaultActivity本身未导出并不构成保护因为访问控制必须在PasswordResetReceiver这一入口边界上强制。演示配套的静态分析输出 output.txt 也直接印证Exported receiver: org.owasp.mastestapp.MastgTest.PasswordResetReceiver | permission: none。加固写法按 BEST-0052 的推荐配置对照 MASTG-BEST-0052 给出的加固模板若接收器必须导出但只允许特定应用发送应先以signature保护级别定义自定义权限permission android:namecom.example.app.permission.SEND_INTERNAL_BROADCAST android:protectionLevelsignature /再在运行时注册时同时传入broadcastPermission与导出 flagsregisterReceiver( myReceiver, IntentFilter(com.example.app.ACTION_INTERNAL), com.example.app.permission.SEND_INTERNAL_BROADCAST, null, Context.RECEIVER_EXPORTED )要点在于不能把存在android:permission本身当作充分保护——normal或dangerous这类可被广泛授予的保护级别仍可能让不受信任的应用调用敏感组件。同时对于不需要接收外部广播的接收器应显式设置android:exportedfalseManifest 声明或传入RECEIVER_NOT_EXPORTED运行时注册不要把安全寄托在随版本变化的默认值上。实战如何枚举与嗅探广播验证视角枚举广播接收器MASTG-TECH-0162MASTG-TECH-0162 给出了完整的枚举路径建议优先做 Manifest 静态分析无需设备、直接反映应用声明再结合运行时手段确认行为反编译得到AndroidManifest.xml后用xmlstarlet列出每个receiver的名称、导出状态、权限与 intent filter 数量xmlstarlet sel -t -m //receiver -v android:name -o exported -v android:exported -o permission -v android:permission -o intent_filters -v count(intent-filter) -n AndroidManifest.xml上下文注册的接收器不会出现在 Manifest 中需在反编译代码中搜索registerReceiver调用与BroadcastReceiver子类并检查是否指定了RECEIVER_NOT_EXPORTED自 Android 13 / API level 33 起可阻止其他应用向该接收器派发广播。使用aapt2在不解码完整 XML 的情况下查看组件声明aapt2 d xmltree app.apk --file AndroidManifest.xml | grep -A20 E: receiver注意原始输出中android:exportedtrue呈现为0xffffffff嵌套 intent filter 只是需要结合目标 SDK 与系统版本解读的信号本身并不等于导出。在已安装应用的设备/模拟器上用adb查询包管理器状态、发送广播并检查近期广播extras 不会显示adb shell dumpsys package package_name | awk /^Receiver Resolver Table:/{show1} /^Service Resolver Table:/{show0} show adb shell am broadcast -a action --es key value adb shell dumpsys activity broadcasts | grep action最后手段是使用 drozer 枚举导出接收器并向其发送广播run app.broadcast.info -a package_name run app.broadcast.send --action action --extra string key value嗅探隐式 Intent 与广播MASTG-TECH-0164MASTG-TECH-0164 则从攻击者/审计者角度说明当应用发送隐式广播且未限制接收方无显式目标包、无权限要求时设备上任何应用都可以注册接收它从而观察广播携带的数据。用 activity manager 服务查看指定 action 的近期广播只含 Intent 元数据不含 extrasadb shell dumpsys activity broadcasts | grep action用 drozer 注册接收器嗅探匹配指定 action 的广播可打印完整 Intent 含 extrasrun app.broadcast.sniff --action action典型输出会显示携带敏感数据的 extras例如Action: action Raw: Intent { actaction flg0x10 (has extras) } Extra: keyvalue (java.lang.String)若接收方或权限要求阻止外部接收器观察可在目标应用进程内 hookContext.sendBroadcast、Context.startActivity、BroadcastReceiver.onReceive等 API 直接捕获 Intent 对象方法见 MASTG-TECH-0043。小结广播接收器是 Android 应用暴露给系统与其他应用的高频 IPC 入口其安全性完全取决于三组决策Manifest 中是否显式设置android:exported与android:permission、运行时注册时是否使用RECEIVER_EXPORTED/RECEIVER_NOT_EXPORTED与broadcastPermission、以及发送广播时是否采用显式目标。参考本文对应的 MASTG-KNOW-0134 知识条目、MASTG-TEST-0366 测试判定与 MASTG-BEST-0052 加固规范再配合 MASTG-DEMO-0130 的失败样本做对照验证即可在开发和审计两端同时把控这一攻击面。赞分享文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载相关推荐从0到1Argon-Theme开发者指南与二次开发实践从0到1Argon Theme开发者指南与二次开发实践 引言为什么选择Argon Theme 你是否正在寻找一个既轻盈美观又高度可定制的WordPress移动开发插件系统MASTG 最佳实践 MASTG-BEST-0052限制 Android 应用组件访问Restrict Access to Android App ComponentsMASTG 最佳实践 MASTG BEST 0052限制 Android 应用组件访问Restrict Access to Android App Comp文档教程网络安全基于 MASTG 的 Android 导出 Content Provider 访问控制最佳实践权限加固与 FileProvider 安全文件共享基于 MASTG 的 Android 导出 Content Provider 访问控制最佳实践权限加固与 FileProvider 安全文件共享 导读 Con文档教程网络安全上一篇UIScrollView-InfiniteScroll常见问题解答解决你的集成困惑下一篇Android Action Bar Style Generator与Toolbar对比何时选择哪个创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表