Skip to content

MASTG-KNOW-0087: Detecção de Ferramentas de Engenharia Reversa

A presença de ferramentas, frameworks e aplicativos comumente usados por engenheiros reversos pode indicar uma tentativa de engenharia reversa do aplicativo. Algumas dessas ferramentas só podem ser executadas em um dispositivo com jailbreak, enquanto outras forçam o aplicativo a entrar em modo de depuração ou dependem da inicialização de um serviço em segundo plano no telefone móvel. Portanto, existem diferentes maneiras pelas quais um aplicativo pode implementar para detectar um ataque de engenharia reversa e reagir a ele, por exemplo, encerrando a si mesmo.

Você pode detectar ferramentas populares de engenharia reversa que foram instaladas em sua forma não modificada procurando por pacotes de aplicativos associados, arquivos, processos ou outras modificações e artefatos específicos da ferramenta. Nos exemplos a seguir, discutiremos diferentes maneiras de detectar o framework de instrumentação Frida, que é amplamente utilizado neste guia e também no mundo real. Outras ferramentas, como o ElleKit, podem ser detectadas de maneira similar. Observe que ferramentas de injeção, hooking e DBI (Instrumentação Binária Dinâmica) podem frequentemente ser detectadas implicitamente, por meio de verificações de integridade em tempo de execução, que são discutidas abaixo.

Bypass:

As etapas a seguir devem orientá-lo ao contornar a detecção de ferramentas de engenharia reversa:

  1. Faça patch da funcionalidade anti-engenharia reversa. Desative o comportamento indesejado aplicando patch no binário usando radare2/iaito ou Ghidra.
  2. Use Frida ou ElleKit para fazer hook de APIs do sistema de arquivos nas camadas Objective-C/Swift ou nativas. Retorne um handle para o arquivo original, não o arquivo modificado.

Detecção do Frida

O Frida é executado sob o nome de frida-server em sua configuração padrão (modo injetado) em um dispositivo com jailbreak. Quando você anexa explicitamente a um aplicativo alvo (por exemplo, via frida-trace ou o CLI do Frida), o Frida injeta um frida-agent na memória do aplicativo. Portanto, você pode esperar encontrá-lo lá após anexar ao aplicativo (e não antes). No Android, verificar isso é bastante simples, pois você pode simplesmente usar grep para a string "frida" nos mapas de memória do ID do processo no diretório proc (/proc/<pid>/maps). No entanto, no iOS o diretório proc não está disponível, mas você pode listar as bibliotecas dinâmicas carregadas em um aplicativo com a função _dyld_image_count.

O Frida também pode ser executado no chamado modo embutido, que também funciona para dispositivos sem jailbreak. Ele consiste em embutir um frida-gadget no IPA e forçar o aplicativo a carregá-lo como uma de suas bibliotecas nativas.

O conteúdo estático do aplicativo, incluindo seu binário compilado para ARM e suas bibliotecas externas, é armazenado dentro do diretório <Application>.app. Se você inspecionar o conteúdo do diretório /var/containers/Bundle/Application/<UUID>/<Application>.app, encontrará o frida-gadget embutido como FridaGadget.dylib.

iPhone:/var/containers/Bundle/Application/AC5DC1FD-3420-42F3-8CB5-E9D77C4B287A/SwiftSecurity.app/Frameworks root# ls -alh
total 87M
drwxr-xr-x 10 _installd _installd  320 Nov 19 06:08 ./
drwxr-xr-x 11 _installd _installd  352 Nov 19 06:08 ../
-rw-r--r--  1 _installd _installd  70M Nov 16 06:37 FridaGadget.dylib
-rw-r--r--  1 _installd _installd 3.8M Nov 16 06:37 libswiftCore.dylib
-rw-r--r--  1 _installd _installd  71K Nov 16 06:37 libswiftCoreFoundation.dylib
-rw-r--r--  1 _installd _installd 136K Nov 16 06:38 libswiftCoreGraphics.dylib
-rw-r--r--  1 _installd _installd  99K Nov 16 06:37 libswiftDarwin.dylib
-rw-r--r--  1 _installd _installd 189K Nov 16 06:37 libswiftDispatch.dylib
-rw-r--r--  1 _installd _installd 1.9M Nov 16 06:38 libswiftFoundation.dylib
-rw-r--r--  1 _installd _installd  76K Nov 16 06:37 libswiftObjectiveC.dylib

Observando esses rastros que o Frida deixa para trás, você já pode imaginar que detectar o Frida seria uma tarefa trivial. E embora seja trivial detectar essas bibliotecas, é igualmente trivial contornar tal detecção. A detecção de ferramentas é um jogo de gato e rato e as coisas podem ficar muito mais complicadas. A tabela a seguir apresenta brevemente um conjunto de alguns métodos típicos de detecção do Frida e uma breve discussão sobre sua eficácia.

Alguns dos seguintes métodos de detecção são implementados em IOSSecuritySuite

Método Descrição Discussão
Verificar o Ambiente por Artefatos Relacionados Artefatos podem ser arquivos empacotados, binários, bibliotecas, processos e arquivos temporários. Para o Frida, isso poderia ser o frida-server em execução no sistema alvo (com jailbreak) (o daemon responsável por expor o Frida via TCP) ou as bibliotecas do Frida carregadas pelo aplicativo. Inspecionar serviços em execução não é possível para um aplicativo iOS em um dispositivo sem jailbreak. O método Swift CommandLine não está disponível no iOS para consultar informações sobre processos em execução, mas existem maneiras não oficiais, como usar NSTask. No entanto, ao usar esse método, o aplicativo será rejeitado durante o processo de revisão da App Store. Não há outra API pública disponível para consultar processos em execução ou executar comandos do sistema dentro de um aplicativo iOS. Mesmo que fosse possível, contornar isso seria tão fácil quanto renomear o artefato correspondente do Frida (frida-server/frida-gadget/frida-agent). Outra maneira de detectar o Frida seria percorrer a lista de bibliotecas carregadas e verificar se há alguma suspeita (por exemplo, aquelas que incluem "frida" em seus nomes), o que pode ser feito usando _dyld_get_image_name.
Verificar Portas TCP Abertas O processo frida-server vincula-se à porta TCP 27042 por padrão. Testar se essa porta está aberta é outro método de detectar o daemon. Este método detecta o frida-server em seu modo padrão, mas a porta de escuta pode ser alterada via argumento de linha de comando, então contornar isso é muito trivial.
Verificar Portas que Respondem à Autenticação D-Bus O frida-server usa o protocolo D-Bus para comunicação, então você pode esperar que ele responda à autenticação D-Bus AUTH. Envie uma mensagem D-Bus AUTH para cada porta aberta e verifique se há uma resposta, na esperança de que o frida-server se revele. Este é um método bastante robusto de detectar o frida-server, mas o Frida oferece modos alternativos de operação que não requerem o frida-server.

Lembre-se de que esta tabela está longe de ser exaustiva. Por exemplo, outros dois possíveis mecanismos de detecção são:

Ambos ajudariam a detectar o Substrate ou o Interceptor do Frida, mas, por exemplo, não serão eficazes contra o Stalker do Frida. Lembre-se de que o sucesso de cada um desses métodos de detecção dependerá de você estar usando um dispositivo com jailbreak, a versão específica do jailbreak e do método e/ou a versão da própria ferramenta. No final, isso faz parte do jogo de gato e rato de proteger dados sendo processados em um ambiente não controlado (o dispositivo do usuário final).