Привилегированные приложения — это системные приложения, расположенные в каталоге 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-файлах, расположенных в каталоге frameworks/base/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).