Привилегированные приложения – это системные приложения, расположенные в каталоге priv-app в разделе образа системы. Для релизов Android используются следующие разделы:
- Android 9 и более поздних версий:
/system, /product, /vendor - Android 8.1 и более ранних версий:
/system
Раньше производители устройств не могли контролировать, какие разрешения signature | privileged предоставляются приложениям с расширенными правами. Начиная с Android 8.0 производители могут явно предоставлять привилегированные разрешения в XML-файлах конфигурации системы в каталоге /etc/permissions. Начиная с Android 9, разработчики могут явно предоставлять или запрещать все привилегированные разрешения. Если привилегированные разрешения не предоставлены, устройство не загрузится.
Файл privapp-permissions.xml может предоставлять или отзывать разрешения только для приложений с особыми правами, находящихся в том же разделе. Например, если приложение в разделе /product запрашивает привилегированные разрешения, запрос может быть одобрен или отклонен только файлом privapp-permissions.xml в разделе /product.
Как добавить белый список
Белые списки разрешений для приложений можно указать в одном или нескольких 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 значение true.
Добавление в белый список требуется только для разрешений, заявленных приложениями с package="android". Состояние свойства ro.control_privapp_permissions должно соответствовать разделу 9.1 "Разрешения" в документе определения совместимости (CDD).