Como funciona internamente o acesso root em dispositivos Android?
- por Sergio Prado
A Internet esta repleta de artigos explicando como fazer root em um dispositivo Android.
Mas o que significa esse tal de acesso root e como ele funciona internamente? É o que veremos neste artigo!
CONCEITOS BÁSICOS
O Android é baseado no kernel Linux. E uma característica básica de sistemas Linux (herdada do Unix) é a implementação do mecanismo básico de segurança através de usuários, grupos e permissões. Por exemplo, determinado usuário possui permissão para executar determinada aplicação apenas se a flag de execução do arquivo correspondente à aplicação estiver habilitado. Alguns bons artigos sobre o mecanismo de permissões no Linux estão disponíveis aqui e aqui.
Mas algumas operações no Linux, como montar um sistema de arquivos ou carregar um módulo do kernel, requerem previlégios de administrador. E apenas um usuário possui estes previlégios. Este usuário é o root!
Existem ainda outros mecanismos de segurança complementares no Linux como as capabilities, que permitem uma maior granularidade sobre o que determinado processo rodando como root pode fazer, ou ainda o SELinux, um sistema de controle de acesso aos recursos do sistema baseado na arquitetura MAC (Mandatory Access Control).
E O ANDROID?
Bom, o Android é um sistema Linux, e por este motivo, as mesmas regras se aplicam. Mas com relação à segurança, o Android difere em alguns pontos quando comparado às distribuições Linux convencionais. À começar pela forma como as aplicações são isoladas umas das outras.
Cada aplicação no Android roda em um processo separado, com um usuário e grupo diferente. Desta forma, as aplicações ficam isoladas umas das outras, e do sistema de forma geral. Este conceito é normalmente chamado de sandbox.
Mas uma aplicação não pode simplesmente ficar isolada do restante do sistema, certo? E se ela quiser acessar os dados do GPS, por exemplo? Neste caso, acontece o seguinte:
1. A aplicação utiliza a API do Android para requisitar o acesso aos dados do GPS (vide classe LocationManager da API).
2. Esta API irá enviar a requisição para um serviço do sistema. A comunicação entre a API e o serviço acontece via socket, através de um mecanismo de IPC chamado Binder.
3. O serviço verifica se a aplicação tem acesso ao recurso de localização através do arquivo de manifesto da aplicação (AndroidManifest.xml).
4. Caso o acesso ao recurso de localização esteja definido no arquivo de manifesto, o serviço libera o acesso e devolve os dados à aplicação.
Sabe aquela lista de permissões que aparecem quando instalamos uma aplicação? Esta é a lista de permissões que foram definidas no arquivo de manifesto da aplicação, e que deveríamos sempre ler para evitar a instalação de uma aplicação maliciosa. Afinal, o elo mais fraco de qualquer sistema de segurança é o ser humano!
Na prática, as aplicações estão limitadas a acessar apenas um subconjunto dos recursos do sistema, e dentro deste subconjunto, apenas alguns recursos são liberados para uma aplicação, através da configuração no arquivo de manifesto. Para os mais curiosos, a lista completa destes recursos esta disponível aqui.
Isso significa que uma aplicação Android não pode por exemplo alterar qualquer arquivo do sistema de arquivos ou matar um processo do sistema.
Mas e se você quiser utilizar uma aplicação que acessa os arquivos do sistema para mudar a frequência da CPU, como faz a SetCPU? Ou então desinstalar aquelas aplicações que vieram instaladas por padrão no seu smartphone, que você nunca vai usar e que ficam consumindo bateria, como faz a Root Uninstaller?
Por padrão, isso não é possível em sistemas Android, a não ser que…
SER ROOT É MUITO DIVERTIDO
A não ser que você dê permissão de root às aplicações!
Mas para dar permissão de root às aplicações, é necessário ter acesso root ao sistema. Sim, é a velha estória do ovo e da galinha. E este tipo de acesso, na maioria das vezes, não esta disponível na imagem padrão do Android disponibilizada pelo fabricante. Então hackers do mundo todo, com uma garrafa de vinho e algum tempo livre, sempre descobrem uma abertura ou vulnerabilidade no sistema operacional que torna isso possível. Eles documentam o processo e desenvolvem ferramentas para facilitar sua execução. É este processo que chamamos de rooting ou fazer root em um dispositivo Android.
Desta forma, com acesso root, uma aplicação pode acessar qualquer recurso do sistema, possibilitando ler, modificar ou remover qualquer arquivo, iniciar e parar processos, acessar diretamente o hardware, além de facilitar a substituição da imagem padrão do Android disponibilizada pelo fabricante do dispositivo por uma ROM customizada como o Cyanogenmod!
3 PASSOS PARA A LIBERDADE
São três os passos para fazer root em um dispositivo Android, os dois primeiros obrigatórios, e o terceiro opcional (mas recomendado).
O primeiro passo é obter o acesso root ao dispositivo. Este é o passo mais complexo, que explicarei com detalhes na próxima seção.
Com o acesso root, o segundo passo envolve copiar a ferramenta su para o sistema, com as credenciais do usuário root e o bit SUID setado. A ferramenta su possibilita mudar as credenciais de acesso (usuário e grupo) ao executar um comando qualquer. (vide sua página de manual). Se as credenciais não forem passadas, o comando é executado como root. Mas como as aplicações não possuem permissão para executar comandos como root, o bit SUID setado faz com que o comando seja executado com a credencial do dono do arquivo, ou seja, o usuário root! O resultado prático disso é que, sempre que uma aplicação Android quiser acesso root, basta usar a ferramenta su!
O terceiro passo é opcional. Com a ferramenta su instalada, qualquer aplicação pode ter acesso privilegiado ao sistema, incluindo aplicações maliciosas! Portanto, é necessário ter algum tipo de controle sobre quais aplicações podem utilizar a ferramenta su. Para isso, é recomendado instalar a aplicação Superuser. Esta aplicação captura os acessos à ferramenta su, e possibilita ao usuário permitir ou negar o acesso. Internamente, o que esta aplicação faz é substituir a ferramenta su por uma customizada, que verifica em um banco de dados as aplicações liberadas antes de permitir o acesso root.
Muito bacana, não é verdade?
Mas vamos voltar ao primeiro passo e entender agora como conseguir acesso root em um dispositivo Android.
PELA PORTA DOS FUNDOS
A primeira pergunta que você pode fazer é se alguém já conseguiu acesso root ao seu dispositivo de interesse e documentou o passo-a-passo. Para responder à esta pergunta, você pode pesquisar no Google por “como fazer root marca_do_smartphone“, “how to root smartphone_name” ou “rooting smartphone_name“. Outra opção é procurar em fórums especializados como o XDA Developers ou na wiki do CyanogenMod. Caso alguém já tenha identificado e documentado o processo, basta seguir o passo-a-passo documentado e ser feliz!
Mas caso ninguém tenha ainda documentado um processo de obtenção de acesso root ao seu dispositivo, e você queira se aventurar nesta tarefa, o próximo passo é verificar se o bootloader do seu dispositivo é bloqueado (um bootloader bloqueado não permite carregar ROMs alternativas).
Se o bootloader do seu dispositivo for desbloqueado, normalmente o fabricante fornece ferramentas para você poder regravar a ROM do dispositivo. Por exemplo, os smartphones da linha Nexus do Google podem ser desbloqueados através da ferramenta fastboot.
Com o bootloader desbloqueado, você pode gravar uma imagem de recovery customizada como a ClockworkMod, capaz de instalar a ferramenta su no sistema. Veja por exemplo o procedimento para fazer root no Nexus 7.
Em alguns casos, é possível até extrair a ROM original com o comando dd, customizá-la manualmente (adicionando a ferramenta su) e atualizar o sistema através do bootloader desbloqueado.
Mas caso o bootloader seja bloqueado, o trabalho será bem maior. Neste caso, o processo envolve normalmente a exploração de uma falha de segurança no dispositivo, de forma que você possa ganhar (momentaneamente) previlégios de root. Em segurança da informação, este processo é normalmente chamado de elevação de previlégios ou privilege escalation.
Mas como isso é possível?
Alguns processos do sistema rodam com previlégios de root, e o segredo está em explorar uma falha de segurança nestes processos, como buffer overflow ou estouro de inteiro, possibilitando executar código arbitrário como root. Este código arbitrário envolve normalmente a cópia da ferramenta su para o sistema, conforme descrevi na seção anterior. É assim que funcionam aquelas aplicações e métodos “one-click” como o z4root ou o SuperOneClick.
Uma apresentação bem legal com alguns exemplos de exploits desenvolvidos para explorar falhas de segurança no Android esta disponível aqui. E o canal do Youtube TheUnlockr possui vários vídeos que ensinam como fazer root em dispositivos Android.
Mas estas falhas de segurança nunca são corrigidas? Sim, claro que são. Exploits acabam ficando obsoletos conforme novos dispositivos Android são lançados no mercado. Mas como os fabricantes demoram para lançar atualizações que corrijam estas falhas de segurança, os exploits são funcionais durante um bom tempo. E enquanto isso, hackers do mundo todo trabalham na identificação de exploits para novas versões de software e novos dispositivos de hardware lançados no mercado, garantindo nossa diversão por um bom tempo!
Happy rooting!
Sergio Prado