待处理意图

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

概述

一个 PendingIntent 是系统维护的令牌的引用。应用程序 A 可以将 PendingIntent 传递给应用程序 B,以允许应用程序 B 代表应用程序 A 执行预定义的操作;无论应用程序 A 是否仍然存活。

风险:可变 Pending Intent

PendingIntent 可以是可变的,这意味着指定操作的内部意图可以在 fillIn() 文档中描述的逻辑之后由应用程序 B 更新。换句话说,PendingIntent 的未填充字段可以被恶意应用程序修改,并允许访问易受攻击应用程序的非导出组件。

影响

此漏洞的影响取决于应用程序的目标未导出功能的实现方式。

缓解措施

一般

确保设置了操作、组件和包以避免最严重的漏洞

Kotlin

val intent = Intent(intentAction)

// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)

PendingIntent pendingIntent =
    PendingIntent.getActivity(
        context,
        /* requestCode = */ 0,
        intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
    )

Java

Intent intent = new Intent(intentAction);

// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);

PendingIntent pendingIntent =
        PendingIntent.getActivity(
            getContext(),
            /* requestCode= */ 0,
            intent, /* flags= */ 0);

标记 IMMUTABLE

如果您的应用程序面向 Android 6(API 级别 23)或更高版本,请 指定可变性。例如,这可以通过使用 FLAG_IMMUTABLE 来实现,以防止恶意应用程序填充未填充的字段

Kotlin

val pendingIntent =
    PendingIntent.getActivity(
        context,
        /* requestCode = */ 0,
        Intent(intentAction),
        PendingIntent.FLAG_IMMUTABLE)

Java

PendingIntent pendingIntent =
        PendingIntent.getActivity(
            getContext(),
            /* requestCode= */ 0,
            new Intent(intentAction),
            PendingIntent.FLAG_IMMUTABLE);

在 Android 11(API 级别 30)及更高版本上,您必须指定要使哪些字段可变,这可以缓解此类意外漏洞。

资源


风险:重放 Pending Intent

除非设置了 FLAG_ONE_SHOT 标记,否则 PendingIntent 可以被重放。使用 FLAG_ONE_SHOT 以避免重放攻击(执行不应重复的操作)。

影响

此漏洞的影响取决于意图接收端的实现方式。利用未设置 FLAG_ONE_SHOT 标记的 PendingIntent 的恶意应用程序可以捕获和重复使用该意图以重复仅应执行一次的操作。

缓解措施

不打算多次触发的 Pending Intent 应该使用 FLAG_ONE_SHOT 标记以避免重放攻击。

Kotlin

val pendingIntent =
      PendingIntent.getActivity(
          context,
          /* requestCode = */ 0,
          Intent(intentAction),
          PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)

Java

PendingIntent pendingIntent =
        PendingIntent.getActivity(
            getContext(),
            /* requestCode= */ 0,
            new Intent(intentAction),
            PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);

资源


资源

  • 注意:当 JavaScript 关闭时,将显示链接文本
  • 意图重定向