Pular para o conteúdo principal

Assinatura de Aplicações Android

Para instalar ou publicar um APK, ele precisa estar assinado. Isso protege o pacote contra modificações maliciosas.

Evolução dos Esquemas de Assinatura

VersãoAndroidCaracterísticas
v1 (JAR Signing)≤ 7.0Não protege todo o conteúdo do APK
v2≥ 7.0Protege todo o APK exceto o bloco de assinatura
v3≥ 9.0Permite metadados extras no bloco de assinatura
v4≥ 11Usa Merkle hash tree, armazenamento externo ao APK
observação

A v4 precisa obrigatoriamente de uma v2 ou v3 junto.

Validação de Assinaturas — Fluxo

Quando o Android instala um APK, o sistema verifica a assinatura seguindo a hierarquia:

Implicações de Segurança por Versão da Assinatura de APK

CampoDescrição
ProblemaSó protege os arquivos listados no META-INF/MANIFEST.MF e META-INF/CERT.SF.
FalhaNão cobre os metadados ZIP do APK. Isso permitia ataques de tampering onde arquivos maliciosos eram adicionados ou partes não verificadas do APK eram modificadas sem invalidar a assinatura.
PentestSe o app for assinado apenas com v1 e instalado em um Android < 7 ou sem suporte a v2+, é possível alterar recursos no APK (como assets ou arquivos no ZIP) sem quebrar a assinatura, ou explorar técnicas conhecidas como Janus vulnerability (CVE-2017-13156), onde era possível incluir um arquivo DEX adicional sem invalidar a assinatura.

Explorações típicas que surgem por versões fracas

  • Tampering de APKs assinados apenas com v1
  • Ataques Janus (CVE-2017-13156) em versões sem patch
  • Downgrade attacks: substituir um APK v2/v3 por outro apenas com v1 em dispositivos antigos ou mal configurados
  • Inserção de payloads não verificados em metadados ou áreas não cobertas pela assinatura v1
  • Troca de arquivos após assinatura em builds vulneráveis que ainda aceitam v1

Como validar isso em pentest:

  1. Checar versões de assinatura com apksigner verify --verbose nome.apk
  2. Comparar permissões ou flags estranhas nos metadados
  3. Verificar coexistência de múltiplos blocos de assinatura (v1 + v2, por exemplo) — o Android aceita mais de um bloco, o que pode gerar conflitos se a verificação de integridade não for bem feita

Assinando um APK

Para que um aplicativo Android seja instalado em um dispositivo ou publicado na Play Store, ele precisa estar assinado digitalmente. A assinatura garante a integridade do APK e impede alterações não autorizadas.

Formas de assinar um APK:

  • Pelo Android Studio, usando a opção Build > Generate Signed App Bundle / APK.
  • Via ferramentas de linha de comando: jarsigner e apksigner.
  • Usando o serviço Play App Signing do Google Play.

Os certificados usados para assinar APKs são self-signed — ou seja, não requerem uma autoridade certificadora externa.

Exemplo de assinatura via CLI:

Exemplo de um processo de assinatura de .apk
# Cria um arquivo com os parâmetros para o keytool
echo -e "password\npassword\njohn doe\ntest\ntest\ntest\ntest\ntest\nyes" > params.txt

# Gera um par de chaves RSA, armazenado em key.keystore
cat params.txt | keytool -genkey -keystore key.keystore -validity 1000 -keyalg RSA -alias john

# Alinha o APK para otimizar o acesso a arquivos via mmap
zipalign -p -f -v 4 myapp.apk myapp_signed.apk

# Assina o APK usando apksigner e a keystore criada
echo password | apksigner sign --ks key.keystore myapp_signed.apk
EtapaDescrição
params.txtCria um arquivo contendo as respostas automáticas para o keytool
keytoolGera um par de chaves RSA e armazena na keystore key.keystore
zipalignAlinha os arquivos do APK para permitir acesso eficiente via mmap. Cria myapp_signed.apk
apksignerAssina digitalmente o APK usando a chave contida em key.keystore e o password fornecido

Outra forma mais simples, e que eu costumo utilizar:

Exemplo de um processo de assinatura de .apk
# Criar um certificado / keystore para assinar o apk modificado
keytool -genkey -V -keystore key.keystore -alias APKtool -keyalg RSA -keysize 2048 -validity 10000

# Assinar o APK modificado com o certificado criado
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore key.keystore [name].apk APKtool