Lista de permissões de permissão privilegiada

Aplicativos privilegiados são aplicativos do sistema que estão localizados em um diretório priv-app em uma das partições de imagem do sistema. As partições usadas para versões do Android são

  • Android 8.1 e inferior - /system
  • Android 9 e superior - /system, /product, /vendor

Ao longo desta página, /etc/permissions/priv-app resolve partition /etc/permissions/priv-app .

Historicamente, os fabricantes de dispositivos tinham pouco controle sobre quais permissões privilegiadas de assinatura poderiam ser concedidas a aplicativos privilegiados. A partir do Android 8.0, os fabricantes devem conceder explicitamente permissões privilegiadas nos arquivos XML de configuração do sistema no diretório /etc/permissions . A partir do Android 9, os implementadores devem conceder ou negar explicitamente todas as permissões privilegiadas ou o dispositivo não inicializará.

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

Adicionando listas de permissões

As listas de permissões de aplicativos podem ser listadas em um único XML ou em vários arquivos XML localizados no diretório frameworks/base/etc/permissions da seguinte forma:

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

Não existe uma regra estrita para organizar o conteúdo. Os implementadores de dispositivos podem determinar a estrutura do conteúdo, desde que todos os aplicativos de /system/priv-app estejam na lista de permissões. Por exemplo, o Google tem uma única lista de permissões para todos os aplicativos privilegiados desenvolvidos pelo Google e recomenda a seguinte organização:

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

Gerando listas de permissões

Para gerar automaticamente uma lista de permissões para todos os aplicativos disponíveis na imagem do sistema, use a ferramenta de linha de comando AOSP em development/tools/privapp_permissions/privapp_permissions.py . Para gerar uma versão inicial de privapp-permissions.xml específico do dispositivo:

  1. Construir uma imagem do sistema:
        . build/envsetup.sh
        lunch PRODUCT_NAME
        make -j
  2. Execute o script privapp_permissions.py para gerar um arquivo privapp-permissions.xml que lista todas as permissões de assinatura|privilegiadas necessárias para serem permitidas:
    development/tools/privapp_permissions/privapp_permissions.py
    Esta ferramenta imprime conteúdo XML que pode ser usado como um único arquivo ou dividido em vários arquivos no caminho do diretório /etc/permissions . Se o dispositivo já inclui listas de permissões nos diretórios /etc/permissions , a ferramenta apenas imprime as diferenças (como a assinatura ausente|permissões privilegiadas que você precisa adicionar à lista de permissões). Isso também é útil para fins de auditoria: quando uma nova versão do aplicativo é adicionada, a ferramenta detecta as permissões adicionais necessárias.
  3. Copie os arquivos gerados para o diretório /etc/permissions apropriado, onde o sistema lê os arquivos durante a inicialização.

Personalizando listas de permissões

O AOSP inclui uma implementação de lista de permissões que pode ser personalizada conforme necessário. As permissões para aplicativos incluídos no AOSP já estão na lista de permissões em /etc/permissions/privapp-permissions-platform.xml .

Por padrão, o script privapp_permissions.py gera uma saída que concede automaticamente qualquer permissão solicitada por um aplicativo privilegiado. Se houver permissões que devam ser negadas, 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>
    ...

Encontrando permissões ausentes

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

ro.control_privapp_permissions=log

As violações são relatadas no arquivo de log, mas as permissões sem privilégios ainda são concedidas. Isso mantém o dispositivo em estado de funcionamento enquanto fornece a lista de violações. Este é o formato da mensagem de erro:

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

Todas as violações devem ser tratadas adicionando as permissões ausentes às listas de permissões apropriadas.

  • No Android 8.0 e inferior, os aplicativos afetados não recebem as permissões ausentes, mesmo que estejam no caminho priv-app .
  • No Android 9 e superior, violações (de permissões privilegiadas ) significam que o dispositivo não inicializa . Você deve permitir ou negar explicitamente todas as permissões privilegiadas

Como aplicar listas de permissões

Depois que as listas de permissões estiverem em vigor, habilite a imposição de tempo de execução definindo a propriedade de compilação ro.control_privapp_permissions=enforce .