Ожидаемые намерения

Категория OWASP: MASVS-PLATFORM: Взаимодействие платформ

Обзор

Объект PendingIntent — это ссылка на токен, поддерживаемый системой. Приложение A может передать объект PendingIntent приложению B, чтобы позволить приложению B выполнять предопределенные действия от имени приложения A, независимо от того, активно ли приложение A.

Риск: Изменчивые ожидающие утверждения намерения

Объект PendingIntent может быть изменяемым, что означает, что внутренний интент, определяющий действие, может быть обновлен приложением B в соответствии с логикой, описанной в документации fillIn() . Другими словами, незаполненные поля объекта PendingIntent могут быть изменены вредоносным приложением и предоставить доступ к компонентам уязвимого приложения, которые в противном случае не были бы экспортированы.

Влияние

Влияние этой уязвимости варьируется в зависимости от реализации целевой неэкспортируемой функциональности приложения.

Меры по смягчению последствий

Общий

Убедитесь, что для предотвращения наиболее серьезных уязвимостей настроены действие, компонент и пакет:

Котлин

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

Флаг НЕИЗМЕННЫЙ

Если ваше приложение ориентировано на Android 6 (уровень API 23) или выше, укажите возможность изменения данных . Например, это можно сделать с помощью FLAG_IMMUTABLE , чтобы предотвратить заполнение незаполненных полей вредоносным приложением:

Котлин

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) и выше необходимо указывать, какие поля следует сделать изменяемыми, что снижает вероятность случайных уязвимостей такого типа.

Ресурсы


Риск: повторное воспроизведение ожидающих намерений

Объект PendingIntent может быть воспроизведен повторно, если не установлен флаг FLAG_ONE_SHOT . Важно использовать FLAG_ONE_SHOT, чтобы избежать атак повторного воспроизведения (выполнения действий, которые не должны быть повторяемыми).

Влияние

Влияние этой уязвимости варьируется в зависимости от реализации принимающей стороны намерения. Вредоносное приложение, использующее PendingIntent, созданный без установки флага FLAG_ONE_SHOT, может перехватить и повторно использовать намерение для повторения действий, которые должны выполняться только один раз.

Меры по смягчению последствий

Для ожидающих намерений, которые не предназначены для многократного срабатывания, следует использовать флаг FLAG_ONE_SHOT , чтобы избежать атак повторного воспроизведения.

Котлин

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

Ресурсы


Ресурсы

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}