意图重定向

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

概述

意图重定向是指攻击者可以部分或完全控制用于在易受攻击的应用程序上下文中启动新组件的意图内容。

用于启动新组件的意图可以通过多种方式提供,最常见的是作为 extras 字段中的序列化意图,或者被编组为字符串并进行解析。部分控制参数也会导致相同的结果。

影响

影响可能会有所不同。攻击者可能会在易受攻击的应用程序中执行内部功能,或者访问私有组件,例如未导出的 ContentProvider 对象。

缓解措施

常规

一般而言,不要公开与重定向嵌套意图相关的功能。在无法避免的情况下,请应用以下缓解方法

  • 适当地清理捆绑的信息。请务必记住检查或清除标志 (GRANT_URI_PERMISSIONS),并检查意图重定向的位置。 IntentSanitizer 可以帮助您完成此过程。
  • 使用 PendingIntent 对象。这可以防止您的组件被导出,并将目标操作意图设为不可变。

应用程序可以使用 ResolveActivity 等方法检查意图重定向的位置

Kotlin

val intent = getIntent()
// Get the component name of the nested intent.
val forward = intent.getParcelableExtra<Parcelable>("key") as Intent
val name: ComponentName = forward.resolveActivity(packageManager)
// Check that the package name and class name contain the expected values.
if (name.packagename == "safe_package" && name.className == "safe_class") {
    // Redirect the nested intent.
    startActivity(forward)
}

Java

Intent intent = getIntent()
// Get the component name of the nested intent.
Intent forward = (Intent) intent.getParcelableExtra("key");
ComponentName name = forward.resolveActivity(getPackageManager());
// Check that the package name and class name contain the expected values.
if (name.getPackageName().equals("safe_package") &&
        name.getClassName().equals("safe_class")) {
    // Redirect the nested intent.
    startActivity(forward);
}

应用程序可以使用 IntentSanitizer,使用与以下类似的逻辑

Kotlin

val intent = IntentSanitizer.Builder()
     .allowComponent("com.example.ActivityA")
     .allowData("com.example")
     .allowType("text/plain")
     .build()
     .sanitizeByThrowing(intent)

Java

Intent intent = new  IntentSanitizer.Builder()
     .allowComponent("com.example.ActivityA")
     .allowData("com.example")
     .allowType("text/plain")
     .build()
     .sanitizeByThrowing(intent);

常见错误

  • 检查 getCallingActivity() 是否返回非空值。恶意应用程序可以为此函数提供空值。
  • 假设 checkCallingPermission() 在所有上下文中都有效,或者该方法在实际上返回整数时抛出异常。

调试功能

对于面向 Android 12(API 级别 31)或更高版本的应用程序,您可以启用一个 调试功能,该功能在某些情况下可以帮助您检测您的应用程序是否正在执行不安全的意图启动。

如果您的应用程序执行以下两种操作,系统会检测到不安全的意图启动,并且会发生 StrictMode 冲突

  • 您的应用程序从已传送意图的 extras 中解组嵌套意图。
  • 您的应用程序立即使用该嵌套意图启动应用程序组件,例如将意图传递给 startActivity()startService()bindService()

资源

  • 注意:当 JavaScript 关闭时,链接文本将显示。
  • 待处理意图