MASTG-TEST-0213: 代码中使用硬编码密码密钥
概述¶
在此测试用例中,我们将检查 iOS 应用程序中是否存在硬编码的加密密钥。硬编码的密钥通常可以在对加密函数的调用中找到,或者存储为代码中的常量或变量。在 iOS 中,加密密钥通常在以下框架中使用:
- 安全框架 (Security Framework):
SecKeyCreateWithData
函数允许开发人员从原始数据创建加密密钥。 - CommonCrypto:可以使用原始密钥数据在
key
参数中初始化CCCrypt
。 - CryptoKit:虽然
CryptoKit
为加密操作提供了更高级别的抽象,但开发人员可能仍然以不同的格式硬编码加密密钥,并将其提供给诸如P256.Signing.PrivateKey.init(rawRepresentation:)
之类的方法。
步骤¶
- 在应用程序二进制文件上运行静态分析工具,例如 radare2 for iOS,寻找如上所述的加密 API。
观察¶
输出应包括应用程序使用接受原始密钥数据的加密函数的任何实例。如果可能,输出还应尝试指向二进制文件中的原始密钥数据。
评估¶
如果在二进制文件中找到使用硬编码密钥调用加密函数,则测试失败。
您可能会发现密钥直接作为参数传递给加密函数(字节数组或字符串字面量),或者存储在代码中的变量或常量中。硬编码密钥的典型表示形式包括:
- 原始字节数组:加密密钥可以直接嵌入在代码中,作为
UInt8
或Data
对象的数组。 例如,一个 256 位的 AES 密钥可以表示为一个[UInt8]
数组。 - Base64 编码的字符串:开发人员可能会将加密密钥编码为代码中的 Base64 字符串,如果被发现,攻击者可以很容易地解码。
- 十六进制编码的字符串:密钥有时存储为十六进制字符串,然后在运行时将其转换为
Data
对象以进行加密操作。
确保任何已识别的密钥确实是用于安全相关目的的加密密钥。 通过验证密钥的使用上下文来避免误报(例如,配置设置或非安全相关的常量可能会被错误地识别为加密密钥)。
演示¶
MASTG-DEMO-0013:在带有 r2 的 SecKeyCreateWithData 中使用硬编码的 RSA 私钥 MASTG-DEMO-0014:在带有 r2 的 CryptoKit 中使用硬编码的 ECDSA 私钥