☰
MASTG 最佳实践:在 Android 应用中更新 GMS Security Provider,抵御过时 SSL/TLS 实现带来的已知漏洞
2026/10/5 2:00:01 网站建设 项目流程
  • 文档
  • 教程
  • 网络安全

【免费下载链接】mastg

The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.

项目地址:https://gitcode.com/gh_mirrors/ow/mastg
点击查看免费下载

Android 设备的系统版本与安全补丁更新频率参差不齐,仅依赖操作系统内置的密码学组件,会让应用长期暴露在过时的 SSL/TLS 实现与已知漏洞之下。本篇技术指南围绕 OWASP MASTG 最佳实践 MASTG-BEST-0020(Update the GMS Security Provider) 展开,说明如何在应用启动早期通过 Google Play Services 分发的 Security Provider 独立更新 OpenSSL、TrustManager 等关键组件,并给出无 Google Play Services 设备(如华为机型、亚马逊平板、AOSP ROM)上捆绑 Conscrypt 的替代方案。读完本文,你将掌握 Security Provider 的底层机制、更新时机与调用方式、兼容性注意事项,以及如何用仓库内的测试用例与静态分析规则验证实现是否符合该最佳实践。

为什么仅依赖 Android 平台安全是不够的

Android 系统的密码学与 TLS 实现并非随应用同步更新:不同机型、不同厂商、不同年份的设备,其系统版本和安全补丁覆盖程度差异巨大,很多老旧或未及时修补的设备仍在使用存在已知漏洞的 SSL/TLS 组件。

Android 的加密能力基于 Java Cryptography Architecture(JCA)构建,由若干个security provider通过java.security.Provider类提供,负责实现 Java 安全服务并支撑基于 SSL/TLS 的连接(参见 Document/0x05e-Testing-Cryptography.md)。这些 provider 的构成随 Android 版本和 OEM 定制系统而变化,其中随设备出厂内置的 provider(例如 OpenSSL)往往长期得不到漏洞修复(参见 MASTG-KNOW-0011)。

对应用开发者而言,后果是直接且现实的:

  • 设备内置 OpenSSL 等组件的已知漏洞无法由应用控制,网络通信安全性取决于设备运气;
  • 自 2016 年 7 月 11 日起,Google 已拒绝(无论是新应用还是更新)使用易受攻击 OpenSSL 版本的 Play Store 应用提交(参见 MASTG-KNOW-0011)。

因此,正确做法不是"信任设备",而是主动将关键密码学组件更新到最新——这正是 MASTG-BEST-0020 的核心主张。

什么是 GMS Security Provider

GMS Security Provider(Google Mobile Services Security Provider)通过 Google Play Services 分发,能够在独立于 Android 操作系统的前提下更新关键密码学组件,例如:

  • OpenSSL:支撑 TLS/SSL 连接与大量对称/非对称算法的底层实现;
  • TrustManager:负责证书信任链校验的组件,是防止中间人攻击的关键环节。

由于 Google Play Services 的更新频率远高于 Android 系统版本,使用该机制可以保证即使设备系统较旧,应用也能获得相对较新的加密实现,从而保障安全的网络通信(参见 MASTG-BEST-0020)。

值得补充的是:在较新的 Android 版本中,系统默认使用的密码学后端正是Conscrypt(即AndroidOpenSSLprovider 的现代形态)。MASTG-KNOW-0011 指出,开发者应确保应用安装了合适的 security provider;同时 Document/0x05e-Testing-Cryptography.md 记录了 Android 8.1(API level 27)起 Conscrypt 获得的新实现清单(如AlgorithmParameters:GCM、KeyGenerator:AES、Signature:NONEWITHECDSA等),并说明套接字实现由OpenSSLSocketImpl迁移为ConscryptFileDescriptorSocket、ConscryptEngineSocket——这也解释了为何保持 provider 处于最新状态对 TLS 连接至关重要。

更新时机:在应用启动早期完成

MASTG-BEST-0020 强调了一个关键操作时机:

强烈建议在应用启动早期检查并更新 Security Provider,理想情况下应在建立任何安全网络连接之前完成(参见 MASTG-BEST-0020)。

原因很直观:一旦应用进程内已有基于旧 provider 建立的 TLS 会话或缓存的密码学服务,后续更新可能无法彻底生效;而所有 SSL/TLS 连接、证书校验、加解密操作都会经过 provider 分发。最稳妥的做法是在Application.onCreate()或首个网络请求之前执行检查与更新,确保后续所有安全操作都落在已修补的实现上。

官方推荐的更新方式

Android 官方为这一场景提供了android.security.ProviderInstaller机制:它会在启动时检查 Google Play Services 分发的 Security Provider 是否为最新,必要时安装更新。常见的调用形态如下(同步版本):

import android.security.ProviderInstaller; try { // 同步更新:在后台线程或启动早期调用 ProviderInstaller.installIfNeeded(context); } catch (GooglePlayServicesRepairableException e) { // Google Play Services 需要更新/修复,可引导用户处理 } catch (GooglePlayServicesNotAvailableException e) { // Google Play Services 不可用(常见于非 GMS 设备) }

更推荐使用异步版本,避免在启动路径上阻塞主线程:

ProviderInstaller.installIfNeededAsync( applicationContext, new ProviderInstaller.ProviderInstallListener() { @Override public void onProviderInstalled() { // Security Provider 已是最新,可以安全地建立 TLS 连接 } @Override public void onProviderInstallFailed(int errorCode, Intent recoveryIntent) { // 处理失败:可提示用户,或回退到捆绑的 TLS 库(见下文) } });

提示:关于完整的 API 细节与返回值处理,请以 Android 官方文档 "Updating Your Security Provider to Protect Against SSL Exploits" 为准(MASTG-BEST-0020 已引用该文档)。

兼容性:显式指定 provider 的风险与版本变迁

与"主动更新 provider"相辅相成的一个最佳实践是:不要硬编码(显式指定)provider。MASTG 仓库中的相关测试与规则系统性地印证了这一点。

各版本关键变更

Android 版本关键变更
Android 7.0(API 24)官方建议停止显式指定 security provider;Cryptoprovider 开始被弃用,其SHA1PRNG不再安全(见 Document/0x05e-Testing-Cryptography.md)
Android 8.1(API 27)Conscrypt(AndroidOpenSSL)新增多项算法实现,优先于 Bouncy Castle(见 Document/0x05e-Testing-Cryptography.md)
Android 9(API 28)指定 provider 会触发警告(target < 28)或报错(target ≥ 28);Cryptoprovider 被移除,调用将抛出NoSuchProviderException(见 Document/0x05e-Testing-Cryptography.md)
Android 12(API 31)BouncyCastle(BC)provider 被移除(见 MASTG-TEST-0312)

仓库中的验证证据

MASTG-DEMO-0075 提供了同时包含安全与不安全用法的示例代码(MastgTest.kt),其中:

  • Cipher.getInstance("AES/GCM/NoPadding", "BC")显式指定 BouncyCastle,自 Android 9 弃用、Android 12 移除(MastgTest.kt#L127);
  • Cipher.getInstance("AES/CBC/PKCS5Padding", "CustomProvider")使用自定义 provider,可能缺乏定期更新与修补(MastgTest.kt#L144);
  • 而KeyStore.getInstance("AndroidKeyStore")、KeyGenerator.getInstance("AES")、Cipher.getInstance("AES/GCM/NoPadding")等不显式指定 provider的调用均被判定为 PASS(MastgTest.kt#L108-L124)。

对应的静态分析规则 mastg-android-hardcoded-security-provider.yaml 通过 semgrep 匹配$X.getInstance($ALGO, $PROVIDER)形态的调用,同时放行唯一合法特例KeyStore.getInstance("AndroidKeyStore"),并在 message 中提示:"Do not hardcode a provider unless using AndroidKeyStore"。

测试用例 MASTG-TEST-0312 总结了判定标准:

该测试失败,当任何getInstance调用显式指定了除AndroidKeyStore(用于 KeyStore 操作)以外的 security provider 时(参见 MASTG-TEST-0312#L32)。

通用建议总结

  • 应停止显式指定 provider,使用默认实现(AndroidOpenSSL/Conscrypt);
  • 仅在 Android Keystore 系统场景下显式指定 provider(KeyStore.getInstance("AndroidKeyStore"));
  • 应停止使用已弃用的Cryptoprovider 及其SHA1PRNG;
  • 确保 security provider 保持最新(参见 Document/0x05e-Testing-Cryptography.md#L58-L63)。

无 Google Play Services 设备:运行时检测与 Conscrypt 捆绑方案

GMS Security Provider 依赖 Google Play Services 分发,因此它天然无法覆盖没有 GMS 的设备——典型如华为设备、亚马逊平板、基于 AOSP 的定制 ROM。MASTG-BEST-0020 明确要求:如果应用需要同时支持有 GMS 和无 GMS 的设备,必须在运行时检测 Play Services 可用性,并据此分流处理(MASTG-BEST-0020):

  • GMS 设备:使用 Security Provider 机制保持密码学库最新;
  • 非 GMS 设备:考虑捆绑一个安全的 TLS 库(如 Conscrypt),保证整个设备舰队网络安全的一致性。

运行时分流逻辑示意:

if (isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS) { // GMS 设备:走 ProviderInstaller 更新路径 ProviderInstaller.installIfNeededAsync(context, listener); } else { // 非 GMS 设备:注册捆绑的 Conscrypt provider(见下文) Security.addProvider(Conscrypt.newProvider()); }

捆绑 Conscrypt:面向旧版本与无 GMS 场景的统一选择

Conscrypt 不仅适用于非 GMS 设备,对仅支持低于 Android 7.0(API level 24)的旧系统应用来说,捆绑最新库往往是唯一选项。相比引入体积更大的 Bouncy Castle,Conscrypt 更轻量,且能在不同 API level 之间保持一致的加密行为(参见 MASTG-KNOW-0011)。

Gradle 依赖引入方式:

dependencies { implementation 'org.conscrypt:conscrypt-android:last_version' }

说明:示例中使用last_version占位,实际集成时请替换为当前最新发布版本号。

引入后需在应用中注册 provider:

Security.addProvider(Conscrypt.newProvider())

注册之后,基于 JCA 的Cipher、KeyGenerator、Signature以及 TLS 套接字等操作便会优先经由 Conscrypt 提供实现。

验证手段:如何检查当前 Security Provider

无论采用哪种更新路径,都可以用以下代码枚举当前进程内所有已注册的 security provider,用于调试与验证(完整示例见 MASTG-KNOW-0011):

StringBuilder builder = new StringBuilder(); for (Provider provider : Security.getProviders()) { builder.append("provider: ") .append(provider.getName()) .append(" ") .append(provider.getVersion()) .append("(") .append(provider.getInfo()) .append(")\n"); } String providers = builder.toString(); // 在屏幕上展示或写入日志,用于调试

以下是 Android 9(API level 28)带 Google Play APIs 模拟器的典型输出(参见 MASTG-KNOW-0011):

provider: AndroidNSSP 1.0(Android Network Security Policy Provider) provider: AndroidOpenSSL 1.0(Android's OpenSSL-backed security provider) provider: CertPathProvider 1.0(Provider of CertPathBuilder and CertPathVerifier) provider: AndroidKeyStoreBCWorkaround 1.0(Android KeyStore security provider to work around Bouncy Castle) provider: BC 1.57(BouncyCastle Security Provider v1.57) provider: HarmonyJSSE 1.0(Harmony JSSE Provider) provider: AndroidKeyStore 1.0(Android KeyStore security provider)

可以看到AndroidOpenSSL(Conscrypt 的实现入口)是默认 TLS 后端;而BC正是 MASTG-TEST-0312 所警告的、在 Android 12 中已被移除的 provider。仓库示例代码 MastgTest.kt#L152-L157 也包含同样的枚举逻辑,可作为集成测试时的对照实现。

落地清单

将 MASTG-BEST-0020 转化为工程实践时,可按下述清单逐项自查:

  1. 启动早期更新:在Application.onCreate()或首个安全网络连接之前调用ProviderInstaller检查/更新 Security Provider;
  2. 运行时区分设备:检测 Google Play Services 可用性,GMS 设备走 Security Provider 路径,非 GMS 设备(华为、亚马逊平板、AOSP ROM)注册捆绑的 Conscrypt;
  3. 移除显式 provider:审查所有getInstance调用,除KeyStore.getInstance("AndroidKeyStore")外不指定 provider 名称;可用 mastg-android-hardcoded-security-provider.yaml 规则做静态扫描;
  4. 验证版本:通过Security.getProviders()枚举确认AndroidOpenSSL(Conscrypt)为默认实现,并按 MASTG-TEST-0312 的判定标准执行检查;
  5. 回归测试:将 provider 枚举与更新逻辑纳入自动化测试,避免后续改动重新引入过时依赖或硬编码 provider。

坚持"启动早期更新 + 无 GMS 时捆绑 Conscrypt + 不显式指定 provider"这三条主线,即可让应用在碎片化的 Android 生态中保持一致的、可修补的 SSL/TLS 与密码学基线,这正是 MASTG-BEST-0020 希望开发者内化的核心安全习惯。

  • 文档
  • 教程
  • 网络安全

【免费下载链接】mastg

The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.

项目地址:https://gitcode.com/gh_mirrors/ow/mastg
点击查看免费下载

相关推荐

上一篇:15分钟完成黑苹果配置:OpCore-Simplify图形化EFI生成工具详解
下一篇:OpenCore Legacy Patcher终极指南:一键解决Mac升级兼容性问题

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询