Категория OWASP: MASVS-PLATFORM: Взаимодействие платформ
Обзор
Уязвимость, связанная с неявным перехватом намерений, возникает, когда приложение не указывает полное имя класса компонента или пакета при вызове намерения. Это позволяет вредоносному приложению зарегистрировать фильтр намерений для перехвата намерения вместо целевого приложения.
В зависимости от содержания намерения, злоумышленники могут читать или изменять конфиденциальную информацию, а также взаимодействовать с изменяемыми объектами, такими как изменяемые PendingIntents или Binders .
Перехват неявного намерения также может позволить злоумышленнику совершать произвольные действия, такие как запуск компонентов, контролируемых злоумышленником.
Влияние
Если неявное намерение, обрабатывающее конфиденциальные данные, передает токен сессии в дополнительной строке URL для открытия WebView, любое приложение, указывающее соответствующие фильтры намерений, может прочитать этот токен. Это может позволить любому правильно настроенному приложению на устройстве перехватить намерение и прочитать содержащиеся в нем конфиденциальные данные, что позволит злоумышленникам похитить такие данные, как персональные данные или токены сессии.
Меры по смягчению последствий
Если приложение этого не требует, сделайте намерения явными, вызвав setPackage() . Это позволит интерпретировать намерение только определенным компонентом (как внутри приложения, так и из других приложений), предотвращая перехват данных, отправляемых вместе с намерением, ненадежными приложениями. Следующий фрагмент кода показывает, как сделать намерение явным:
Котлин
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);
Если вам необходимо использовать неявные намерения, опустите любую конфиденциальную информацию или изменяемые объекты, которые вы не хотите раскрывать. Неявные намерения могут потребоваться, когда приложение не имеет точной информации о том, какое приложение выполнит действие (например, написание электронного письма, фотографирование и т. д.).
Ресурсы
- Элемент Manifest intent-filter
- Список разрешенных привилегированных прав
- Намерения и фильтры намерений
- Принудительное использование механизма выбора для учета неявных намерений
- Общие неявные намерения