Android应用因Intent Redirection漏洞反复被拒,寻求排查及解决方法
Intent Redirection漏洞排查及修复方案
一、先修复AndroidManifest.xml中的明显风险点
- 补全所有缺失的
android:exported属性:当前有3个Activity未显式声明该属性,分别是MoreServicesPage、LoginOTPVerificationPage、MainActivity,targetSdkVersion为30的场景下,未声明该属性且包含Intent Filter的组件默认对外暴露,若不需要外部访问直接设置android:exported="false",若确实需要对外访问则明确设为true后补充后续Intent校验逻辑。 - 修复FCM服务配置:你注册了两个重复的Firebase消息接收服务,其中
Myfirebaseinstanceidservice错误设置了android:exported="true",将该属性改为false,删除冗余的FCM服务声明,避免多余的外部Intent处理逻辑。
二、高风险代码位置排查
所有对外暴露的组件接收的Intent都需要做校验,重点检查以下位置:
- SplashScreenPage组件:该组件设置了
android:exported="true",同时配置了DeepLink的VIEW意图过滤器,重点检查onCreate、onNewIntent中对getIntent()的处理逻辑,是否存在直接取出Intent携带的参数、嵌套Intent直接调用startActivity/startService/sendBroadcast的逻辑。 - Firebase消息接收服务:检查
onMessageReceived方法,是否存在直接用推送携带的参数构造跳转Intent、启动组件的逻辑,禁止通过外部传入的参数直接指定跳转目标。 - 通用逻辑检查:全局搜索代码中是否存在
Intent.parseUri、onActivityResult处理外部返回Intent、PendingIntent嵌套外部Intent的逻辑,这类场景是Intent重定向漏洞的高发区。
三、通用修复规则
- 所有不需要外部访问的组件必须显式声明
android:exported="false",禁止依赖系统默认值。 - 所有外部传入的Intent(包括DeepLink、推送、其他应用传入的Intent)转发前必须做两层校验:
- 校验目标组件的包名必须等于当前应用的包名
getPackageName() - 校验目标组件的类名必须在预设的应用内白名单列表中,禁止跳转到未定义的组件
- 校验目标组件的包名必须等于当前应用的包名
- 若需要启动第三方应用,必须显式指定目标应用包名,禁止使用隐式Intent。
- 禁止通过外部传入的参数直接指定跳转的目标组件类名、Action等信息。
内容的提问来源于stack exchange,提问作者Ajay Pradhan
相关产品推荐
相关产品推荐

