跳过内容

MASTG-TEST-0213: 代码中使用硬编码密码密钥

概述

在此测试用例中,我们将检查 iOS 应用程序中是否存在硬编码的加密密钥。硬编码的密钥通常可以在对加密函数的调用中找到,或者存储为代码中的常量或变量。在 iOS 中,加密密钥通常在以下框架中使用:

  • 安全框架 (Security Framework)SecKeyCreateWithData 函数允许开发人员从原始数据创建加密密钥。
  • CommonCrypto:可以使用原始密钥数据在 key 参数中初始化 CCCrypt
  • CryptoKit:虽然 CryptoKit 为加密操作提供了更高级别的抽象,但开发人员可能仍然以不同的格式硬编码加密密钥,并将其提供给诸如 P256.Signing.PrivateKey.init(rawRepresentation:) 之类的方法。

步骤

  1. 在应用程序二进制文件上运行静态分析工具,例如 radare2 for iOS,寻找如上所述的加密 API。

观察

输出应包括应用程序使用接受原始密钥数据的加密函数的任何实例。如果可能,输出还应尝试指向二进制文件中的原始密钥数据。

评估

如果在二进制文件中找到使用硬编码密钥调用加密函数,则测试失败。

您可能会发现密钥直接作为参数传递给加密函数(字节数组或字符串字面量),或者存储在代码中的变量或常量中。硬编码密钥的典型表示形式包括:

  • 原始字节数组:加密密钥可以直接嵌入在代码中,作为 UInt8Data 对象的数组。 例如,一个 256 位的 AES 密钥可以表示为一个 [UInt8] 数组。
  • Base64 编码的字符串:开发人员可能会将加密密钥编码为代码中的 Base64 字符串,如果被发现,攻击者可以很容易地解码。
  • 十六进制编码的字符串:密钥有时存储为十六进制字符串,然后在运行时将其转换为 Data 对象以进行加密操作。

确保任何已识别的密钥确实是用于安全相关目的的加密密钥。 通过验证密钥的使用上下文来避免误报(例如,配置设置或非安全相关的常量可能会被错误地识别为加密密钥)。

演示

MASTG-DEMO-0013:在带有 r2 的 SecKeyCreateWithData 中使用硬编码的 RSA 私钥 MASTG-DEMO-0014:在带有 r2 的 CryptoKit 中使用硬编码的 ECDSA 私钥