隐式意图劫持

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

概述

当应用程序在调用意图时未指定完全限定的组件类名或包时,就会出现隐式意图劫持漏洞。这允许恶意应用程序注册意图过滤器以拦截意图,而不是拦截目标应用程序。

根据意图内容,攻击者可以读取或修改敏感信息,或与可变对象进行交互,例如可变挂起意图Binder

劫持隐式意图还可以允许攻击者执行任意操作,例如启动攻击者控制的组件。

影响

如果处理敏感数据的隐式意图将会话令牌传递到额外的 URL 字符串以打开 WebView,则任何指定了正确意图过滤器的应用程序都可以读取此令牌。这允许设备上的任何配置正确的应用程序拦截意图并读取其中的敏感数据,从而允许攻击者窃取数据,例如 PII 或会话令牌。

缓解措施

除非应用程序需要,否则通过调用setPackage()使意图明确。这允许意图仅由特定组件(在应用程序内或来自其他应用程序)解释,防止不受信任的应用程序拦截与意图一起发送的数据。以下代码段展示了如何使意图明确

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);

如果您需要使用隐式意图,请省略您不想公开的任何敏感信息或可变对象。当应用程序不确切知道哪个应用程序将解析操作时,可能需要使用隐式意图(例如,撰写电子邮件、拍照等)。

资源