隐式意图劫持

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

概述

当应用在调用意图时未指定完全限定的组件类名或包名时,就会发生隐式意图劫持漏洞。这允许恶意应用注册意图过滤器来拦截意图,而不是预期的应用。

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

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

影响

如果处理敏感数据的隐式意图将会话令牌作为额外网址字符串传递以打开 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);

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

资源