Skip to content

Detecção de mecanismos de proteção binária

A detecção da presença de mecanismos de proteção binária depende fortemente da linguagem utilizada para desenvolver o aplicativo.

Em geral, todos os binários devem ser testados, o que inclui tanto o executável principal do aplicativo quanto todas as bibliotecas/dependências. No entanto, no Android, focaremos nas bibliotecas nativas, uma vez que os executáveis principais são considerados seguros, como veremos a seguir.

O Android otimiza seu bytecode Dalvik a partir dos arquivos DEX do aplicativo (por exemplo, classes.dex) e gera um novo arquivo contendo o código nativo, geralmente com extensão .odex ou .oat. Este binário compilado do Android (consulte "Compiled App Binary" em Explorando o Pacote do Aplicativo) é encapsulado usando o formato ELF, que é o formato usado pelo Linux e Android para empacotar código assembly.

As bibliotecas nativas do NDK do aplicativo (consulte "Native Libraries" em Explorando o Pacote do Aplicativo) também usam o formato ELF.

  • PIE (Position Independent Executable - Executável Independente de Posição):
    • Desde o Android 7.0 (nível de API 24), a compilação PIC está habilitada por padrão para os executáveis principais.
    • Com o Android 5.0 (nível de API 21), o suporte para bibliotecas nativas não habilitadas para PIE foi descontinuado e, desde então, o PIE é imposto pelo linker.
  • Gerenciamento de memória:
    • A coleta de lixo (Garbage Collection) simplesmente será executada para os binários principais e não há nada a ser verificado nos próprios binários.
    • A coleta de lixo não se aplica a bibliotecas nativas do Android. O desenvolvedor é responsável por fazer um gerenciamento manual de memória adequado. Consulte "Bugs de Corrupção de Memória".
  • Proteção contra Stack Smashing:
    • Os aplicativos Android são compilados para bytecode Dalvik, que é considerado seguro em termos de memória (pelo menos para mitigar estouros de buffer). Outros frameworks, como o Flutter, não compilam usando canários de stack devido à forma como sua linguagem, neste caso o Dart, mitiga estouros de buffer.
    • Deve ser habilitado para bibliotecas nativas do Android, mas pode ser difícil determiná-lo completamente.
      • As bibliotecas NDK devem tê-lo habilitado, pois o compilador o faz por padrão.
      • Outras bibliotecas personalizadas em C/C++ podem não tê-lo habilitado.

Saiba mais: