Перехват неявного намерения

Категория 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);

Если вам необходимо использовать неявные намерения, опустите любую конфиденциальную информацию или изменяемые объекты, которые вы не хотите раскрывать. Неявные намерения могут потребоваться, когда приложение не имеет точной информации о том, какое приложение выполнит действие (например, написание электронного письма, фотографирование и т. д.).

Ресурсы