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