求助:Flutter安卓应用Intent Redirection政策违规问题的复现与修复
Flutter Android应用Intent Redirection漏洞:复现与修复
复现步骤
- 排查应用中接收外部Intent的组件(如Activity),重点确认是否未对Intent的来源和数据做校验
- 使用adb构造恶意Intent测试:
adb shell am start -n com.your.app.package/.MainActivity -d "https://fake-malicious-site.com" - 若应用直接跳转该URL或使用Intent内的数据,且未验证调用方的包名/签名,即可确认漏洞存在
修复方案
1. 校验Intent调用方合法性
在接收Intent的Android原生Activity的onCreate/onNewIntent方法中添加校验逻辑:
val callingPackage = packageManager.getPackagesForUid(callingUid)?.firstOrNull() // 仅允许可信包名调用,比如自身应用包名、官方合作服务包名等 val trustedPackages = listOf("com.your.app.package", "com.google.android.gms") if (callingPackage !in trustedPackages) { finish() return }
2. 严格过滤Intent数据
对Intent中的URL等敏感数据做白名单校验:
val intentData = intent.data?.toString() val allowedDomains = listOf("your-official-domain.com", "your-trusted-partner.com") if (intentData != null && allowedDomains.none { intentData.startsWith("https://$it") }) { finish() return }
3. Flutter层安全规范
- 使用第三方Intent处理插件时,确认插件已内置安全校验;自定义插件需将校验逻辑放在Android原生层,仅向Flutter传递合规数据
- 涉及用户敏感操作(如支付、隐私数据访问),禁止使用隐式Intent,必须用显式Intent指定目标组件
- 必要的外部跳转前,添加用户确认弹窗,明确告知跳转目标地址
修复验证
- 重复复现步骤的adb命令,确认应用会拦截非法Intent
- 提交应用前,使用谷歌Play提供的安全检测工具自检,确保漏洞已修复
内容的提问来源于stack exchange,提问作者Midlaj Nazar
相关产品推荐
相关产品推荐

