Lista de permissões privilegiadas

Os apps privilegiados são apps do sistema localizados em um diretório priv-app em uma partição de imagem do sistema. As partições usadas para lançamentos do Android são:

  • Android 9 e versões mais recentes: /system, /product, /vendor
  • Android 8.1 e versões anteriores: /system

Historicamente, os fabricantes de dispositivos tinham pouco controle sobre quais permissões signature | privileged podiam ser concedidas a apps privilegiados. A partir do Android 8.0, os fabricantes podem conceder permissões privilegiadas explicitamente nos arquivos XML de configuração do sistema no diretório /etc/permissions. No Android 9 e versões mais recentes, os implementadores podem conceder ou negar explicitamente todas as permissões privilegiadas. Se as permissões privilegiadas não forem concedidas, o dispositivo não será inicializado.

O arquivo privapp-permissions.xml só pode conceder ou negar permissões para apps privilegiados na mesma partição. Por exemplo, se um app na partição /product solicitar permissões privilegiadas, a solicitação só poderá ser concedida ou negada por um arquivo privapp-permissions.xml em /product.

Adicionar uma lista de permissões

As permissões de permissões para apps podem ser listadas em um único arquivo XML ou em vários arquivos XML localizados no diretório frameworks/base/etc/permissions:

  • /etc/permissions/privapp-permissions-OEM_NAME.xml
  • /etc/permissions/privapp-permissions-DEVICE_NAME.xml

Não há regras rígidas sobre a organização do conteúdo. Os implementadores de dispositivos podem determinar a estrutura do conteúdo, desde que todos os apps de /system/priv-app estejam na lista de permissões. Por exemplo, o Google desenvolveu uma única lista de permissões para todos os apps privilegiados. Recomendamos a seguinte organização:

  • As permissões para apps já incluídos na árvore do Android Open Source Project (AOSP) estão listadas em /etc/permissions/privapp-permissions-platform.xml.
  • Para outros apps, use arquivos do tipo /etc/permissions/privapp-permissions-DEVICE_NAME.xml.

Personalizar uma lista de permissões

O AOSP inclui uma implementação de lista de permissões que pode ser personalizada conforme necessário.

Se uma permissão precisar ser negada, edite o XML para usar uma tag deny-permission em vez de uma tag permission. Exemplo:

<!-- 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>
    ...

Encontrar permissões ausentes

Para encontrar permissões ausentes ao iniciar um novo dispositivo, ative o modo de registro de transição:

ro.control_privapp_permissions=log

As violações são informadas no arquivo de registro. Permissões sem privilégios são concedidas. Isso garante que o dispositivo permaneça em um estado funcional, além de fornecer a lista de violações. O formato da mensagem de erro é o seguinte:

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist

Todas as violações precisam ser resolvidas adicionando as permissões ausentes às listas de permissões adequadas. Observe que:

  • No Android 9 e versões mais recentes, as violações de permissões privilegiadas impedem a inicialização do dispositivo. Em vez disso, você precisa permitir ou negar explicitamente todas as permissões privilegiadas.
  • No Android 8.0 e versões anteriores, as permissões ausentes não são concedidas aos apps afetados, mesmo estando no caminho priv-app.

Ativar uma lista de permissões

Depois de criar as listas de permissões, ative a aplicação no momento de execução definindo a propriedade ro.control_privapp_permissions=enforce do build.

A lista de permissões permitidas é necessária apenas para permissões declaradas por apps com package="android". O estado da propriedade ro.control_privapp_permissions precisa obedecer à seção 9.1 Permissões no documento de definição de compatibilidade (CDD).