Категория 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" />
Однозадачные конечные точки
Реализуйте свое приложение, следуя принципу разделения ответственности . Каждая конечная точка должна выполнять только небольшой набор конкретных задач с определенными привилегиями. Эта передовая практика проектирования также позволяет разработчику применять детальные разрешения для каждой конечной точки. Например, избегайте создания одной конечной точки, которая обслуживает и календарь, и контакты.
Ресурсы
- Доступ Android к компонентам, защищенным приложениями, из блога Oversecured
- Лучшие практики контент-провайдеров
- Разрешения среды выполнения (опасные)
- Принцип разделения ответственности
- Документация по разрешениям Android
- Советы по безопасности приемников вещания Android
- Советы по безопасности служб Android
- Android 12 (API 31) для экспорта по умолчанию установлено значение «false».
- Проверка ворса: экспортированный PreferenceActivity не следует экспортировать
- Проверка на ворс: экспортированному приемнику не требуется разрешение
- Lint Check: экспортированная служба не требует разрешения
Категория 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" />
Однозадачные конечные точки
Реализуйте свое приложение, следуя принципу разделения ответственности . Каждая конечная точка должна выполнять только небольшой набор конкретных задач с определенными привилегиями. Эта передовая практика проектирования также позволяет разработчику применять детальные разрешения для каждой конечной точки. Например, избегайте создания одной конечной точки, которая обслуживает и календарь, и контакты.
Ресурсы
- Доступ Android к компонентам, защищенным приложениями, из блога Oversecured
- Лучшие практики контент-провайдеров
- Разрешения среды выполнения (опасные)
- Принцип разделения ответственности
- Документация по разрешениям Android
- Советы по безопасности приемников вещания Android
- Советы по безопасности служб Android
- Android 12 (API 31) для экспорта по умолчанию установлено значение «false».
- Проверка ворса: экспортированный PreferenceActivity не следует экспортировать
- Проверка на ворс: экспортированному приемнику не требуется разрешение
- Lint Check: экспортированная служба не требует разрешения