隐式 Intent 劫持

OWASP 类别: MASVS-PLATFORM:平台交互

概览

当应用在调用 Intent 时未指定完全限定的组件类名或软件包时,会发生隐式 Intent 劫持漏洞。这会导致恶意应用注册 Intent 过滤器来截获该 Intent,而非由目标应用处理。

根据 Intent 内容,攻击者可以读取或修改敏感信息,或与可变对象(例如可变的PendingIntentBinder)进行交互。

劫持隐式 Intent 还可能让攻击者执行任意操作,例如启动攻击者控制的组件。

影响

如果一个处理敏感数据的隐式 Intent 在一个 extra URL 字符串中传递会话令牌以打开 WebView,那么任何指定了适当 Intent 过滤器的应用都可以读取此令牌。这可能允许设备上任何配置得当的应用截获 Intent 并读取其中的敏感数据,从而让攻击者可以泄露 PII 或会话令牌等数据。

缓解措施

除非应用有特殊需求,否则通过调用 setPackage() 使 Intent 显式化。这样 Intent 只能由特定的组件(应用内部或来自其他应用)进行解释,从而防止不受信任的应用截获随 Intent 发送的数据。以下代码段展示了如何使 Intent 显式化

Kotlin

val intent = Intent("android.intent.action.CREATE_DOCUMENT").apply {
    addCategory("android.intent.category.OPENABLE")
    setPackage("com.some.packagename")
    setType("*/*")
    putExtra("android.intent.extra.LOCAL_ONLY", true)
    putExtra("android.intent.extra.TITLE", "Some Title")
}
startActivity(intent)

Java

Intent intent = new Intent("android.intent.action.CREATE_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setPackage("com.some.packagename");
intent.setType("*/*");
intent.putExtra("android.intent.extra.LOCAL_ONLY", true);
intent.putExtra("android.intent.extra.TITLE", "Some Title");
startActivity(intent);

如果你需要使用隐式 Intent,请省略任何你不想暴露的敏感信息或可变对象。当应用不清楚哪个应用将处理该操作时(例如撰写电子邮件、拍照等),可能需要使用隐式 Intent。

资源