Прикрепленные трансляции

Категория OWASP: MASVS-PLATFORM: Взаимодействие платформ

Обзор

Приложения Android и система Android могут использовать широковещательные сообщения (broadcasts) в качестве системы обмена сообщениями для уведомления других приложений о событиях, которые могут их заинтересовать. «Липкие» широковещательные сообщения — это особый тип широковещательных сообщений, при котором отправленный объект(ы) намерения остается в кэше после завершения широковещательной рассылки. Система может повторно рассылать «липкие» намерения последующим зарегистрированным получателям. К сожалению, API «липких» широковещательных сообщений имеет ряд недостатков, связанных с безопасностью, поэтому он был объявлен устаревшим в Android 5.0 (уровень API 21).

Любой может получить доступ к "липким" трансляциям.

«Привязанные» широковещательные сообщения не могут быть ограничены получателями, обладающими определенными правами доступа. Поэтому они не подходят для трансляции конфиденциальной информации. Может показаться, что указание имени пакета приложения в Intent широковещательного сообщения ограничивает набор BroadcastReceivers :

Котлин

val intent = Intent("com.example.NOTIFY").apply {
    setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)

Java

Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);

В приведенном примере только получатели в пакете com.example.myapp получают интент при отправке широковещательного сообщения. Однако фильтр по имени пакета не применяется при повторной рассылке интента из «липкого» кэша. При регистрации получателя с помощью метода registerReceiver() все интенты в «липком» кэше, соответствующие указанному фильтру, повторно рассылаются получателю независимо от имени пакета, в котором находится получатель.

Любой может отправлять "липкие" трансляции.

Для отправки «липких» широковещательных сообщений приложению требуется только разрешение android.permission.BROADCAST_STICKY , которое предоставляется автоматически при установке приложения. Таким образом, злоумышленники могут отправлять любые намерения любому получателю, потенциально получая несанкционированный доступ к другому приложению. Получатели широковещательных сообщений могут ограничивать отправителей только теми, кто обладает определенными разрешениями. Однако, сделав это, получатель не сможет получать широковещательные сообщения из «липкого» кэша, поскольку они отправляются не в контексте идентификации какого-либо приложения и не транслируются с какими-либо разрешениями.

Любой может изменить функцию "липких" трансляций.

Когда намерение является частью «липкой» рассылки, оно заменяет любой предыдущий экземпляр, имеющий то же действие, данные, тип, идентификатор, класс и категории в «липком» кэше. Таким образом, злоумышленник может легко перезаписать дополнительные данные в «липком» намерении из легитимного приложения, которое затем может быть повторно разослано другим получателям.

Широковещательные сообщения, отправляемые с помощью метода sendStickyOrderedBroadcast() доставляются только одному получателю за раз, чтобы получатели с более высоким приоритетом могли обработать сообщение до того, как оно будет доставлено получателям с более низким приоритетом. По мере выполнения каждого получателя, он может передать результат следующему получателю, например, вызвав setResultData() , или прервать широковещательную рассылку , предотвращая получение сообщения последующими получателями. Злоумышленник, способный получать широковещательные сообщения с «липким» приоритетом от легитимного приложения, может создать получателя с высоким приоритетом, чтобы изменить данные результата широковещательной рассылки или полностью отбросить сообщения.

Влияние

Последствия зависят от способа использования «липких» широковещательных рассылок и от того, какие данные передаются получателям. В целом, использование «липких» широковещательных рассылок может привести к утечке конфиденциальных данных, их фальсификации, несанкционированному доступу для выполнения действий в другом приложении и отказу в обслуживании.

Меры по смягчению последствий

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

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

Более подробную информацию о защите трансляций можно найти на странице обзора трансляций .