Google Play应用因intent redirection漏洞被拒,设置exported="false"仍无效如何处理?
Google Play Intent重定向漏洞驳回修复排查指南
Intent重定向漏洞的核心风险是应用接收不可信的外部Intent后,未校验就将其(或其携带的参数)转发给其他组件,恶意应用可利用该逻辑绕过权限限制、访问应用私有组件或系统组件。仅配置所有Activity的
exported="false"不能完全规避风险,因为漏洞可能出现在其他组件、动态注册的组件、Intent转发逻辑中。
- 全量校验所有组件的导出配置
除了Activity之外,还要检查AndroidManifest.xml中所有service、receiver、provider组件的exported属性:- Target SDK >= 31的应用必须为所有组件显式声明
exported属性,未显式声明的组件会被系统默认标记为导出,存在风险 - 检查动态注册的广播接收器:动态注册的广播默认全局可接收,若无需接收外部广播,可通过
registerReceiver时指定自定义权限限制访问,或仅接收应用内部发送的带特定权限的广播
- Target SDK >= 31的应用必须为所有组件显式声明
- 排查所有Intent转发逻辑
全局搜索代码中所有调用startActivity()、startService()、sendBroadcast()、PendingIntent.getActivity()/getService()/getBroadcast()的位置,检查传入的Intent是否存在以下风险场景:- 直接使用从外部Intent的
getParcelableExtra()方法获取的Intent对象进行跳转 - 直接将外部Intent携带的
action、data、component、flags参数赋值给新构造的Intent后跳转
上述场景均属于典型的intent重定向风险点,必须全部整改。
- 直接使用从外部Intent的
- 新增Intent跳转白名单校验规则
所有涉及外部参数的Intent跳转,必须执行严格的白名单校验:- 禁止直接转发外部传入的完整Intent对象,必须自行构造新的Intent,仅赋值业务需要的白名单字段
- 若业务需要跳转到第三方应用,必须对目标包名做白名单校验,示例校验逻辑如下:
// 仅允许跳转到白名单内的应用 boolean isAllowJump = false; String allowPkg = "com.xxx.allowedapp"; if (targetIntent.getComponent() != null && allowPkg.equals(targetIntent.getComponent().getPackageName())) { isAllowJump = true; } else if (targetIntent.getPackage() != null && allowPkg.equals(targetIntent.getPackage())) { isAllowJump = true; } if (isAllowJump) { startActivity(targetIntent); } else { // 拦截非法跳转 }- 禁止为不可信的Intent添加
FLAG_ACTIVITY_NEW_TASK、FLAG_GRANT_READ_URI_PERMISSION、FLAG_GRANT_WRITE_URI_PERMISSION等标记,避免权限泄露。
- 排查WebView的跳转逻辑
若应用集成了WebView,检查是否存在通过Intent.parseUri()解析网页url直接跳转的逻辑,该场景是重定向漏洞的高发区:- 所有从WebView解析得到的Intent,必须经过包名白名单校验后才可跳转
- 禁止为WebView生成的Intent授予URI读写权限
- 本地复测验证
修复完成后可手动构造测试用例验证:通过adb构造包含恶意跳转参数的Intent发送到应用的各个公开入口,验证所有非法跳转是否都被拦截。
重新提交审核时,可在审核备注中清晰说明你完成的整改点,帮助审核人员快速确认修复效果。
内容的提问来源于stack exchange,提问作者vedikin
相关产品推荐
相关产品推荐

