Управление доступом на основе разрешений к экспортированным компонентам

Категория OWASP: MASVS-ПЛАТФОРМА: Взаимодействие платформы

Обзор

Разрешение Android — это строковый идентификатор, объявленный в манифесте приложения для запроса доступа к ограниченным данным или действиям, применяемый во время выполнения платформой Android.

Уровни разрешений Android указывают на потенциальный риск, связанный с разрешением:

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

Уязвимости, связанные с контролем доступа на основе разрешений, возникают, когда компонент приложения (например, активность , приемник , поставщик контента или служба ) соответствует всем следующим критериям:

  • Компонент не связан ни с каким android:permission в Manifest ;
  • Компонент выполняет конфиденциальную задачу, для которой существует разрешение, уже одобренное пользователем;
  • Компонент экспортируется;
  • Компонент не выполняет никаких проверок разрешений вручную (на уровне манифеста или кода);

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

Влияние

Экспорт уязвимых компонентов можно использовать для получения доступа к конфиденциальным ресурсам или выполнения конфиденциальных действий. Влияние этого нежелательного поведения зависит от контекста уязвимого компонента и его привилегий.

Смягчения

Требовать разрешения для конфиденциальных задач

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

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

<manifest ...>
   
<uses-permission android:name="android.permission.READ_CONTACTS" />

   
<application ...>
       
<service android:name=".MyExportService"
                 
android:exported="true"
                 
android:permission="android.permission.READ_CONTACTS" />

       
</application>
</manifest>
class MyExportService : Service() {

   
private val binder = MyExportBinder()

   
override fun onBind(intent: Intent): IBinder? {
       
// Enforce calling app has the required permission
        enforceCallingPermission
(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.")
       
// Permission is enforced, proceed with export logic
       
return binder
   
}

   
// Inner class for your Binder implementation
   
private inner class MyExportBinder : Binder() {
       
// Permission is enforced, proceed with export logic
   
}
}
public class MyExportService extends Service {

   
@Override
   
public IBinder onBind(Intent intent) {
       
// Enforce calling app has the required permission
        enforceCallingPermission
(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.");

       
return binder;

   
}

   
// Inner class for your Binder implementation
   
private class MyExportBinder extends Binder {
       
// Permission is enforced, proceed with export logic

   
}
}

Не экспортируйте компонент

Избегайте экспорта компонентов с доступом к конфиденциальным ресурсам без крайней необходимости. Этого можно добиться, установив для параметра android:exported в файле Manifest значение false для вашего компонента. Начиная с уровня API 31 и выше, для этого атрибута по умолчанию установлено значение false .

XML
<activity
   
android:name=".MyActivity"
   
android:exported="false"/>

Применение разрешений на основе подписи

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

XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   
package="com.example.myapp">
   
<permission android:name="my_custom_permission_name"
               
android:protectionLevel="signature" />

Однозадачные конечные точки

Реализуйте свое приложение, следуя принципу разделения ответственности . Каждая конечная точка должна выполнять только небольшой набор конкретных задач с определенными привилегиями. Эта передовая практика проектирования также позволяет разработчику применять детальные разрешения для каждой конечной точки. Например, избегайте создания одной конечной точки, которая обслуживает и календарь, и контакты.

Ресурсы