Белый список привилегированных разрешений

Привилегированные приложения – это системные приложения, расположенные в каталоге 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).