Категория OWASP: MASVS-PLATFORM: Взаимодействие платформ
Обзор
Неправильно реализованные широковещательные приемники могут позволить злоумышленнику отправить вредоносное намерение, чтобы заставить уязвимое приложение выполнять действия, не предназначенные для внешних абонентов.
Уязвимость обычно относится к случаям, когда широковещательный приемник непреднамеренно экспортируется, либо путем установки параметра android:exported="true" в AndroidManifest, либо путем программного создания широковещательного приемника, который по умолчанию становится общедоступным. Если приемник не содержит никаких фильтров намерений, значение по умолчанию равно "false" , но если приемник содержит хотя бы один фильтр намерений, значение по умолчанию для android:exported равно "true" .
Преднамеренно экспортированные широковещательные приемники без надлежащего контроля доступа могут быть использованы не по назначению, если разработчик не предполагал, что они будут вызываться всеми приложениями.
Влияние
Небезопасно реализованные широковещательные приемники могут быть использованы злоумышленниками для получения несанкционированного доступа к выполнению действий в приложении, которые разработчик не предполагал предоставлять третьим лицам.
Меры по смягчению последствий
Полностью избегайте этой проблемы.
Чтобы полностью разрешить эту дилемму, установите exported в false :
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
Используйте вызовы и обратные вызовы.
Если вы использовали широковещательные приемники для внутренних целей приложения (например, для уведомления о завершении события), вы можете перестроить свой код таким образом, чтобы передавать функцию обратного вызова, которая будет срабатывать после завершения события.
слушатель завершения события
Котлин
interface EventCompletionListener {
fun onEventComplete(data: String)
}
Java
public interface EventCompletionListener {
public void onEventComplete(String data);
}
Безопасная задача
Котлин
class SecureTask(private val listener: EventCompletionListener?) {
fun executeTask() {
// Do some work...
// Notify that the event is complete
listener?.onEventComplete("Some secure data")
}
}
Java
public class SecureTask {
final private EventCompletionListener listener;
public SecureTask(EventCompletionListener listener) {
this.listener = listener;
}
public void executeTask() {
// Do some work...
// Notify that the event is complete
if (listener != null) {
listener.onEventComplete("Some secure data");
}
}
}
Основная деятельность
Котлин
class MainActivity : AppCompatActivity(), EventCompletionListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val secureTask = SecureTask(this)
secureTask.executeTask()
}
override fun onEventComplete(data: String) {
// Handle event completion securely
// ...
}
}
Java
public class MainActivity extends AppCompatActivity implements EventCompletionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SecureTask secureTask = new SecureTask(this);
secureTask.executeTask();
}
@Override
public void onEventComplete(String data) {
// Handle event completion securely
// ...
}
}
Защищенные приемники вещания с правами доступа
Регистрировать динамические приемники следует только для защищенных широковещательных сообщений (сообщений, которые могут отправлять только приложения системного уровня) или с самостоятельно заданными правами доступа на уровне подписи .
Ресурсы
- Экспортированные элементы приемника
- Документация по разрешениям широковещательного приемника
- Защищенные намерения трансляции