Skip to content

MASTG-TEST-0038: Garantindo que o Aplicativo Esteja Corretamente Assinado

Deprecated Test

This test is deprecated and should not be used anymore. Reason: Nova versão disponível no MASTG V2

Please check the following MASTG v2 tests that cover this v1 test:

Visão Geral

Garanta que as builds de release sejam devidamente assinadas para proteger sua integridade e evitar adulterações. O Android evoluiu seus esquemas de assinatura ao longo do tempo para melhorar a segurança, com versões mais recentes oferecendo mecanismos mais robustos.

  • Android 7.0 (API level 24) e superior: Use pelo menos o esquema de assinatura v2, que assina o APK como um todo, fornecendo proteção mais forte em comparação com o método de assinatura v1 (JAR) mais antigo.
  • Android 9 (API level 28) e superior: É recomendado usar os esquemas de assinatura v2 e v3. O esquema v3 suporta rotação de chaves, permitindo que desenvolvedores substituam chaves em caso de comprometimento sem invalidar assinaturas antigas.
  • Android 11 (API level 30) e superior: Opcionalmente, inclua o esquema de assinatura v4 para permitir atualizações incrementais mais rápidas.

Evite usar o esquema de assinatura v1 (assinatura JAR), a menos que seja absolutamente necessário para compatibilidade com versões anteriores do Android 6.0 (API level 23) e inferiores, pois é considerado inseguro. Por exemplo, ele é afetado pela vulnerabilidade Janus (CVE-2017-13156), que pode permitir que agentes maliciosos modifiquem arquivos APK sem invalidar a assinatura v1. Portanto, a v1 nunca deve ser usada exclusivamente para dispositivos que executam Android 7.0 e superior.

Você também deve garantir que o certificado de assinatura de código do APK seja válido e pertença ao desenvolvedor.

Para mais orientações, consulte a documentação oficial de assinatura de aplicativos Android e as melhores práticas para configurar aplicativos para release.

Análise Estática

As assinaturas de APK podem ser verificadas com a ferramenta apksigner. Ela está localizada em [SDK-Path]/build-tools/[version]/apksigner.

$ apksigner verify --verbose example.apk
Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Verified using v3.1 scheme (APK Signature Scheme v3.1): false
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1

O conteúdo do certificado de assinatura também pode ser examinado com o apksigner:

$ apksigner verify --print-certs --verbose example.apk
[...]
Signer #1 certificate DN: CN=Example Developers, OU=Android, O=Example
Signer #1 certificate SHA-256 digest: 1fc4de52d0daa33a9c0e3d67217a77c895b46266ef020fad0d48216a6ad6cb70
Signer #1 certificate SHA-1 digest: 1df329fda8317da4f17f99be83aa64da62af406b
Signer #1 certificate MD5 digest: 3dbdca9c1b56f6c85415b67957d15310
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 296b4e40a31de2dcfa2ed277ccf787db0a524db6fc5eacdcda5e50447b3b1a26
Signer #1 public key SHA-1 digest: 3e02ebf64f1bd4ca85732186b3774e9ccd60cb86
Signer #1 public key MD5 digest: 24afa3496f98c66343fc9c8a0a7ff5a2

A configuração de assinatura pode ser gerenciada pelo Android Studio ou pela seção signingConfigs em build.gradle ou build.gradle.kts. Para ativar os esquemas v3 e v4, os seguintes valores devem ser definidos:

// build.gradle
android {
  ...
  signingConfigs {
    config {
        ...
        enableV3Signing true
        enableV4Signing true
    }
  }
}

Observe que a assinatura v4 de APK é opcional e a ausência dela não representa uma vulnerabilidade. Ela foi criada para permitir que desenvolvedores implantem rapidamente APKs grandes usando a instalação incremental de APK via ADB no Android 11 e superior.

Análise Dinâmica

A análise estática deve ser usada para verificar a assinatura do APK.