Категория OWASP: MASVS-PLATFORM: взаимодействие с платформой.
Обзор
Уязвимость, связанная с перехватом неявного намерения, возникает, когда приложение не указывает полное название класса компонента или пакета при вызове намерения. Это позволяет вредоносному приложению зарегистрировать фильтр интентов, чтобы перехватывать интенты вместо целевого приложения.
В зависимости от содержимого намерения злоумышленники могут читать или изменять конфиденциальную информацию, а также взаимодействовать с изменяемыми объектами, такими как изменяемые PendingIntents или Binders.
Перехват неявного намерения также может позволить злоумышленнику выполнять произвольные действия, например запускать контролируемые им компоненты.
Влияние
Если неявный интент, обрабатывающий конфиденциальные данные, передает токен сеанса в дополнительной строке URL, чтобы открыть компонент WebView, любое приложение, в котором указаны подходящие фильтры интентов, может прочитать этот токен. Это позволяет любому правильно настроенному приложению на устройстве перехватывать намерение и считывать конфиденциальные данные, например информацию, позволяющую идентифицировать личность, или токены сеанса.
Предотвращение атак
Если это не требуется для работы приложения, делайте намерения явными, вызывая setPackage(). Это позволяет интерпретировать намерение только определенному компоненту (внутри приложения или из других приложений), предотвращая перехват данных, отправленных вместе с намерением, ненадежными приложениями. В следующем фрагменте кода показано, как сделать намерение явным:
Kotlin
val intent = Intent("android.intent.action.CREATE_DOCUMENT").apply {
addCategory("android.intent.category.OPENABLE")
setPackage("com.some.packagename")
setType("*/*")
putExtra("android.intent.extra.LOCAL_ONLY", true)
putExtra("android.intent.extra.TITLE", "Some Title")
}
startActivity(intent)
Java
Intent intent = new Intent("android.intent.action.CREATE_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setPackage("com.some.packagename");
intent.setType("*/*");
intent.putExtra("android.intent.extra.LOCAL_ONLY", true);
intent.putExtra("android.intent.extra.TITLE", "Some Title");
startActivity(intent);
Если вам нужно использовать неявные намерения, не указывайте конфиденциальную информацию или изменяемые объекты, которые вы не хотите раскрывать. Неявные намерения могут использоваться, когда приложение не знает, какое именно приложение будет выполнять действие (например, создавать электронное письмо, делать снимок и т. д.).
Ресурсы
- Элемент intent-filter в манифесте
- Белый список разрешений с высоким уровнем доступа
- Интенты и фильтры интентов
- Принудительный выбор для неявных намерений
- Распространенные неявные объекты Intent