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

Категория OWASP: MASVS-ПЛАТФОРМА: Взаимодействие платформы

Обзор

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
    )

Ява

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) или выше, укажите mutability . Например, это можно сделать с помощью FLAG_IMMUTABLE , чтобы предотвратить заполнение незаполненных полей вредоносным приложением:

Котлин

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

Ява

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)

Ява

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

Ресурсы


Ресурсы

{% дословно %} {% дословно %} {% дословно %} {% дословно %}