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

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