Категория 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);
Ресурсы
Ресурсы
{% дословно %}Рекомендуется для вас
- Примечание. Текст ссылки отображается, когда JavaScript отключен.
- Перенаправление намерения