MASTG-TEST-0038: 确保应用被正确签名
概述¶
确保发布版本被正确签名,以保障其完整性并防止篡改。 随着时间的推移,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.gradle
或 build.gradle.kts
中的 signingConfigs
部分进行管理。 要同时激活 v3 和 v4 方案,必须设置以下值
// build.gradle
android {
...
signingConfigs {
config {
...
enableV3Signing true
enableV4Signing true
}
}
}
请注意,APK v4 签名是可选的,缺少它并不代表漏洞。 它的目的是让开发者能够使用 Android 11 及以上版本中的 ADB 增量 APK 安装 快速部署大型 APK。
动态分析¶
应使用静态分析来验证 APK 签名。