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