Категория OWASP: MASVS-ПЛАТФОРМА: Взаимодействие платформы
Обзор
Неправильно реализованные широковещательные приемники могут позволить злоумышленнику отправить злонамеренное намерение заставить уязвимое приложение выполнить действия, не предназначенные для внешних вызывающих абонентов.
Уязвимость обычно относится к случаям, когда приемник вещания непреднамеренно экспортируется либо путем установки 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)
}
Ява
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")
}
}
Ява
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
// ...
}
}
Ява
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
// ...
}
}
Защищайте приемники вещания с помощью разрешений
Регистрируйте динамические приемники только для защищенных широковещательных рассылок (вещательных рассылок, которые могут отправлять только приложения системного уровня) или с самопровозглашенными разрешениями уровня подписи .
Ресурсы
- Экспортированные элементы приемника
- Документация по разрешениям широковещательного приемника
- Намерения защищенной трансляции