Привилегированные приложения - это системные приложения, которые находятся в priv-app
на одном из разделов образа системы. Разделы, используемые для выпусков Android:
- Android 8.1 и ниже -
/system
- Android 9 и выше -
/system, /product, /vendor
На этой странице /etc/permissions/priv-app
в partition /etc/permissions/priv-app
.
Исторически сложилось так, что производители устройств не имели большого контроля над тем, какие привилегированные разрешения подписи могут быть предоставлены привилегированным приложениям. Начиная с Android 8.0 производители должны явно предоставлять привилегированные разрешения в файлах XML конфигурации системы в каталоге /etc/permissions
. Начиная с Android 9, разработчики должны явно предоставить или отклонить все привилегированные разрешения, иначе устройство не загрузится.
privapp-permissions.xml
может предоставлять или запрещать разрешения только для привилегированных приложений в том же разделе. Например, если приложение в разделе /vendor
запрашивает привилегированные разрешения, запрос может быть предоставлен или отклонен только privapp-permissions.xml
который также находится в /vendor
.
Добавление списков разрешений
Списки разрешений для приложений могут быть перечислены в одном XML или в нескольких файлах XML, расположенных в каталоге frameworks/base/etc/permissions
как показано ниже:
-
/etc/permissions/privapp-permissions- OEM_NAME .xml
-
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
Не существует строгих правил организации контента. /system/priv-app
устройств могут определять структуру контента, если все приложения из /system/priv-app
разрешены. Например, Google имеет единый список разрешений для всех привилегированных приложений, разработанных Google, и рекомендует следующую организацию:
- Разрешения для приложений, которые уже включены в дерево Android Open Source Project (AOSP), перечислены в
/etc/permissions/privapp-permissions-platform.xml
. - Разрешения для приложений Google перечислены в
/etc/permissions/privapp-permissions-google.xml
. - Для других приложений используйте файлы формы:
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
.
Создание списков разрешений
Чтобы автоматически создать список разрешений для всех приложений, доступных в образе системы, используйте инструмент командной строки AOSP по адресу development/tools/privapp_permissions/privapp_permissions.py
. Чтобы создать начальную версию privapp-permissions.xml
конкретного privapp-permissions.xml
:
- Создайте образ системы:
. build/envsetup.sh
lunch PRODUCT_NAME
make -j
- Запустите сценарий
privapp_permissions.py
чтобы сгенерировать файлprivapp-permissions.xml
котором перечислены все подписи | привилегированные разрешения, необходимые для включения в список:development/tools/privapp_permissions/privapp_permissions.py
Этот инструмент печатает XML-контент, который можно использовать как один файл или разделить на несколько файлов/etc/permissions
путь к каталогу. Если устройство уже включает списки/etc/permissions
каталогах/etc/permissions
, инструмент выводит только различия (например, отсутствующую подпись | привилегированные разрешения, которые необходимо добавить в список разрешений). Это также полезно для целей аудита: при добавлении новой версии приложения инструмент обнаруживает необходимые дополнительные разрешения. - Скопируйте сгенерированные файлы в соответствующий каталог
/etc/permissions
, откуда система считывает файлы во время загрузки.
Настройка списков разрешений
AOSP включает реализацию списка разрешений, который можно настроить по мере необходимости. Разрешения для приложений, включенных в AOSP, уже перечислены в /etc/permissions/privapp-permissions-platform.xml
.
По умолчанию сценарий privapp_permissions.py
генерирует вывод, который автоматически предоставляет любые разрешения, запрошенные привилегированным приложением. Если есть разрешения, которые следует запретить, отредактируйте XML, чтобы использовать тег «deny-permission» вместо тега «permission». Пример:
<!-- This XML file declares which signature|privileged permissions should be granted 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 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 8.0 и ниже затронутым приложениям не предоставляются недостающие разрешения, даже если они находятся в пути
priv-app
. - На Android 9 и выше нарушение ( привилегированных разрешений) означает, что устройство не загружается . Вы должны явно разрешить или запретить все привилегированные разрешения
Применение списков разрешений
После создания списков разрешений включите принудительное исполнение во время выполнения, установив свойство сборки ro.control_privapp_permissions=enforce
.