Перейти к содержанию

Данные из сторонних источников формируют Intent

Класс

| ThirdpartyDataLaunchIntentIssue

Модуль

| Santaint (Marivanna)

Описание

В операционной системе Android приложение может получать данные из различных источников: пользовательский ввод, чтение бэкапа, Intents, данные других приложений и т.п.

Данные из сторонних источников могут привести к формированию Intent со зловредными данными.

Пример источников данных: данные из getIntent() внутри Activity, Service, ContentProvider, BroadcastReceiver, пользовательский ввод, чтение файлов и другие внешние источники.

Пример получателей данных: запуск компонента (например, Activity) сформированным Интентом.

Пример:

Если требуется запустить приватную WebViewActivity, внутри приложения может формироваться Intent, в который передается некоторая строка:

Intent.putExtra("url", someUrl);

Переменная someUrl может получать свое значение из внешних источников (пользовательский ввод, данные из deepLink или просто данные из экстра-параметров Intent), и если WebViewActivity без проверки извлекает значение из Intent по ключу "url", и подставляет, например, в WebView, то возникает уязвимость.

Проблема

При создании Intent на запуск приватного компонента, приложение может использовать данные из неконтролируемых внешних источников, что приведёт к непредсказуемому поведению компонента.

Рекомендации

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

Пример:

Если WebViewActivity, из примера выше, должна отображать только страницы [https://app.host.p1, https://app.host.p2, https://app.host.p3], то вместо прямой передачи строкового значения нужной страницы в Intent, следует передавать числовое (или любое другое) значение, сопоставленное нужной странице, а сам массив страниц загружать из другого источника или вообще сделать статичным.

Ссылки

  1. Описание Intent
К началу