MASTG-KNOW-0017: Permissões de Aplicativo
O Android atribui uma identidade de sistema distinta (ID de usuário Linux e ID de grupo) a cada aplicativo instalado. Como cada aplicativo Android opera em um sandbox de processo, os aplicativos devem solicitar explicitamente acesso a recursos e dados que estão fora de seu sandbox. Eles solicitam esse acesso declarando as permissões necessárias para usar dados e recursos do sistema. Dependendo do quão sensíveis ou críticos são os dados ou recursos, o sistema Android concederá a permissão automaticamente ou solicitará que o usuário aprove a solicitação.
Para melhorar a privacidade do usuário e mitigar riscos de privacidade, é crucial que os aplicativos Android minimizem as solicitações de permissão e solicitem acesso a informações sensíveis apenas quando estritamente necessário. A documentação para desenvolvedores Android oferece insights valiosos e melhores práticas para ajudar os aplicativos a alcançar o mesmo nível de funcionalidade sem exigir acesso direto a recursos sensíveis:
- Minimize suas solicitações de permissão
- Melhores práticas de permissões de aplicativo
- Permissões e APIs que acessam informações sensíveis
As permissões do Android podem ser classificadas em categorias distintas dependendo da extensão do acesso a dados restritos e ações permitidas que concedem a um aplicativo. Esta classificação inclui o chamado "Nível de Proteção" conforme mostrado na página de referência da API de permissões e Definições de Código-Fonte do AndroidManifest.xml.
- Permissões no momento da instalação: concedem acesso limitado a dados restritos ou permitem que o aplicativo execute ações restritas que afetam minimamente o sistema ou outros aplicativos. Elas são concedidas automaticamente no momento da instalação (Android 6.0 (API nível 23) ou superior).
- Nível de Proteção:
normal. Concede aos aplicativos acesso a funcionalidades isoladas em nível de aplicativo com risco mínimo para outros aplicativos, o usuário e o sistema. Exemplo:android.permission.INTERNET - Nível de Proteção:
signature. Concedida apenas a aplicativos assinados com o mesmo certificado usado para assinar o aplicativo declarante. Exemplo:android.permission.ACCESS_MOCK_LOCATION - Nível de Proteção:
signatureOrSystem. Reservada para aplicativos incorporados ao sistema ou aqueles assinados com o mesmo certificado usado para assinar o aplicativo declarante. Exemplo:android.permission.ACCESS_DOWNLOAD_MANAGER. Sinônimo antigo parasignature|privileged. Preterida no API nível 23.
- Nível de Proteção:
- Permissões de tempo de execução: exigem que o usuário seja solicitado explicitamente no tempo de execução para aprovação.
- Nível de Proteção:
dangerous. Concedem acesso adicional a dados restritos ou permitem que o aplicativo execute ações restritas que afetam mais substancialmente o sistema e outros aplicativos.
- Nível de Proteção:
- Permissões especiais: exigem que o usuário navegue até Configurações > Aplicativos > Acesso especial do aplicativo e dê consentimento explícito.
- Nível de Proteção:
appop. Concedem acesso a recursos do sistema que são particularmente sensíveis, como exibir e desenhar sobre outros aplicativos ou acessar todos os dados de armazenamento.
- Nível de Proteção:
- Permissões personalizadas para compartilhar seus próprios recursos e capacidades com outros aplicativos.
- Nível de Proteção:
normal,signatureoudangerous.
- Nível de Proteção:
Independentemente do Nível de Proteção atribuído, é importante considerar o risco que uma permissão pode representar considerando as capacidades protegidas adicionais, isso é especialmente importante para aplicativos pré-instalados. A tabela a seguir apresenta um conjunto representativo de permissões Android categorizadas por risco associado, conforme definido neste artigo que utiliza o conjunto de permissões (privilegiadas) e pontos de entrada para um aplicativo para estimar sua superfície de ataque.
| Categoria de Risco | Permissões | Nível de Proteção |
|---|---|---|
| ASTRONÔMICO | android.permission.INSTALL_PACKAGES |
signature |
| CRÍTICO | android.permission.COPY_PROTECTED_DATA |
signature |
| CRÍTICO | android.permission.WRITE_SECURE_SETTINGS |
signature |
| CRÍTICO | android.permission.READ_FRAME_BUFFER |
signature |
| CRÍTICO | android.permission.MANAGE_CA_CERTIFICATES |
signature |
| CRÍTICO | android.permission.MANAGE_APP_OPS_MODES |
signature |
| CRÍTICO | android.permission.GRANT_RUNTIME_PERMISSIONS |
signature |
| CRÍTICO | android.permission.DUMP |
signature |
| CRÍTICO | android.permission.CAMERA |
dangerous |
| CRÍTICO | android.permission.SYSTEM_CAMERA |
signatureOrSystem |
| CRÍTICO | android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS |
signature |
| CRÍTICO | android.permission.MOUNT_UNMOUNT_FILESYSTEMS |
signature |
| CRÍTICO | android.permission.PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE |
signature |
| CRÍTICO | android.permission.PROVIDE_REMOTE_CREDENTIALS |
signature |
| CRÍTICO | android.permission.THREAD_NETWORK_PRIVILEGED |
signature |
| CRÍTICO | android.permission.RECORD_SENSITIVE_CONTENT |
signature |
| CRÍTICO | android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS |
signature |
| ALTO | android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS |
signature |
| ALTO | android.permission.READ_SMS |
dangerous |
| ALTO | android.permission.WRITE_SMS |
normal |
| ALTO | android.permission.RECEIVE_MMS |
dangerous |
| ALTO | android.permission.SEND_SMS_NO_CONFIRMATION |
signature |
| ALTO | android.permission.RECEIVE_SMS |
dangerous |
| ALTO | android.permission.READ_LOGS |
signature |
| ALTO | android.permission.READ_PRIVILEGED_PHONE_STATE |
signature |
| ALTO | android.permission.LOCATION_HARDWARE |
signature |
| ALTO | android.permission.ACCESS_FINE_LOCATION |
dangerous |
| ALTO | android.permission.ACCESS_BACKGROUND_LOCATION |
dangerous |
| ALTO | android.permission.BIND_ACCESSIBILITY_SERVICE |
signature |
| ALTO | android.permission.ACCESS_WIFI_STATE |
normal |
| ALTO | com.android.voicemail.permission.READ_VOICEMAIL |
signature |
| ALTO | android.permission.RECORD_AUDIO |
dangerous |
| ALTO | android.permission.CAPTURE_AUDIO_OUTPUT |
signature |
| ALTO | android.permission.ACCESS_NOTIFICATIONS |
signature |
| ALTO | android.permission.INTERACT_ACROSS_USERS_FULL |
signature |
| ALTO | android.permission.BLUETOOTH_PRIVILEGED |
signature |
| ALTO | android.permission.GET_PASSWORD |
signature |
| ALTO | android.permission.INTERNAL_SYSTEM_WINDOW |
signature |
| ALTO | android.permission.MANAGE_ONGOING_CALLS |
signature |
| ALTO | android.permission.READ_RESTRICTED_STATS |
internal |
| ALTO | android.permission.BIND_AUTOFILL_SERVICE |
signature |
| ALTO | android.permission.WRITE_VERIFICATION_STATE_E2EE_CONTACT_KEYS |
signature |
| ALTO | android.permission.READ_DROPBOX_DATA |
signature |
| ALTO | android.permission.WRITE_FLAGS |
signature |
| MÉDIO | android.permission.ACCESS_COARSE_LOCATION |
dangerous |
| MÉDIO | android.permission.CHANGE_COMPONENT_ENABLED_STATE |
signature |
| MÉDIO | android.permission.READ_CONTACTS |
dangerous |
| MÉDIO | android.permission.WRITE_CONTACTS |
dangerous |
| MÉDIO | android.permission.CONNECTIVITY_INTERNAL |
signature |
| MÉDIO | android.permission.ACCESS_MEDIA_LOCATION |
dangerous |
| MÉDIO | android.permission.READ_EXTERNAL_STORAGE |
dangerous |
| MÉDIO | android.permission.WRITE_EXTERNAL_STORAGE |
dangerous |
| MÉDIO | android.permission.SYSTEM_ALERT_WINDOW |
signature |
| MÉDIO | android.permission.READ_CALL_LOG |
dangerous |
| MÉDIO | android.permission.WRITE_CALL_LOG |
dangerous |
| MÉDIO | android.permission.INTERACT_ACROSS_USERS |
signature |
| MÉDIO | android.permission.MANAGE_USERS |
signature |
| MÉDIO | android.permission.READ_CALENDAR |
dangerous |
| MÉDIO | android.permission.BLUETOOTH_ADMIN |
normal |
| MÉDIO | android.permission.BODY_SENSORS |
dangerous |
| MÉDIO | android.permission.MANAGE_EXTERNAL_STORAGE |
signature |
| MÉDIO | android.permission.ACCESS_BLOBS_ACROSS_USERS |
signature |
| MÉDIO | android.permission.BLUETOOTH_ADVERTISE |
dangerous |
| MÉDIO | android.permission.READ_MEDIA_AUDIO |
dangerous |
| MÉDIO | android.permission.READ_MEDIA_IMAGES |
dangerous |
| MÉDIO | android.permission.READ_MEDIA_VIDEO |
dangerous |
| MÉDIO | android.permission.REGISTER_NSD_OFFLOAD_ENGINE |
signature |
| MÉDIO | android.permission.ACCESS_LAST_KNOWN_CELL_ID |
signature |
| MÉDIO | android.permission.USE_COMPANION_TRANSPORTS |
signature |
| BAIXO | android.permission.DOWNLOAD_WITHOUT_NOTIFICATION |
normal |
| BAIXO | android.permission.PACKAGE_USAGE_STATS |
signature |
| BAIXO | android.permission.MASTER_CLEAR |
signature |
| BAIXO | android.permission.DELETE_PACKAGES |
normal |
| BAIXO | android.permission.GET_PACKAGE_SIZE |
normal |
| BAIXO | android.permission.BLUETOOTH |
normal |
| BAIXO | android.permission.DEVICE_POWER |
signature |
| BAIXO | android.permission.READ_PRECISE_PHONE_STATE |
signature |
| BAIXO | android.permission.LOG_FOREGROUND_RESOURCE_USE |
signature |
| BAIXO | android.permission.MANAGE_DEFAULT_APPLICATIONS |
signature |
| BAIXO | android.permission.MANAGE_FACE |
signature |
| BAIXO | android.permission.REPORT_USAGE_STATS |
signature |
| BAIXO | android.permission.MANAGE_DISPLAYS |
signature |
| BAIXO | android.permission.RESTRICT_DISPLAY_MODES |
signature |
| BAIXO | android.permission.ACCESS_HIDDEN_PROFILES_FULL |
signature |
| BAIXO | android.permission.GET_BACKGROUND_INSTALLED_PACKAGES |
signature |
| NENHUM | android.permission.ACCESS_NETWORK_STATE |
normal |
| NENHUM | android.permission.RECEIVE_BOOT_COMPLETED |
normal |
| NENHUM | android.permission.WAKE_LOCK |
normal |
| NENHUM | android.permission.FLASHLIGHT |
normal |
| NENHUM | android.permission.VIBRATE |
normal |
| NENHUM | android.permission.WRITE_MEDIA_STORAGE |
signature |
| NENHUM | android.permission.MODIFY_AUDIO_SETTINGS |
normal |
Observe que esta categorização pode mudar ao longo do tempo. O artigo nos dá um exemplo disso:
Antes do Android 10, a permissão
READ_PHONE_STATEseria classificada como ALTA, devido aos identificadores permanentes do dispositivo (ex.: IMEI/MEID, IMSI, SIM e número de série de fabricação) que protege. No entanto, a partir do Android 10, grande parte das informações sensíveis que podem ser usadas para rastreamento foi movida, refatorada ou reescopada para uma nova permissão chamadaREAD_PRIVILEGED_PHONE_STATE, colocando a nova permissão na categoria ALTA, mas resultando na movimentação da permissãoREAD_PHONE_STATEpara BAIXA.
Mudanças de Permissões por Nível de API¶
Mudanças no Android 8.0 (API nível 26):
As seguintes mudanças afetam todos os aplicativos executados no Android 8.0 (API nível 26), mesmo aqueles direcionados a níveis de API mais baixos.
- Mudança nas estatísticas de uso do provedor de contatos: quando um aplicativo solicita a permissão
READ_CONTACTS, consultas para dados de uso de contatos retornarão aproximações em vez de valores exatos (a API de preenchimento automático não é afetada por esta mudança).
Aplicativos direcionados ao Android 8.0 (API nível 26) ou superior são afetados pelo seguinte:
- Melhorias no acesso e descoberta de contas: aplicativos não podem mais obter acesso a contas de usuário apenas por ter a permissão
GET_ACCOUNTSconcedida, a menos que o autenticador possua as contas ou o usuário conceda esse acesso. - Novas permissões de telefonia: as seguintes permissões (classificadas como perigosas) agora fazem parte do grupo de permissões
PHONE:- A permissão
ANSWER_PHONE_CALLSpermite atender chamadas telefônicas recebidas programaticamente (viaacceptRingingCall). - A permissão
READ_PHONE_NUMBERSconcede acesso de leitura aos números de telefone armazenados no dispositivo.
- A permissão
-
Restrições ao conceder permissões perigosas: permissões perigosas são classificadas em grupos de permissões (ex.: o grupo
STORAGEcontémREAD_EXTERNAL_STORAGEeWRITE_EXTERNAL_STORAGE). Antes do Android 8.0 (API nível 26), era suficiente solicitar uma permissão do grupo para obter todas as permissões desse grupo também concedidas ao mesmo tempo. Isso mudou a partir do Android 8.0 (API nível 26): sempre que um aplicativo solicita uma permissão em tempo de execução, o sistema concederá exclusivamente essa permissão específica. No entanto, observe que todas as solicitações subsequentes de permissões nesse grupo de permissões serão concedidas automaticamente sem mostrar a caixa de diálogo de permissões ao usuário. Veja este exemplo da documentação para desenvolvedores Android:Suponha que um aplicativo liste tanto READ_EXTERNAL_STORAGE quanto WRITE_EXTERNAL_STORAGE em seu manifesto. O aplicativo solicita READ_EXTERNAL_STORAGE e o usuário concede. Se o aplicativo for direcionado ao nível de API 25 ou inferior, o sistema também concede WRITE_EXTERNAL_STORAGE ao mesmo tempo, porque pertence ao mesmo grupo de permissões STORAGE e também está registrado no manifesto. Se o aplicativo for direcionado ao Android 8.0 (API nível 26), o sistema concede apenas READ_EXTERNAL_STORAGE naquele momento; no entanto, se o aplicativo posteriormente solicitar WRITE_EXTERNAL_STORAGE, o sistema concede imediatamente esse privilégio sem solicitar o usuário.
Você pode ver a lista de grupos de permissões na documentação para desenvolvedores Android. Para tornar isso um pouco mais confuso, o Google também alerta que permissões específicas podem ser movidas de um grupo para outro em versões futuras do Android SDK e, portanto, a lógica do aplicativo não deve depender da estrutura desses grupos de permissões. A melhor prática é solicitar explicitamente todas as permissões sempre que necessário.
Mudanças no Android 9 (API Nível 28):
As seguintes mudanças afetam todos os aplicativos executados no Android 9, mesmo aqueles direcionados a níveis de API inferiores a 28.
- Acesso restrito aos registros de chamadas: as permissões
READ_CALL_LOG,WRITE_CALL_LOGePROCESS_OUTGOING_CALLS(perigosas) foram movidas dePHONEpara o novo grupo de permissõesCALL_LOG. Isso significa que ser capaz de fazer chamadas telefônicas (ex.: por ter as permissões do grupoPHONEconcedidas) não é suficiente para obter acesso aos registros de chamadas. - Acesso restrito a números de telefone: aplicativos que desejam ler o número de telefone exigem a permissão
READ_CALL_LOGquando executados no Android 9 (API nível 28). - Acesso restrito a informações de localização e conexão Wi-Fi: valores SSID e BSSID não podem ser recuperados (ex.: via
WifiManager.getConnectionInfoa menos que todas as seguintes condições sejam verdadeiras:- A permissão
ACCESS_FINE_LOCATIONouACCESS_COARSE_LOCATION. - A permissão
ACCESS_WIFI_STATE. - Os serviços de localização estejam habilitados (em Configurações -> Localização).
- A permissão
Aplicativos direcionados ao Android 9 (API nível 28) ou superior são afetados pelo seguinte:
- Preterição do número de série de fabricação: o número de série de hardware do dispositivo não pode ser lido (ex.: via
Build.getSerial) a menos que a permissãoREAD_PHONE_STATE(perigosa) seja concedida.
Mudanças no Android 10 (API nível 29):
O Android 10 (API nível 29) introduz várias melhorias de privacidade do usuário. As mudanças relacionadas a permissões afetam todos os aplicativos executados no Android 10 (API nível 29), incluindo aqueles direcionados a níveis de API mais baixos.
- Acesso restrito à localização: nova opção de permissão para acesso à localização "apenas enquanto usa o aplicativo".
- Armazenamento com escopo por padrão: aplicativos direcionados ao Android 10 (API nível 29) não precisam declarar nenhuma permissão de armazenamento para acessar seus arquivos no diretório específico do aplicativo no armazenamento externo, bem como para arquivos criados a partir da galeria de mídia.
- Acesso restrito ao conteúdo da tela: as permissões
READ_FRAME_BUFFER,CAPTURE_VIDEO_OUTPUTeCAPTURE_SECURE_VIDEO_OUTPUTagora são apenas de acesso por assinatura, o que impede o acesso silencioso ao conteúdo da tela do dispositivo. - Verificação de permissão voltada ao usuário em aplicativos legados: ao executar um aplicativo direcionado ao Android 5.1 (API nível 22) ou inferior pela primeira vez, os usuários serão solicitados com uma tela de permissões onde podem revogar o acesso a permissões legadas específicas (que anteriormente seriam concedidas automaticamente no momento da instalação).
Aplicação de Permissões¶
Aplicação de Permissões em Atividades:
As permissões são aplicadas via atributo android:permission dentro da tag <activity> no manifesto. Essas permissões restringem quais aplicativos podem iniciar essa Atividade. A permissão é verificada durante Context.startActivity e Activity.startActivityForResult. Não possuir a permissão necessária resulta em uma SecurityException sendo lançada da chamada.
Aplicação de Permissões em Serviços:
Permissões aplicadas via atributo android:permission dentro da tag <service> no manifesto restringem quem pode iniciar ou vincular ao Serviço associado. A permissão é verificada durante Context.startService, Context.stopService e Context.bindService. Não possuir a permissão necessária resulta em uma SecurityException sendo lançada da chamada.
Aplicação de Permissões em Transmissões:
Permissões aplicadas via atributo android:permission dentro da tag <receiver> restringem o acesso para enviar transmissões para o BroadcastReceiver associado. As permissões mantidas são verificadas após Context.sendBroadcast retornar, enquanto tenta entregar a transmissão enviada ao receptor fornecido. Não possuir as permissões necessárias não lança uma exceção, o resultado é uma transmissão não enviada.
Uma permissão pode ser fornecida para Context.registerReceiver para controlar quem pode transmitir para um receptor registrado programaticamente. Indo no sentido contrário, uma permissão pode ser fornecida ao chamar Context.sendBroadcast para restringir quais receptores de transmissão têm permissão para receber a transmissão.
Observe que tanto um receptor quanto um transmissor podem exigir uma permissão. Quando isso acontece, ambas as verificações de permissão devem passar para que a intent seja entregue ao alvo associado. Para mais informações, consulte a seção "Restringindo transmissões com permissões" na Documentação para Desenvolvedores Android.
Aplicação de Permissões em Provedores de Conteúdo:
Permissões aplicadas via atributo android:permission dentro da tag <provider> restringem o acesso a dados em um ContentProvider. Provedores de conteúdo têm um recurso de segurança adicional importante chamado permissões URI, que é descrito a seguir. Ao contrário dos outros componentes, ContentProviders têm dois atributos de permissão separados que podem ser definidos, android:readPermission restringe quem pode ler do provedor, e android:writePermission restringe quem pode escrever nele. Se um ContentProvider estiver protegido com permissões de leitura e escrita, ter apenas a permissão de escrita não concede também permissões de leitura.
As permissões são verificadas quando você recupera um provedor pela primeira vez e conforme as operações são realizadas usando o ContentProvider. Usar ContentResolver.query requer ter a permissão de leitura; usar ContentResolver.insert, ContentResolver.update, ContentResolver.delete requer a permissão de escrita. Uma SecurityException será lançada da chamada se as permissões adequadas não forem mantidas em todos esses casos.
Permissões URI de Provedores de Conteúdo:
O sistema de permissão padrão não é suficiente quando usado com provedores de conteúdo. Por exemplo, um provedor de conteúdo pode querer limitar permissões a permissões de LEITURA para se proteger, enquanto usa URIs personalizados para recuperar informações. Um aplicativo deve ter apenas a permissão para esse URI específico.
A solução são permissões por URI. Ao iniciar ou retornar um resultado de uma atividade, o método pode definir Intent.FLAG_GRANT_READ_URI_PERMISSION e/ou Intent.FLAG_GRANT_WRITE_URI_PERMISSION. Isso concede permissão à atividade para o URI específico, independentemente de ter permissões para acessar dados do provedor de conteúdo.
Isso permite um modelo comum de capacidade onde a interação do usuário direciona a concessão ad-hoc de permissão granular. Isso pode ser uma instalação chave para reduzir as permissões necessárias pelos aplicativos apenas àquelas diretamente relacionadas ao seu comportamento. Sem este modelo em vigor, usuários maliciosos podem acessar anexos de e-mail de outros membros ou coletar listas de contatos para uso futuro via URIs desprotegidos. No manifesto, o atributo android:grantUriPermissions ou o nó ajudam a restringir os URIs.
Aqui você pode encontrar mais informações sobre APIs relacionadas a Permissões URI:
Permissões Personalizadas¶
O Android permite que aplicativos exponham seus serviços/componentes para outros aplicativos. Permissões personalizadas são necessárias para acesso do aplicativo aos componentes expostos. Você pode definir permissões personalizadas em AndroidManifest.xml criando uma tag de permissão com dois atributos obrigatórios: android:name e android:protectionLevel.
É crucial criar permissões personalizadas que adiram ao Princípio do Privilégio Mínimo: a permissão deve ser definida explicitamente para sua finalidade, com um rótulo e descrição significativos e precisos.
Abaixo está um exemplo de uma permissão personalizada chamada START_MAIN_ACTIVITY, que é necessária ao lançar a Atividade TEST_ACTIVITY.
O primeiro bloco de código define a nova permissão, que é autoexplicativa. A tag label é um resumo da permissão, e a description é uma versão mais detalhada do resumo. Você pode definir o nível de proteção de acordo com os tipos de permissões que serão concedidas. Depois de definir