意图重定向

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

概述

当攻击者可以部分或完全控制用于在易受攻击应用的上下文中启动新组件的意图的内容时,就会发生意图重定向。

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

影响

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

缓解措施

通常,不要公开与重定向嵌套意图相关的功能。在不可避免的情况下,应用以下缓解方法

  • 正确清理捆绑的信息。务必记住检查或清除标志(FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION, FLAG_GRANT_PERSISTABLE_URI_PERMISSION, 和 FLAG_GRANT_PREFIX_URI_PERMISSION),并检查意图重定向的位置。 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 违规

  • 您的应用从已传递意图的额外数据中取消序列化嵌套意图。
  • 您的应用立即使用该嵌套意图启动应用组件,例如将意图传递到 startActivity()startService()bindService() 中。

资源