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:
- Construir uma imagem do sistema:
. build/envsetup.sh
lunch PRODUCT_NAME
make -j
- Execute o script
privapp_permissions.py
para gerar um arquivoprivapp-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. - 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
.