Modelo de Permissões do Android

Cada aplicativo em um sistema Android roda em um ambiente isolado, conhecido como “sandbox” (tanque de areia), e não tem acesso ao hardware ou aos dados do sistema, a não ser que ele receba permissão explícita para ter esse acesso. As permissões são solicitadas pelo aplicativo durante a instalação. Infelizmente, as permissões no Android funcionam em uma base do “tudo ou nada”: se o usuário se negar a aceitar uma permissão, é impossível instalar o app. O site oficial do Android esclarece que “Nenhuma verificação é feita enquanto o aplicativo está rodando: ou o aplicativo tem a permissão, desde o momento em que foi instalado, e pode executar a operação quando desejar, ou o aplicativo não tem a permissão necessária, e qualquer tentativa feita pelo aplicativo de usar essa funcionalidade falha sem avisar ao usuário.”

Apps que oferecem a funcionalidade de conceder permissões seletivamente, como o AppOps exigem que o sistema esteja “rootado” - o que geralmente significa que o usuário precisa abrir mão da garantia do aparelho para usá-los. Também não existem apps com essa funcionalidade que sejam de código aberto.

A revisão de permissões dos aplicativos é uma tarefa importante, embora seja ignorada por muitos usuários. Um aplicativo de câmera não tem muita justificativa para poder enviar SMS, e um aplicativo que envia SMS não tem muita justificativa para usar o Bluetooth - portanto um aplicativo que solicita esse tipo de permissão deve ser visto como um risco. Existem já diversos relatos de aplicativos que liam os dados dos usuários e enviavam esses dados para servidores externos, sem deixar isso claro para o usuário - o que representa uma grave violação de privacidade. Entre esses aplicativos, podemos citar a rede social Path e o jogo BallonPop2.

Uma combinação particularmente perigosa de permissões é a junção de acesso pleno à Internet com acesso a informações pessoais, como a identidade e número do telefone. Infelizmente, diversos apps simples como Angry Birds requisitam essa combinação de permissões para coletar dados pessoais, a fim de melhorar o direcionamento de propagandas. Isso dá ao usuário médio a falsa sensação de que essas permissões são inócuas. No entanto, a utilização desses dados pode ser abusada pela companhia que faz o app, como no caso do Path e BallonPop2, mas também pode ser usada pelo governo americano ou qualquer outra organização que consiga interceptar o tráfego desses dados.

Permissões de sistema

A lista completa de permissões do sistema depende da versão de Android que está sendo analisada. O número total de permissões de sistema aumentou de 91, na primeira versão de Android, para 151, no Android 5.

Algumas ações que não requeriam permissão no Android 2.x passaram a ser controladas no Android 4, por exemplo a permissão para escrever dados na memória compartilhada (WRITE_EXTERNAL_STORAGE). Essa mesma restrição volta a ser relaxada no Android 4.4: aplicativos executando nesta versão de Android (ou em versões posteriores) tem direito de escrever em uma área específica da memória compartilhada sem requerer permissões.

A lista abaixo contém algumas das principais permissões, e a lista completa pode ser encontrada no site oficial.

Lista de permissões

Permissões que oferecem risco

As permissões a seguir podem oferecer riscos à segurança de dados e privacidade do usuário. Reveja cuidadosamente o app para garantir que o aplicativo necessita dessa permissão.

Permissão Nome na API Descrição
Localização aproximada por rede ACCESS_COARSE_LOCATION Permite que o app determine sua localização aproximada à partir da distância ao sinal de rede.
Localização precisa ACCESS_FINE_LOCATION Permite que o app determine sua localização precisamente, através de GPS.
Agir como autenticador de contas AUTHENTICATE_ACCOUNTS Permite que o app use o autenticador de contas. Envolve criar contas (como conta Google, conta de Facebook, etc) e controlar senhas.
Criar conexões Bluetooth BLUETOOTH Permite que o app crie e aceite conexões Bluetooth
Administrar Bluetooth BLUETOOTH_ADMIN Permite que o app descubra aparelhos Bluetooth, crie e aceite conexões
Realizar chamada telefônica CALL_PHONE Permite que o app inicie uma chamada telefônica sem passar pela interface de discagem ou solicitar confirmação do usuário, exceto para números de emergência
Acessar a câmera CAMERA Permite que o app acesse a câmera e tire fotos sem confirmação do usuário
Acesso total à Internet INTERNET Permite acesso livre à Internet, sem notificação ao usuário
Enviar SMS SEND_SMS Permite o envio de mensagens SMS. Apps maliciosos podem usar isso para enviar SMS para números que cobram uma tarifa mais cara.
Ler corrente social READ_SOCIAL_STREAM Permite que correntes sociais sejam lidas. Essa funcionalidade foi abandonada no Android 5.0
Escrever em corrente social WRITE_SOCIAL_STREAM Permite que o app divulgue informações através das correntes sociais. Essa funcionalidade foi abandonada no Android 5.0

Permissões seguras

As permissões a seguir são geralmente consideradas seguras.

Permissão Nome na API Descrição
Ver estado de conexões de rede ACCESS_NETWORK_STATE Permite que o app determine o estado das conexões de rede. Usada para evitar fazer requisições de rede quando não há nenhuma rede disponível.
Ver estado do Wi-fi ACCESS_WIFI_STATE Permite que o app determine se existem ou não conexões Wi-fi ativas. Não permite o uso do Wi-fi.
Vibrar VIBRATE Permite que o app acesse o vibrador
Ligar a lanterna FLASHLIGHT Permite que o app controle a lanterna do aparelho
Remover atalho UNINSTALL_SHORTCUT Permite que o app remova atalhos da tela inicial
Criar atalho INSTALL_SHORTCUT Permite que o app crie atalhos na tela inicial

Permissões de uso restrito

Há uma série de permissões que são marcadas como “Not for use by third-party applications”: o intuito delas é controlar funcionalidades muito poderosas, como a capacidade de reiniciar o aparelho, e que não devem ser dadas para aplicativos comuns. A Google Play Store se recusa a aceitar apps que solicitem essas permissões, exceto apps escritos pela própria Google, então os únicos outros apps que usam essas permissões em aparelhos rodando o Google Android são os que já vem instalados pelo fabricante. No entanto, quando um usuário baixa um aplicativo por fora das lojas de aplicativo (por “side-loading”), é muito importante verificar a presença dessas permissões.

  • Obs: não consegui verificar qual é a política do F-Droid em relação a essas permissões.
Permissão Nome na API Descrição
Gerenciador de contas ACCOUNT_MANAGER Allows applications to call into AccountAuthenticators.
Acesso privilegiado ao Bluetooth BLUETOOTH_PRIVILEGED Permite que o app realize descoberta e pareamento Bluetooth sem aviso ao usuário
Realizar chamadas privilegiadas CALL_PRIVILEGED Permite que o app realize chamadas telefônicas sem confirmação do usuário, inclusive para números de emergência.

OBS: traduzir e categorizar lista abaixo

? ACCESS_CHECKIN_PROPERTIES Permite que o app acesse e modifique a tabela de properties no banco de dados …
? ACCESS_LOCATION_EXTRA_COMMANDS

String ACCESS_CHECKIN_PROPERTIES Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded. String ACCESS_LOCATION_EXTRA_COMMANDS Allows an application to access extra location provider commands String ACCESS_MOCK_LOCATION Allows an application to create mock location providers for testing String ACCESS_SURFACE_FLINGER Allows an application to use SurfaceFlinger's low level features. String ADD_VOICEMAIL Allows an application to add voicemails into the system. String BATTERY_STATS Allows an application to collect battery statistics String BIND_ACCESSIBILITY_SERVICE Must be required by an AccessibilityService, to ensure that only the system can bind to it. String BIND_APPWIDGET Allows an application to tell the AppWidget service which application can access AppWidget's data. String BIND_DEVICE_ADMIN Must be required by device administration receiver, to ensure that only the system can interact with it. String BIND_DREAM_SERVICE Must be required by an DreamService, to ensure that only the system can bind to it. String BIND_INPUT_METHOD Must be required by an InputMethodService, to ensure that only the system can bind to it. String BIND_NFC_SERVICE Must be required by a HostApduService or OffHostApduService to ensure that only the system can bind to it. String BIND_NOTIFICATION_LISTENER_SERVICE Must be required by an NotificationListenerService, to ensure that only the system can bind to it. String BIND_PRINT_SERVICE Must be required by a PrintService, to ensure that only the system can bind to it. String BIND_REMOTEVIEWS Must be required by a RemoteViewsService, to ensure that only the system can bind to it. String BIND_TEXT_SERVICE Must be required by a TextService (e.g. String BIND_TV_INPUT Must be required by a TvInputService to ensure that only the system can bind to it. String BIND_VOICE_INTERACTION Must be required by a VoiceInteractionService, to ensure that only the system can bind to it. String BIND_VPN_SERVICE Must be required by a VpnService, to ensure that only the system can bind to it. String BIND_WALLPAPER Must be required by a WallpaperService, to ensure that only the system can bind to it. String BODY_SENSORS Allows an application to access data from sensors that the user uses to measure what is happening inside his/her body, such as heart rate. String BRICK Required to be able to disable the device (very dangerous!). String BROADCAST_PACKAGE_REMOVED Allows an application to broadcast a notification that an application package has been removed. String BROADCAST_SMS Allows an application to broadcast an SMS receipt notification. String BROADCAST_STICKY Allows an application to broadcast sticky intents. String BROADCAST_WAP_PUSH Allows an application to broadcast a WAP PUSH receipt notification.

String CAPTURE_AUDIO_OUTPUT Allows an application to capture audio output. String CAPTURE_SECURE_VIDEO_OUTPUT Allows an application to capture secure video output. String CAPTURE_VIDEO_OUTPUT Allows an application to capture video output. String CHANGE_COMPONENT_ENABLED_STATE Allows an application to change whether an application component (other than its own) is enabled or not. String CHANGE_CONFIGURATION Allows an application to modify the current configuration, such as locale. String CHANGE_NETWORK_STATE Allows applications to change network connectivity state String CHANGE_WIFI_MULTICAST_STATE Allows applications to enter Wi-Fi Multicast mode String CHANGE_WIFI_STATE Allows applications to change Wi-Fi connectivity state String CLEAR_APP_CACHE Allows an application to clear the caches of all installed applications on the device. String CLEAR_APP_USER_DATA Allows an application to clear user data. String CONTROL_LOCATION_UPDATES Allows enabling/disabling location update notifications from the radio. String DELETE_CACHE_FILES Allows an application to delete cache files. String DELETE_PACKAGES Allows an application to delete packages. String DEVICE_POWER Allows low-level access to power management. String DIAGNOSTIC Allows applications to RW to diagnostic resources. String DISABLE_KEYGUARD Allows applications to disable the keyguard String DUMP Allows an application to retrieve state dump information from system services. String EXPAND_STATUS_BAR Allows an application to expand or collapse the status bar. String FACTORY_TEST Run as a manufacturer test application, running as the root user. String FORCE_BACK Allows an application to force a BACK operation on whatever is the top activity. String GET_ACCOUNTS Allows access to the list of accounts in the Accounts Service String GET_PACKAGE_SIZE Allows an application to find out the space used by any package. String GET_TOP_ACTIVITY_INFO Allows an application to retrieve private information about the current top activity, such as any assist context it can provide. String GLOBAL_SEARCH This permission can be used on content providers to allow the global search system to access their data. String HARDWARE_TEST Allows access to hardware peripherals. String INJECT_EVENTS Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY window. String INSTALL_LOCATION_PROVIDER Allows an application to install a location provider into the Location Manager. String INSTALL_PACKAGES Allows an application to install packages. String INTERNAL_SYSTEM_WINDOW Allows an application to open windows that are for use by parts of the system user interface.

String KILL_BACKGROUND_PROCESSES Allows an application to call killBackgroundProcesses(String). String LOCATION_HARDWARE Allows an application to use location features in hardware, such as the geofencing api. String MANAGE_ACCOUNTS Allows an application to manage the list of accounts in the AccountManager String MANAGE_APP_TOKENS Allows an application to manage (create, destroy, Z-order) application tokens in the window manager. String MANAGE_DOCUMENTS Allows an application to manage access to documents, usually as part of a document picker. String MASTER_CLEAR Not for use by third-party applications. String MEDIA_CONTENT_CONTROL Allows an application to know what content is playing and control its playback. String MODIFY_AUDIO_SETTINGS Allows an application to modify global audio settings String MODIFY_PHONE_STATE Allows modification of the telephony state - power on, mmi, etc. String MOUNT_FORMAT_FILESYSTEMS Allows formatting file systems for removable storage. String MOUNT_UNMOUNT_FILESYSTEMS Allows mounting and unmounting file systems for removable storage. String NFC Allows applications to perform I/O operations over NFC

String PROCESS_OUTGOING_CALLS Allows an application to see the number being dialed during an outgoing call with the option to redirect the call to a different number or abort the call altogether. String READ_CALENDAR Allows an application to read the user's calendar data. String READ_CALL_LOG Allows an application to read the user's call log. String READ_CONTACTS Allows an application to read the user's contacts data. String READ_EXTERNAL_STORAGE Allows an application to read from external storage. String READ_FRAME_BUFFER Allows an application to take screen shots and more generally get access to the frame buffer data. String READ_HISTORY_BOOKMARKS Allows an application to read (but not write) the user's browsing history and bookmarks. String READ_LOGS Allows an application to read the low-level system log files. String READ_PHONE_STATE Allows read only access to phone state. String READ_PROFILE Allows an application to read the user's personal profile data. String READ_SMS Allows an application to read SMS messages.

String READ_SYNC_SETTINGS Allows applications to read the sync settings String READ_SYNC_STATS Allows applications to read the sync stats String READ_USER_DICTIONARY Allows an application to read the user dictionary. String READ_VOICEMAIL Allows an application to read voicemails in the system. String REBOOT Required to be able to reboot the device. String RECEIVE_BOOT_COMPLETED Allows an application to receive the ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. String RECEIVE_MMS Allows an application to monitor incoming MMS messages, to record or perform processing on them. String RECEIVE_SMS Allows an application to monitor incoming SMS messages, to record or perform processing on them. String RECEIVE_WAP_PUSH Allows an application to monitor incoming WAP push messages. String RECORD_AUDIO Allows an application to record audio String REORDER_TASKS Allows an application to change the Z-order of tasks String SEND_RESPOND_VIA_MESSAGE Allows an application (Phone) to send a request to other applications to handle the respond-via-message action during incoming calls. String SET_ACTIVITY_WATCHER Allows an application to watch and control how activities are started globally in the system. String SET_ALARM Allows an application to broadcast an Intent to set an alarm for the user. String SET_ALWAYS_FINISH Allows an application to control whether activities are immediately finished when put in the background. String SET_ANIMATION_SCALE Modify the global animation scaling factor. String SET_DEBUG_APP Configure an application for debugging. String SET_ORIENTATION Allows low-level access to setting the orientation (actually rotation) of the screen. String SET_POINTER_SPEED Allows low-level access to setting the pointer speed. String SET_PROCESS_LIMIT Allows an application to set the maximum number of (not needed) application processes that can be running. String SET_TIME Allows applications to set the system time. String SET_TIME_ZONE Allows applications to set the system time zone String SET_WALLPAPER Allows applications to set the wallpaper String SET_WALLPAPER_HINTS Allows applications to set the wallpaper hints String SIGNAL_PERSISTENT_PROCESSES Allow an application to request that a signal be sent to all persistent processes. String STATUS_BAR Allows an application to open, close, or disable the status bar and its icons. String SUBSCRIBED_FEEDS_READ Allows an application to allow access the subscribed feeds ContentProvider. String SUBSCRIBED_FEEDS_WRITE String SYSTEM_ALERT_WINDOW Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. String TRANSMIT_IR Allows using the device's IR transmitter, if available String UPDATE_DEVICE_STATS Allows an application to update device statistics. String USE_CREDENTIALS Allows an application to request authtokens from the AccountManager String USE_SIP Allows an application to use SIP service String WAKE_LOCK Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming String WRITE_APN_SETTINGS Allows applications to write the apn settings. String WRITE_CALENDAR Allows an application to write (but not read) the user's calendar data. String WRITE_CALL_LOG Allows an application to write (but not read) the user's contacts data. String WRITE_CONTACTS Allows an application to write (but not read) the user's contacts data. String WRITE_EXTERNAL_STORAGE Allows an application to write to external storage. String WRITE_GSERVICES Allows an application to modify the Google service map. String WRITE_HISTORY_BOOKMARKS Allows an application to write (but not read) the user's browsing history and bookmarks. String WRITE_PROFILE Allows an application to write (but not read) the user's personal profile data. String WRITE_SECURE_SETTINGS Allows an application to read or write the secure system settings. String WRITE_SETTINGS Allows an application to read or write the system settings. String WRITE_SMS Allows an application to write SMS messages.

String WRITE_SYNC_SETTINGS Allows applications to write the sync settings String WRITE_USER_DICTIONARY Allows an application to write to the user dictionary. String WRITE_VOICEMAIL Allows an application to modify and remove existing voicemails in the system

Outras permissões

Além das permissões de sistema, cada aplicativo pode declarar novas permissões, normalmente utilizadas para integração entre aplicativos. Os apps da Google declaram uma série de permissões específicas, como a permissão para mandar e-mails através do Gmail, ou a permissão para se logar na conta de Youtube.

Como cada aplicativo pode declarar permissões específicas, é impossível criar uma lista de todas as permissões existentes.