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

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

Обзор

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

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

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

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

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

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

Влияние

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

Смягчения

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

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

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

XML

<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" />

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

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

Ресурсы