2021-12-01 10:25:19
Re-route Your Intent for Privilege Escalation - презентация с BlackHat Europe 2021, посвященная уязвимостям, связанным с использованием так называемых PendingIntent в приложениях для Android.
Интенты (Intent) - одна из ключевых идей Android. Интенты позволяют пересылать сообщения между различными компнентами приложений и системных сервисов с целью вызывать определенное действие. Запуск приложений, открытие ссылок, инициации звонков и многое другое в Android выполняется с помощью интентов.
Поверх интентов построен другой механизм - отложенные интенты (Peding intent). Он позволяет передать интент другому приложению или компоненту системы, чтобы то могло отправить интент от имени передавшего его приложения.
Проблема отложенных интентов только в том, что записанный в них интент в ряде случаев можно изменить (это можно сделать если не установлен флаг FLAG_IMMUTABLE) и в итоге выполнить произвольное действие от имени передавшего pending intent приложения.
Отложенные интенты чаще всего используются в следующих компонентах:
1. Уведомления. Чтобы перехватить их мы можем создать NotificationListenerService, который будет слушать все уведомления приложений и извлекать из них отложенные интенты.
2. SliceProvider. Этот механизм используется для встраивания частей приложения в другие приложения, например, встраивания переключателя быстрых настроек в окно ассистента. Мы можем получить слайс с помощью класса SliceViewManager или ContentResolver и затем получить peding intent всех слайсов.
3. MediaBrawserService. Механизм, позволяющий приложению дать доступ к своей медиатеке с возможностью включить проигрывание медиафайлов. Получить pending intent можно подключившись к приложению с помощью класса MediaBrowser.
4. Виджеты рабочего стола используют отложенные интенты в качестве действий при нажатии на свои элементы. Класс AppWidgetHost позволяет приложению прикинуться лаунчером и получить доступ к виджетам приложений. Далее pending intent можно извлечь из самого виджета.
В качестве примера уязвимости в одном из этих компонентов приведем CVE-2020-0188. Это уязвимость в SliceProvider'е стандартных настроек Android. Благодаря тому, что peinding intent был открыт для изменения, его можно было вытащить с помощью `ContentResolver`а затем изменить так, чтобы прочитать приватные файлы приложения "Настройки":
Intent hijackIntent = new Intent();
hijackIntent.setPackage(getPackageName());
hijackIntent.setDataAndType(Uri.parse("content://com.android.settings.files/my_cache/NOTICE.html"), "txt/html");
hijackIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
pi.send(getApplicationContext(), 0, hijackIntent, null, null);
По сути этот код заставляет приложение "Настройки" передать ссылку на свой внутренний файл с правами на чтение и запись приложению-эксплойту. Остается только принять интент и можно делать с файлом все, что угодно.
Рекомендации разработчикам:
* По возможности указывай флаг FLAG_IMMUTABLE при создании pending intent;
* При необходимости использовать модифицируемый pending intent, используй явный интент и заполняй поле ComponetName. В этом случае злоумышленник не сможет перенаправить интент;
* Используй утилиту PendingIntentScan для сканирования приложения на наличие модифицируемых pending intent;
142 views07:25