O Magisk Hide é um recurso do pacote de software open source chamado Magisk, desenvolvido para evitar que os aplicativos detectem se o dispositivo conta com acesso root. Neste post, vamos analisar as técnicas usadas pelo Magisk Hide e então determinar como ajudar os desenvolvedores que precisam implementar as melhores práticas de segurança para detecção de root considerando esta técnica.

Antes de começar, vale ressaltar que o processo de fazer o root de um dispositivo é perigoso e muitos usuários buscam e implementam esse processo, sabendo ou não as consequências que ele pode causar.

Dito isso, o rooting é um processo que permite obter permissões de administrador em smartphones, tablets e outros dispositivos do sistema operacional móvel Android. Esse recurso é comumente usado para melhorar o desempenho do dispositivo, estender o uso da bateria, fazer modificações no sistema operacional ou se livrar de algumas restrições impostas pelo fabricante. No entanto, existem vários riscos associados que podem colocar os serviços públicos mencionados em segundo plano.

Considerando os riscos de segurança a que podem estar sujeitos os usuários que decidem fazer o root ou jailbreak de seus dispositivos, muitos dos aplicativos (home banking, videogames, Fintech) buscam identificar e evitar que seus aplicativos sejam executados em ambientes com particularidades de root. No entanto, por meio do Magisk Hide, cuja função principal é evitar que as detecções de root impeçam a execução de um determinado aplicativo e que ele possa funcionar corretamente em ambientes com root, a tarefa dos desenvolvedores se tornou mais complexa.

Magisk Hide: como funciona e como identificar a presença de root em um dispositivo

Muitas das detecções de root surgem da verificação de caminhos e arquivos comuns que podem servir como uma pista para saber se o dispositivo pode executar comandos com privilégios de administrador, obter os nomes dos pacotes ou identificadores dos aplicativos mais populares como SuperSU e o próprio Magisk. No entanto, o Magisk tem sido um projeto muito participativo e permite alterar seu próprio nome e identificador de pacote para um aleatório, e alterar as propriedades do dispositivo para valores “normais” que passam despercebidos pela própria detecção.

Imagem 1. Tela inicial do aplicativo Magisk, usando a mudança aleatória de nome.

Ações para desenvolvedores interessados em melhorar a segurança de seus aplicativos

A partir das atualizações mais recentes, o aplicativo conta com um recurso Full Hide Capability. O que isso nos dá a entender? Que o processo nem sempre foi excelente. Uma publicação do pesquisador darvincisec constatou que em versões anteriores à atual, os caminhos do Magisk carregadas quando um serviço era executado não estavam sendo ocultados. Devido a isso, o serviço poderia estar rodando no mesmo ambiente do aplicativo ou em um processo diferente dependendo da configuração estabelecida no arquivo de manifesto, e se fosse um ambiente diferente do aplicativo, o serviço poderia ser usado para detectar determinados caminhos do Magisk. Isso funcionou perfeitamente em versões anteriores ao Android 9.0 + e, como destacamos anteriormente, em versões anteriores do Magisk. Porém, é importante saber como foi possível aproveitar a utilização dos serviços de detecção e considerar a aplicação das medidas mencionadas a seguir.

Muitos dos recursos do Magisk Hide surgem das detecções recomendadas por especialistas para saber se o dispositivo está enraizado ou não, e com base no framework OWASP, recomendamos verificar a existência de arquivos comuns, tais como:

  • /system/app/Superuser.apk
  • /system/etc/init.d/99SuperSUDaemon
  • /dev/com.koushikdutta.superuser.daemon/
  • /system/xbin/daemonsu
  • /sbin/su
  • /system/bin/su
  • /system/bin/failsafe/su
  • /system/xbin/su
  • /system/xbin/busybox
  • /system/sd/xbin/su
  • /data/local/su
  • /data/local/xbin/su
  • /data/local/bin/su

Validar se existem os binários correspondentes para executar comandos com privilégios elevados. Determinar sua existência tentando executar o comando su. Também é aconselhável levar em consideração os caminhos pré-definidos pelo Magisk, como mostra a imagem a seguir.

Imagem 2. Definição de arquivos e caminhos para detectar o Magisk.

Ao realizar vários testes com o projeto rootInspector, que possui implementações JNI para detectar binários comuns, é possível determinar a existência de /system/xbin/su com o fragmento de código desenvolvido em C++.

Imagem 3. Fragmento de código em C++.

Mesmo quando o Magisk Hide está ativado para o aplicativo de teste, como pode ser visto na Imagem 4, dentro dos aplicativos listados o pacote de teste com o código anterior está selecionado, e dentro das detecções que o projeto implementa pode ser visto na Imagem 5 a detecção do binário /system/xbin/su em um dispositivo com root no Android 10.

Apesar do fato de que em um sistema operacional Android 9.0+ não é possível detectar Magisk com um serviço em execução em um ambiente diferente (como mencionado acima), esperamos que isso seja útil para desenvolvedores que estão aplicando medidas contra a detecção de root.

Conclusões

A recomendação do Testing Guide do OWASP Mobile Security para o momento de implementar qualquer técnica de detecção destaca os critérios que devem ser considerados ao trabalhar em um esquema que inclui pelo menos os seguintes pontos:

  • Múltiplos métodos de detecção ao longo do desenvolvimento dos aplicativos e não apenas no início, quando o aplicativo é iniciado.
  • A implementação dos métodos em múltiplas camadas do aplicativo, a partir de um mesmo código na linguagem nativa, chamada a funções do sistema, ou por meio de serviços, utilizando a técnica descrita pelo pesquisador darvincisec.
  • O desenvolvimento de funções originais; ou seja, que tenham um grau adicional de dificuldade para evitar serem fáceis de identificar e não serem copiadas do StackOverFlow ou de algum outro recurso (claro, a ideia pode servir como base).

Considerando os pontos anteriores, vemos que é importante manter as medidas já conhecidas pela comunidade de pesquisadores que contribuem para projetos de segurança como o OWASP. No entanto, é importante mencionar que o trabalho de pesquisa e os novos recursos da própria plataforma Android devem ser aproveitados, além de aplicar os múltiplos métodos conhecidos e autodesenvolvidos para evitar que seja fácil para um atacante escapar dos mecanismos de proteção de um aplicativo.

Com o passar do tempo surgem novas técnicas, tanto para proteção quanto para evitá-las, e para que isso não vire um “jogo de gato e rato”, é importante combinar as técnicas de antiroot, antidebugging, antiemulation, e assim ter uma perspectiva maior que permita elevar o nível de segurança dos aplicativos desenvolvidos.