跳过内容

MASTG-TEST-0038: 确保应用被正确签名

已弃用测试

此测试已**弃用**,不应再使用。**原因**:MASTG V2 中提供新版本

请查看以下涵盖此 v1 测试的 MASTG v2 测试

概述

确保发布版本被正确签名,以保障其完整性并防止篡改。 随着时间的推移,Android不断发展其签名方案以增强安全性,较新版本提供了更强大的机制。

  • Android 7.0(API级别24)及以上:至少使用 v2签名方案,该方案对整个APK进行签名,与旧的v1(JAR)签名方法相比,提供更强的保护。
  • Android 9(API级别28)及以上:建议同时使用 v2和v3签名方案。 v3方案支持密钥轮换,使开发者能够在密钥泄露时更换密钥,而不会使旧签名失效。
  • Android 11(API级别30)及以上:可以选择包含 v4签名方案,以实现更快的增量更新。

避免使用 v1签名方案 (JAR 签名),除非绝对需要与 Android 6.0 (API level 23) 及以下版本向后兼容,因为它被认为是不安全的。 例如,它受到 Janus漏洞 (CVE-2017-13156) 的影响,该漏洞可能允许恶意行为者修改 APK 文件而不会使 v1 签名失效。 因此,对于运行 Android 7.0 及以上版本的设备,永远不应仅仅依赖 v1

您还应该确保 APK 的代码签名证书有效并且属于开发者。

有关更多指导,请参阅官方Android 应用签名文档配置应用以进行发布的最佳实践。

静态分析

可以使用 apksigner 工具验证APK签名。 它位于 [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

签名证书的内容也可以使用 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

签名配置可以通过 Android Studio 或 build.gradlebuild.gradle.kts 中的 signingConfigs 部分进行管理。 要同时激活 v3 和 v4 方案,必须设置以下值

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

请注意,APK v4 签名是可选的,缺少它并不代表漏洞。 它的目的是让开发者能够使用 Android 11 及以上版本中的 ADB 增量 APK 安装 快速部署大型 APK。

动态分析

应使用静态分析来验证 APK 签名。