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

Возможность посылки произвольного широковещательного сообщения через Intent

Описание

Приложение может послать широковещательное сообщение (Broadcast) с помощью Intent. Широковещательные сообщения в Android используются для оповещения других приложений или компонентов о том, что произошло определенное событие. Пример кода для отправки Broadcast с использованием Intent:

Intent intent = new Intent("app.package.SOME_ACTION");
sendBroadcast(intent);

В этом примере создается Intent с определенным действием и отправляется всем приложениям, которые зарегистрированы для обработки данного действия. Проблема возникает, когда данные, используемые для создания Intent, поступают из ненадежных источников.

Проблема

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

Пример кода с уязвимостью:

Intent incomingIntent = getIntent();
String action = incomingIntent.getStringExtra("action");

if (action != null) {
    Intent broadcastIntent = new Intent(action);
    sendBroadcast(broadcastIntent);
}

В этом примере злоумышленник может передать произвольное значение action через Intent, что приведет к отправке широковещательного сообщения, которое может запустить различные компоненты других приложений или системные службы.

Причина проблемы

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

  1. Неожиданному запуску компонентов — Злоумышленник может инициировать запуск определенных компонентов, что может нарушить нормальное функционирование системы или приложений.
  2. Уязвимости безопасности — Отправка неконтролируемого Broadcast может позволить злоумышленнику инициировать события, которые приведут к сбоям или утечке информации.
  3. DoS-атакам — Злоумышленник может посылать частые Broadcast, что создаст нагрузку на систему и вызовет замедление работы устройства.

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

  1. Не используйте внешние данные для создания Intent при отправке Broadcast: При формировании Intent для отправки Broadcast избегайте использования данных, полученных из внешних источников. Доверять значениям, переданным через Intent, небезопасно.

  2. Используйте заранее определенные действия: Вместо передачи значений действий (action) из входящих данных, используйте заранее определенные действия, которые безопасны в рамках вашего приложения. Пример безопасного подхода:

    int actionIndex = incomingIntent.getIntExtra("action_index", -1);
    if (actionIndex >= 0) {
        Intent broadcastIntent = new Intent();
        switch (actionIndex) {
            case 0:
                broadcastIntent.setAction("app.package.SOME_SAFE_ACTION");
                break;
            case 1:
                broadcastIntent.setAction("app.package.OTHER_SAFE_ACTION");
                break;
            // Другие варианты действий
        }
        sendBroadcast(broadcastIntent);
    }
    

    В этом примере используется индекс для выбора действия, что предотвращает возможность передачи произвольных значений.

  3. Используйте ограниченные Broadcast: Вместо использования открытых Broadcast, используйте LocalBroadcastManager для отправки сообщений внутри вашего приложения. Это исключает возможность того, что широковещательное сообщение будет перехвачено сторонним приложением:

    LocalBroadcastManager.getInstance(context).sendBroadcast(broadcastIntent);
    

    LocalBroadcastManager позволяет отправлять сообщения, которые могут быть получены только компонентами внутри вашего приложения, что делает передачу сообщений безопаснее.

  4. Проверяйте данные перед использованием: Прежде чем использовать какие-либо данные для формирования Intent, всегда проверяйте их корректность и достоверность. Если возможно, используйте белые списки (whitelist) для разрешенных значений, чтобы предотвратить использование произвольных данных.

Дополнительные примеры

Неправильное использование внешних данных для отправки Broadcast:

public void sendCustomBroadcast(String action) {
    try {
        Intent intent = new Intent(action);
        sendBroadcast(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Без проверки данных action, этот код позволяет злоумышленнику отправить произвольное широковещательное сообщение, что может привести к потенциальной угрозе безопасности.

Ссылки

  1. О Broadcast
  2. Описание Intent
  3. Безопасное использование Broadcast
  4. LocalBroadcastManager
  5. Android Security Checklist
К началу