- 文档
- 教程
- 网络安全
【免费下载链接】mastg
The 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.
本文基于 OWASP MASTG 知识库中的 Android Broadcast Receivers 专题文档,系统讲解广播接收器的注册方式、发送机制、隐式/显式广播差异与访问控制模型,并结合仓库内对应的测试用例(MASTG-TEST-0366)、最佳实践(MASTG-BEST-0052)与可运行 Demo(MASTG-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 filter:
<receiver android:name=".MyReceiver" android:exported="false"> <intent-filter> <action android:name="com.example.app.MY_ACTION" /> </intent-filter> </receiver>Manifest 声明的接收器可以用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 14(API 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.0(API 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 12(API 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:exported="true"且没有声明任何android:permission:
<receiver android:name="org.owasp.mastestapp.MastgTest$PasswordResetReceiver" android:exported="true"> <intent-filter> <action android:name="org.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:name="com.example.app.permission.SEND_INTERNAL_BROADCAST" android:protectionLevel="signature" />再在运行时注册时同时传入broadcastPermission与导出 flags:
registerReceiver( myReceiver, IntentFilter("com.example.app.ACTION_INTERNAL"), "com.example.app.permission.SEND_INTERNAL_BROADCAST", null, Context.RECEIVER_EXPORTED )要点在于:不能把"存在android:permission"本身当作充分保护——normal或dangerous这类可被广泛授予的保护级别,仍可能让不受信任的应用调用敏感组件。同时,对于不需要接收外部广播的接收器,应显式设置android:exported="false"(Manifest 声明)或传入RECEIVER_NOT_EXPORTED(运行时注册),不要把安全寄托在随版本变化的默认值上。
实战:如何枚举与嗅探广播(验证视角)
枚举广播接收器(MASTG-TECH-0162)
MASTG-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:exported="true"呈现为0xffffffff;嵌套 intent filter 只是需要结合目标 SDK 与系统版本解读的信号,本身并不等于导出。
- 在已安装应用的设备/模拟器上,用
adb查询包管理器状态、发送广播并检查近期广播(extras 不会显示):
adb shell dumpsys package <package_name> | awk '/^Receiver Resolver Table:/{show=1} /^Service Resolver Table:/{show=0} 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-0164)
MASTG-TECH-0164 则从攻击者/审计者角度说明:当应用发送隐式广播且未限制接收方(无显式目标包、无权限要求)时,设备上任何应用都可以注册接收它,从而观察广播携带的数据。
- 用 activity manager 服务查看指定 action 的近期广播(只含 Intent 元数据,不含 extras):
adb shell dumpsys activity broadcasts | grep <action>- 用 drozer 注册接收器嗅探匹配指定 action 的广播,可打印完整 Intent 含 extras:
run app.broadcast.sniff --action <action>典型输出会显示携带敏感数据的 extras,例如:
Action: <action> Raw: Intent { act=<action> flg=0x10 (has extras) } Extra: <key>=<value> (java.lang.String)- 若接收方或权限要求阻止外部接收器观察,可在目标应用进程内 hook
Context.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 的失败样本做对照验证,即可在开发和审计两端同时把控这一攻击面。
- 文档
- 教程
- 网络安全
【免费下载链接】mastg
The 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.
相关推荐
从0到1:Argon-Theme开发者指南与二次开发实践
从0到1:Argon Theme开发者指南与二次开发实践 引言:为什么选择Argon Theme? 你是否正在寻找一个既轻盈美观又高度可定制的WordPress
移动开发插件系统MASTG 最佳实践 MASTG-BEST-0052:限制 Android 应用组件访问(Restrict Access to Android App Components)
MASTG 最佳实践 MASTG BEST 0052:限制 Android 应用组件访问(Restrict Access to Android App Comp
文档教程网络安全基于 MASTG 的 Android 导出 Content Provider 访问控制最佳实践:权限加固与 FileProvider 安全文件共享
基于 MASTG 的 Android 导出 Content Provider 访问控制最佳实践:权限加固与 FileProvider 安全文件共享 导读 Con
文档教程网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考