资讯动态

MASTG 最佳实践:在 Android 应用中更新 GMS Security Provider,抵御过时 SSL/TLS 实现带来的已知漏洞

发布时间:2026/10/5 2:00:04 来源:尧图企业网站定制
文档教程网络安全【免费下载链接】mastgThe 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-0020Update 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 ArchitectureJCA构建由若干个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 ProviderGMS Security ProviderGoogle 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.1API 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.0API 24官方建议停止显式指定 security providerCryptoprovider 开始被弃用其SHA1PRNG不再安全见 Document/0x05e-Testing-Cryptography.mdAndroid 8.1API 27ConscryptAndroidOpenSSL新增多项算法实现优先于 Bouncy Castle见 Document/0x05e-Testing-Cryptography.mdAndroid 9API 28指定 provider 会触发警告target 28或报错target ≥ 28Cryptoprovider 被移除调用将抛出NoSuchProviderException见 Document/0x05e-Testing-Cryptography.mdAndroid 12API 31BouncyCastleBCprovider 被移除见 MASTG-TEST-0312仓库中的验证证据MASTG-DEMO-0075 提供了同时包含安全与不安全用法的示例代码MastgTest.kt其中Cipher.getInstance(AES/GCM/NoPadding, BC)显式指定 BouncyCastle自 Android 9 弃用、Android 12 移除MastgTest.kt#L127Cipher.getInstance(AES/CBC/PKCS5Padding, CustomProvider)使用自定义 provider可能缺乏定期更新与修补MastgTest.kt#L144而KeyStore.getInstance(AndroidKeyStore)、KeyGenerator.getInstance(AES)、Cipher.getInstance(AES/GCM/NoPadding)等不显式指定 provider的调用均被判定为 PASSMastgTest.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 系统场景下显式指定 providerKeyStore.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-0020GMS 设备使用 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.0API level 24的旧系统应用来说捆绑最新库往往是唯一选项。相比引入体积更大的 Bouncy CastleConscrypt 更轻量且能在不同 API level 之间保持一致的加密行为参见 MASTG-KNOW-0011。Gradle 依赖引入方式dependencies { implementation org.conscrypt:conscrypt-android:last_version }说明示例中使用last_version占位实际集成时请替换为当前最新发布版本号。引入后需在应用中注册 providerSecurity.addProvider(Conscrypt.newProvider())注册之后基于 JCA 的Cipher、KeyGenerator、Signature以及 TLS 套接字等操作便会优先经由 Conscrypt 提供实现。验证手段如何检查当前 Security Provider无论采用哪种更新路径都可以用以下代码枚举当前进程内所有已注册的 security provider用于调试与验证完整示例见 MASTG-KNOW-0011StringBuilder 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 9API level 28带 Google Play APIs 模拟器的典型输出参见 MASTG-KNOW-0011provider: AndroidNSSP 1.0(Android Network Security Policy Provider) provider: AndroidOpenSSL 1.0(Androids 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)可以看到AndroidOpenSSLConscrypt 的实现入口是默认 TLS 后端而BC正是 MASTG-TEST-0312 所警告的、在 Android 12 中已被移除的 provider。仓库示例代码 MastgTest.kt#L152-L157 也包含同样的枚举逻辑可作为集成测试时的对照实现。落地清单将 MASTG-BEST-0020 转化为工程实践时可按下述清单逐项自查启动早期更新在Application.onCreate()或首个安全网络连接之前调用ProviderInstaller检查/更新 Security Provider运行时区分设备检测 Google Play Services 可用性GMS 设备走 Security Provider 路径非 GMS 设备华为、亚马逊平板、AOSP ROM注册捆绑的 Conscrypt移除显式 provider审查所有getInstance调用除KeyStore.getInstance(AndroidKeyStore)外不指定 provider 名称可用 mastg-android-hardcoded-security-provider.yaml 规则做静态扫描验证版本通过Security.getProviders()枚举确认AndroidOpenSSLConscrypt为默认实现并按 MASTG-TEST-0312 的判定标准执行检查回归测试将 provider 枚举与更新逻辑纳入自动化测试避免后续改动重新引入过时依赖或硬编码 provider。坚持启动早期更新 无 GMS 时捆绑 Conscrypt 不显式指定 provider这三条主线即可让应用在碎片化的 Android 生态中保持一致的、可修补的 SSL/TLS 与密码学基线这正是 MASTG-BEST-0020 希望开发者内化的核心安全习惯。赞分享文档教程网络安全【免费下载链接】mastgThe 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点击查看免费下载相关推荐0.8秒革命性视频修复SeedVR-7B如何颠覆传统超分辨率技术0.8秒革命性视频修复SeedVR 7B如何颠覆传统超分辨率技术 在数字内容爆炸式增长的时代我们每天都在消费海量的视频内容。然而从老旧的家庭录像到模糊的监基础模型计算机视觉深度学习nodeppt安全更新指南及时修复已知风险nodeppt安全更新指南及时修复已知风险 你是否曾因项目依赖的安全风险而焦虑作为基于Node.js的Web演示工具nodeppt的安全维护至关重要。本文前端CLI现代 Python 安全实践从加密原语到 TLS 配置与漏洞防御pysheeet Security 指南现代 Python 安全实践从加密原语到 TLS 配置与漏洞防御pysheeet Security 指南 导读 本文围绕 pysheeet 仓库 docs文档教程开发工具上一篇15分钟完成黑苹果配置OpCore-Simplify图形化EFI生成工具详解下一篇OpenCore Legacy Patcher终极指南一键解决Mac升级兼容性问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑