跳过内容

MASWE-0047: 不安全的身份固定

Beta 版内容

此内容处于 beta 版,仍在积极开发中,因此随时可能发生变化(例如结构、ID、内容、URL 等)。

发送反馈

概述

身份固定(也称作证书固定、公钥固定或 TLS 固定)指将移动应用程序与特定的密码身份(如证书或公钥)关联起来,以确保应用程序只与受信任的服务器通信。

当移动应用程序未实现证书固定,或者实现不正确时,应用程序仍然容易受到中间人 (MITM) 攻击,这使攻击者能够拦截和修改应用程序与目标服务器之间的通信。发生这种情况是因为当应用程序被呈现一个应用程序可能在不知情的情况下信任的欺诈性证书时,从而获取敏感数据或向数据流注入恶意内容。

局限性:证书固定通过确保应用程序只接受与具有特定预定证书或公钥的服务器的连接,从而增加了一层信任验证。这降低了未经授权拦截的风险,即使受信任的证书颁发机构 (CA) 被攻陷。然而,它并非万无一失。

  • 能够对应用程序进行逆向工程的攻击者可能会分析并移除或修改预定义的固定项或证书固定逻辑,以永久绕过检查。
  • 能够执行 篡改和运行时插桩技术的攻击者,可以操纵应用程序并绕过固定检查。

这强调了实现证书固定**结合其他安全措施**的重要性,以增强应用程序对高级威胁的抵抗能力。

影响

  • 数据拦截:攻击者可以捕获和读取通过网络传输的敏感信息。
  • 数据操纵:攻击者可能会更改传输中的数据,导致数据损坏或注入恶意内容。
  • 数据泄露:敏感信息可能被泄露。
  • 拒绝服务:不正确的固定可能会导致合法连接失败,从而导致用户服务中断。例如,如果一个固定的证书过期且未更新,应用程序可能无法建立安全连接。

引入方式

  • 固定库配置不当:错误配置 TrustKit、OkHttp 的 CertificatePinner、Volley 或 AFNetworking 的 SSLPinningMode 等库,导致固定无效。
  • 不安全的动态固定:通过不安全的通道动态检索固定项,且没有进行适当的验证,使攻击者容易提供恶意固定项。
  • 不当的验证逻辑:自定义的固定实现未正确验证证书链或公钥。例如,接受任何链接到受信任根 CA 的证书,而不是特定的证书或公钥。
  • 缺少备用固定项:未包含备用固定项,以防止主固定项失效时出现连接问题。

缓解措施

  • 优先使用平台提供的解决方案:使用平台提供的机制,如安卓的网络安全配置 (NSC) 或 iOS 的应用传输安全 (ATS) 来强制执行固定。
  • 使用受信任的固定库:避免编写自定义固定逻辑;相反,应依赖成熟且维护良好的库和框架(例如 TrustKit、OkHttp 的 CertificatePinner),并确保它们按照最佳实践正确配置。
  • 安全的动态固定:如果需要动态固定,请通过安全通道检索固定项,并在使用前进行彻底验证。
  • 固定到公钥而不是证书:固定到证书的公钥而非整个证书,以避免过期和续期问题。
  • 一致的强制执行:对所有您控制的服务器连接统一应用固定。
  • 定期更新固定项:使固定的证书或公钥与服务器当前配置保持同步,并建立在发生更改时更新应用程序的流程。
  • 实现备用固定项:包含备用固定项(额外受信任公钥的哈希值),以防止主密钥更改时出现连接问题。

测试

MASTG-TEST-0244: 网络流量中缺少证书固定 MASTG-TEST-0242: 网络安全配置中缺少证书固定 MASTG-TEST-0243: 网络安全配置中过期的证书固定项