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: