MASTG-TEST-0068: 测试自定义证书存储和证书绑定
此测试即将更新
此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。
请通过提交 PR 来帮助我们:MASTG v1->v2 MASTG-TEST-0068:测试自定义证书存储和证书锁定 (ios)
概述¶
静态分析¶
验证服务器证书是否被锁定。锁定可以在服务器提供的证书树的各个级别上实现
- 包括将服务器的证书包含在应用程序包中,并对每个连接执行验证。这需要在每次更新服务器上的证书时更新更新机制。
- 将证书颁发者限制为例如一个实体,并将中间 CA 的公钥捆绑到应用程序中。 这样,我们限制了攻击面并拥有有效的证书。
- 拥有并管理您自己的 PKI。 该应用程序将包含中间 CA 的公钥。 这避免了每次您更改服务器上的证书时都更新应用程序,例如,由于过期。 请注意,使用您自己的 CA 会导致证书自签名。
Apple 推荐的最新方法是在 Info.plist
文件的“应用程序传输安全设置”下指定锁定的 CA 公钥。 您可以在他们的文章 身份锁定:如何为您的应用配置服务器证书 中找到示例。
另一种常见的方法是使用 NSURLConnectionDelegate
的 connection:willSendRequestForAuthenticationChallenge:
方法来检查服务器提供的证书是否有效并且与应用程序中存储的证书匹配。 您可以在 HTTPS 服务器信任评估 技术说明中找到更多详细信息。
以下第三方库包含锁定功能
- TrustKit:在这里,您可以通过在 Info.plist 中设置公钥哈希值或在字典中提供哈希值来进行锁定。 请参阅他们的自述文件以了解更多详细信息。
- AlamoFire:在这里,您可以为每个域定义一个
ServerTrustPolicy
,您可以为其定义一个PinnedCertificatesTrustEvaluator
。 请参阅其 文档 以了解更多详细信息。 - AFNetworking:在这里,您可以设置
AFSecurityPolicy
来配置您的锁定。
动态分析¶
服务器证书锁定¶
按照 测试端点身份验证 的动态分析部分中的说明进行操作。 如果这样做不会导致流量被代理,则可能意味着证书锁定实际上已实施,并且所有安全措施都已到位。 所有域都会发生同样的情况吗?
作为快速冒烟测试,您可以尝试使用 objection 绕过证书锁定,如 绕过证书锁定 中所述。 objection 捕获的锁定相关 API 应显示在 objection 的输出中。
但是,请记住
- API 可能不完整。
- 如果没有捕获任何内容,并不一定意味着该应用程序未实现锁定。
在这两种情况下,应用程序或其某些组件可能会以 objection 支持 的方式实现自定义锁定。 请检查静态分析部分以获取特定锁定指示符和更深入的测试。
客户端证书验证¶
有些应用程序使用 mTLS(相互 TLS),这意味着应用程序验证服务器的证书,并且服务器验证客户端的证书。 如果 Burp 警报 选项卡中出现错误,表明客户端无法协商连接,您会注意到这一点。
有几点值得注意
- 客户端证书包含一个私钥,该私钥将用于密钥交换。
- 通常,证书还需要一个密码才能使用(解密)它。
- 证书可以存储在二进制文件本身、数据目录或钥匙串中。
使用 mTLS 最常见且不正确的方法是将客户端证书存储在应用程序包中并硬编码密码。 显然,这并不能带来太多的安全性,因为所有客户端都将共享同一个证书。
存储证书(以及可能的密码)的第二种方法是使用钥匙串。 首次登录时,应用程序应下载个人证书并将其安全地存储在钥匙串中。
有时应用程序具有一个硬编码的证书,并将其用于首次登录,然后下载个人证书。 在这种情况下,请检查是否仍然可以使用“通用”证书连接到服务器。
从应用程序中提取证书后(例如,使用 Frida),将其作为客户端证书添加到 Burp 中,您将能够拦截流量。