Привилегированные приложения — это системные приложения, расположенные в каталоге priv-app
на разделе образа системы. Для версий Android используются следующие разделы:
- Android 9 и выше:
/system, /product, /vendor
- Android 8.1 и ниже:
/system
Традиционно производители устройств практически не имели контроля над тем, какие разрешения на подпись и привилегированные разрешения могут предоставляться привилегированным приложениям. Начиная с Android 8.0, производители могут явно предоставлять привилегированные разрешения в XML-файлах конфигурации системы в каталоге /etc/permissions
. Начиная с Android 9, разработчики могут явно предоставлять или запрещать все привилегированные разрешения. Если привилегированные разрешения не предоставлены, устройство не загрузится.
Файл privapp-permissions.xml
может предоставлять или отклонять разрешения только для привилегированных приложений в том же разделе. Например, если приложение в разделе /product
запрашивает привилегированные разрешения, запрос может быть предоставлен или отклонен только файлом privapp-permissions.xml
в разделе /product
.
Добавить белый список
Списки разрешений для приложений могут быть перечислены в одном XML-файле или в нескольких XML-файлах, расположенных в каталоге /etc/permissions
:
-
/etc/permissions/privapp-permissions- OEM_NAME .xml
-
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
Строгих правил организации контента не существует. Разработчики устройств могут определять структуру контента, если все приложения из /system/priv-app
внесены в разрешённый список. Например, Google разработала единый разрешённый список для всех привилегированных приложений. Мы рекомендуем следующую организацию:
- Разрешения для приложений, уже включенных в дерево Android Open Source Project (AOSP), перечислены в файле
/etc/permissions/privapp-permissions-platform.xml
. - Для других приложений используйте файлы вида
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
.
Настроить белый список
AOSP включает реализацию белого списка, которую можно настраивать по мере необходимости.
Если разрешение необходимо отклонить, отредактируйте XML-код, используя тег deny-permission
вместо тега permission
. Например:
<!-- This XML file declares which signature|privileged permissions to grant to privileged apps that come with the platform --> <permissions> <privapp-permissions package="com.android.backupconfirm"> <permission name="android.permission.BACKUP"/> <permission name="android.permission.CRYPT_KEEPER"/> </privapp-permissions> <privapp-permissions package="com.android.cellbroadcastreceiver"> <!-- Don't allow the application to interact across users --> <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.MODIFY_PHONE_STATE"/> <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/> </privapp-permissions> ...
Найти недостающие разрешения
Чтобы найти отсутствующие разрешения при запуске нового устройства, включите переходный режим журнала:
ro.control_privapp_permissions=log
Нарушения регистрируются в файле журнала. Предоставляются непривилегированные разрешения. Это гарантирует работоспособность устройства и одновременное предоставление списка нарушений. Формат сообщения об ошибке следующий:
PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist
Все нарушения должны быть устранены путем добавления недостающих разрешений в соответствующие списки разрешений. Обратите внимание, что:
- В Android 9 и более поздних версиях нарушение привилегированных разрешений препятствует запуску устройства. Вместо этого необходимо явно разрешить или запретить все привилегированные разрешения.
- В Android 8.0 и ниже отсутствующие разрешения не предоставляются затронутым приложениям, несмотря на то, что они находятся в пути
priv-app
.
Обеспечить соблюдение белого списка
После создания списков разрешений включите принудительное выполнение, установив свойство сборки ro.control_privapp_permissions=enforce
.
Добавление в разрешённый список требуется только для разрешений, объявленных приложениями с package="android"
. Состояние свойства ro.control_privapp_permissions
должно соответствовать разделу 9.1 «Разрешения» в документе определения совместимости (CDD).