ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

iOS Cryptographic APIs 测试指南:OWASP MASTG 中的加密实现审计、密钥管理与随机数验证

iOS Cryptographic APIs 测试指南:OWASP MASTG 中的加密实现审计、密钥管理与随机数验证 文档教程网络安全【免费下载链接】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点击查看免费下载本指南对应 OWASP MASTG 第 0x06e 章「Testing Cryptography」的 iOS 平台部分。它承接 0x04g-Testing-Cryptography.md 中提出的通用加密最佳实践深入 iOS 专属的加密 API 生态如何从源码中识别CommonCrypto、CryptoKit、SecKey等 API 的使用位置如何解读其算法、填充与密钥参数配置以及如何针对密钥管理与随机数生成展开静态与动态分析。读完本文你将掌握一套可在真实 iOS 应用中复用的加密配置审计流程并知道如何用仓库内的测试用例与 Demo 样本验证结论。概述为什么 iOS 应用需要专门的加密审计在 0x04g-Testing-Cryptography.md 中MASTG 已经介绍了通用的密码学最佳实践并归纳了加密被错误使用时的典型问题如使用不安全或已弃用的算法、错误的填充模式、弱密钥派生等。本章则聚焦 iOS 平台识别源码中对 iOS 加密 API 的调用、解释其加密配置并与当前最佳实践逐项比对。Apple 为开发者提供了覆盖大多数常见加密算法的系统库。审计时需要逐一检查应用所用算法与加密配置是否已弃用、是否被正确使用。MASTG 在 iOS 平台上将这些检查组织为一系列可执行的测试用例tests/ios/MASVS-CRYPTO/与配套知识条目knowledge/ios/MASVS-CRYPTO/形成了「知识点 → 测试步骤 → Demo 样本」的完整证据链。识别源码中的加密 API三类系统级实现从源码结构看iOS 应用的加密逻辑通常落在三类系统 API 上静态分析的第一步就是确定应用实际使用了哪一类。1. CommonCrypto对称加密、哈希、HMAC 与 KDF 的主力CommonCrypto 随 iOS 运行时打包是使用最广泛的加密 API。根据 MASTG-KNOW-0067.md其功能由一组头文件定义可通过 Apple 开源的 CommonCrypto 源码查阅每个函数的签名头文件提供的参数/功能CommonCryptor.h对称加密操作的参数算法、模式、填充、IVCommonDigest.h哈希算法的参数CommonHMAC.h支持的 HMAC 操作参数CommonKeyDerivation.h支持的密钥派生函数KDF参数CommonSymmetricKeywrap.h用密钥加密密钥KEK包装对称密钥的函数静态分析中最直接的切入点是查找对CCCrypt、CCCryptorCreate等函数的调用。以CCCryptorCreate为例MASTG-TEST-0061.md 给出了它的完整签名CCCryptorStatus CCCryptorCreate( CCOperation op, /* kCCEncrypt, etc. */ CCAlgorithm alg, /* kCCAlgorithmDES, etc. */ CCOptions options, /* kCCOptionPKCS7Padding, etc. */ const void *key, /* raw key material */ size_t keyLength, const void *iv, /* optional initialization vector */ CCCryptorRef *cryptorRef); /* RETURNED */拿到调用点后需要逐项比对所有enum类型操作、算法、选项与密钥材料确认算法是否属于 0x04g 中列出的不安全或已弃用类别如 DES、RC4、MD5、SHA1 等填充与模式配置是否正确如是否缺少kCCOptionPKCS7Padding、是否在 ECB 模式下使用块密码密钥材料是否安全生成——应来自密钥派生函数如 PBKDF2或安全随机数生成函数而不是硬编码或可预测的值。注意0x04g 标记为已弃用的函数在 CommonCrypto 中依然「程序上可用」调用不会报错但这不代表应该使用它们。2. CryptoKitiOS 13 的强类型 Swift 框架Apple CryptoKit 随 iOS 13 发布构建在 Apple 原生加密库 corecrypto 之上corecrypto 通过了 FIPS 140-2 验证。根据 MASTG-KNOW-0066.mdCryptoKit 提供强类型 API、有效的内存管理、支持泛型与 Equatable并能调用 Secure Enclave 的硬件密钥管理器。其算法覆盖哈希MD5不安全模块、SHA1不安全模块、SHA-2 256/384/512 位摘要对称加密消息认证码HMAC、认证加密 AES-GCM 与 ChaCha20-Poly1305公钥密码密钥协商 Curve25519、NIST P-256、P-384、P-512。典型用法示例// 生成并释放一个 256 位对称密钥 let encryptionKey SymmetricKey(size: .bits256) // 计算 SHA-2 512 位摘要 let rawString OWASP MTSG let rawData Data(rawString.utf8) let hash SHA512.hash(data: rawData) // 计算摘要 let textHash String(describing: hash) print(textHash) // 打印摘要文本注意 CryptoKit 的哈希模块中明确标注了Insecure的 MD5 与 SHA1——它们在框架中可见并不代表可以被用于生产环境。审计时应对.md5、.sha1等 API 的调用保持警惕可参照 demos/ios/MASVS-CRYPTO/MASTG-DEMO-0014/MASTG-DEMO-0014.md 中定位CryptoKit.P256.Signing.PrivateKey系列符号的方法进行核实。3. SecKey非对称密钥操作对于非对称操作Apple 提供 SecKey API 以及对应的密钥生成属性文档。审计非对称加密时重点核查密钥是否通过SecKeyCreateWithData从硬编码数据导入可参考 MASTG-DEMO-0013 的检测流程密钥对是否存放在 Keychain 或 Secure Enclave 中而不是以明文形式嵌入二进制。需要补充的是CommonCrypto 的公开 API 缺少部分操作类型——例如 GCM 模式仅存在于私有 API 中使用 AES-GCM 通常需要额外绑定头文件或借助封装库。4. 第三方库与自研实现除系统 API 外MASTG-KNOW-0068.md 列举了 iOS 生态中常见的第三方加密库CJOSEJWE/AES-GCM 的 C/C 实现需更高层封装、CryptoSwift纯 Swift 自实现各密码算法需核验其实现正确性、OpenSSL 及其封装、LibSodiumNaCl 的可移植分叉配合 Swift-sodium 等封装、Google Tink、Themis 等。审计第三方库时建议遵循以下步骤见 MASTG-TEST-0061.md定位所用库若使用 Carthage检查Cartfile若使用 CocoaPods检查Podfile也可以打开 xcodeproj 项目属性在Build Phases → Link Binary With Libraries中查看链接库对于拷贝粘贴进工程的源码直接搜索其头文件Objective-C或 Swift 文件中已知的方法名确认版本检查所用版本是否有修复已知漏洞的新版本即使库没有新版本其加密函数也可能从未经过安全评审因此优先选用经过验证的库绝不自己造轮子不建议自研加密函数也不建议自己实现已知密码算法对自研实现的「DIY」代码必须由密码学专家极其严格地评审。校验算法与配置静态分析的关键检查点对应用使用的每个库都必须验证算法与配置是否已弃用、是否被正确使用。除逐一比对枚举值外还需关注以下细节密钥持有数据结构的定义方式审计代码中待清除的密钥持有数据结构与明文数据结构是如何定义的。在 Swift 中let声明的是不可变结构更难从内存中擦除应确保它作为父结构的一部分例如一个短生命周期的struct能够随父结构一并从内存移除见 MASTG-TEST-0061.md。参考通用最佳实践清单将实际参数与 0x04g-Testing-Cryptography.md 中「识别不安全/已弃用加密算法」与「常见配置问题」两节列出的检查项逐一对照确保不遗漏任何配置维度。测试密钥管理从 Keychain 到 Secure Enclave密钥管理是 iOS 加密审计的核心议题之一对应测试用例 MASTG-TEST-0062.md 与知识条目 MASTG-KNOW-0069.md。密钥存放的三个层级根本不存放密钥最理想的情况是不在设备上保留任何密钥材料从而杜绝密钥被 dump 的可能。这可以通过密码密钥派生函数如 PBKDF2实现——每次从密码与盐现场派生密钥。以下示例展示了基于 CommonCryptoCCKeyDerivationPBKDF的 PBKDF2 实现源自 Arcane 库测试套件func pbkdf2(hash: CCPBKDFAlgorithm, password: String, salt: Data, keyByteCount: Int, rounds: Int) - Data? { let passwordData password.data(using: String.Encoding.utf8)! var derivedKeyData Data(repeating: 0, count: keyByteCount) let derivedKeyDataLength derivedKeyData.count let derivationStatus derivedKeyData.withUnsafeMutableBytes { derivedKeyBytes in salt.withUnsafeBytes { saltBytes in CCKeyDerivationPBKDF( CCPBKDFAlgorithm(kCCPBKDF2), password, passwordData.count, saltBytes, salt.count, hash, UInt32(rounds), derivedKeyBytes, derivedKeyDataLength ) } } if derivationStatus ! 0 { // 出错 return nil } return derivedKeyData } func testKeyDerivation() { let password password let salt Data([0x73, 0x61, 0x6C, 0x74, 0x44, 0x61, 0x74, 0x61]) let keyByteCount 16 let rounds 100_000 let derivedKey pbkdf2SHA1(password: password, salt: salt, keyByteCount: keyByteCount, rounds: rounds) }存放在 Keychain当必须存储密钥时首选 Keychain前提是保护类别不是kSecAttrAccessibleAlways。将密钥放在NSUserDefaults、属性列表文件或 Core Data/Realm 的任何存储中通常都比 Keychain 不安全——即使这些存储用NSFileProtectionComplete数据保护类别做了同步加密仍建议改用 Keychain详见 0x06d-Testing-Data-Storage.md。Secure EnclaveKeychain 支持两种机制——密钥由 Secure Enclave 中的加密密钥保护或密钥本身存放在 Secure Enclave 内。后者仅适用于 ECDH 签名密钥。必须规避的四种错误做法静态分析中必须确认见 MASTG-TEST-0062.md硬编码密钥所有应用实例共用同一密钥攻击者只需从源码无论存于原生层还是 Objective-C/Swift 层提取一次即可解密该应用加密的全部数据基于设备稳定特征的可预测 KDF这些特征可被其他应用访问攻击者只需找到 KDF 并应用到目标设备即可还原密钥密钥存放在与其他应用共享的位置对称加密密钥被公开存放是高度不推荐的做法用低级语言C/C隐藏密钥这并不构成保护只是提高了提取门槛。此外有两个任何时候都不应忘记的密码学不变量加密/验签用公钥解密/签名用私钥绝不跨用途重用密钥对——签名与加密应各自使用独立的密钥对否则可能泄露密钥信息。动态分析在静态检查之外可以hook 加密方法并分析正在使用的密钥同时监控文件系统访问观察密钥材料被写入或读取的位置见 MASTG-TEST-0062.md 的动态分析部分。仓库中的 Demo 展示了用 radare2 检测硬编码密钥的完整流程MASTG-DEMO-0013/MASTG-DEMO-0013.md解包应用定位主二进制./Payload/MASTestApp.app/MASTestApp用 r2 脚本sec_hardcoded_rsa.r2扫描输出揭示了SecKeyCreateWithData调用以及二进制 DATA 段中的硬编码 RSA 私钥——测试失败因为代码中发现了硬编码 RSA 私钥MASTG-DEMO-0014/MASTG-DEMO-0014.md同样的流程定位CryptoKit.P256.Signing.PrivateKey系列函数尤其是rawRepresentation提取私有密钥原始表示并在二进制 DATA 段发现硬编码 ECDSA 私钥——测试失败。Demo 还提示可利用 AI 辅助反编译将汇编输出还原为可读的 Swift 代码以确认CryptoKit.P256.Signing.PrivateKey的使用。测试随机数生成iOS CSPRNG 的正确使用姿势随机数生成是密钥生成、初始化向量、nonce 与令牌等大量加密操作的基石。知识条目 MASTG-KNOW-0070.md 对 iOS 的随机数生态做了系统性梳理对应测试用例 MASTG-TEST-0063.md。系统 CSPRNG 的底层机制Apple 系统提供可信的密码学安全伪随机数生成器CSPRNG在系统启动及设备全生命周期内由多种熵源播种包括 Secure Enclave 硬件的真随机数生成器TRNG、时序抖动、硬件中断熵等。内核 CSPRNG 基于Fortuna 设计通过/dev/random、/dev/urandom设备文件以及getentropy(2)系统调用暴露给用户空间。需要注意在 iOS 等 Apple 平台上/dev/random与/dev/urandom等价都提供密码学安全随机数但直接通过open/read读取设备文件并不被推荐——这是容易误用的底层接口。应用应使用SecRandomCopyBytes或 Swift 标准库随机 API 等更高级接口。SecRandomCopyBytes推荐首选Security 框架的 Randomization Services API 提供了SecRandomCopyBytes。在 Swift 中其签名MASTG-TEST-0063.md为func SecRandomCopyBytes(_ rnd: SecRandomRef?, _ count: Int, _ bytes: UnsafeMutablePointerUInt8) - Int32Objective-C 版本为int SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes);Swift 使用示例var randomBytes UInt8 let status SecRandomCopyBytes(kSecRandomDefault, randomBytes.count, randomBytes)SecRandomCopyBytes内部包装了 CommonCrypto 的CCRandomCopyBytes后者再调用系统 CSPRNG。可以用 Frida 观察这条调用链frida-trace -n MASTestApp -i SecRandomCopyBytes ... 2960 ms SecRandomCopyBytes() 2960 ms | CCRandomCopyBytes() 2960 ms | | CCRandomGenerateBytes()Swift 标准库随机 APISwift 4.2 通过 SE-0202 引入了原生随机 APIInt、UInt、Float、Double、Bool等类型直接提供random(in:)方法。例如生成十六进制令牌var token for _ in 0..16 { let b UInt8.random(in: 0...255) token String(format: %02x, b) }其底层使用SystemRandomNumberGenerator在 Apple 平台上通过arc4random_buf实现调用的是系统 CSPRNG自动播种且线程安全因此默认适合密码学用途。不过 API 也提供了接受自定义RandomNumberGenerator的重载——自定义生成器可能不安全审计时必须确认自定义实现是否适用于密码学场景。可以用 Frida 追踪 Swift 随机 API经符号修饰的UInt8.randomfrida-trace -n MASTestApp -i *FixedWidthInteger*random* ... 2959 ms $ss17FixedWidthIntegerPsE6random2inxSNyxG_tFZ() 2959 ms | arc4random_buf(buf0x16ef965a8, nbytes0x8)需要警惕的接口arc4random 家族arc4random()、arc4random_buf()、arc4random_uniform()在现代 Apple 平台上同样由内核 CSPRNG 支撑可用于密码学但它们是遗留的 C 风格接口容易误用。典型陷阱是arc4random() % n引入模偏差modulo bias使部分结果概率略高arc4random_uniform(n)专为避免模偏差设计应优先于arc4random() % n。新 Swift 代码建议优先使用UInt8.random(in:)或SecRandomCopyBytes标准 C 库的 rand()/random()rand()、random()及srand()/srandom()是确定性伪随机生成器一旦内部状态或种子已知即可预测输出完全不适用于密码学。这些 API 仍存在于libSystem中但 Darwin 头文件通过__swift_unavailable属性将其对 Swift 标记为不可用部分*rand48函数如drand48()在 Swift 中仍可使用但它们实现的是 48 位状态线性同余生成器同样不安全且非线程安全其他机制如果代码中使用了其他随机数机制必须核实它们是上述安全 API 的包装否则应审查其随机强度——这通常非常困难最稳妥的做法是统一改用SecRandomCopyBytes见 MASTG-TEST-0063.md 的说明。随机性的动态验证如果想实证检验随机质量可以捕获大量随机数样本用 Burp Suite 的 Sequencer 插件分析其随机性质量见 MASTG-TEST-0063.md 的动态分析部分。本文方法论与仓库证据汇总整个审计流程可以归纳为四个步骤每一步都能在仓库中找到对应的证据文件定位 API 使用CommonCryptoCCCrypt/CCCryptorCreate、CryptoKitiOS 13 强类型框架、SecKey非对称或第三方库CryptoSwift、OpenSSL、LibSodium、Tink、Themis 等——证据见 MASTG-KNOW-0066.md、MASTG-KNOW-0067.md、MASTG-KNOW-0068.md校验算法与配置比对枚举类型、检查let持有结构、对照 0x04g 的不安全算法与常见配置清单——证据见 MASTG-TEST-0061.md审计密钥管理Keychain 保护类别、Secure Enclave、PBKDF2 派生、硬编码与可预测 KDF 的规避——证据见 MASTG-TEST-0062.md、MASTG-KNOW-0069.md实操样本见 MASTG-DEMO-0013 与 MASTG-DEMO-0014验证随机数确认使用SecRandomCopyBytes或 Swift 标准库安全随机 API排除arc4random() % n模偏差、rand()系列等不安全来源——证据见 MASTG-TEST-0063.md、MASTG-KNOW-0070.md。按照上述流程即使面对完全未知的 iOS 应用也可以系统性地完成加密实现审计并最终回答三个核心问题用了什么算法与配置密钥在哪里、如何被保护随机数是否来自系统 CSPRNG三个问题的答案共同决定了应用在 MASVS-CRYPTO 类别下的合规状态也为后续的加固工作提供了精确的修复清单。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐Amlogic S905L2中断分配问题的底层固件替换解决方案深度解析Amlogic S905L2中断分配问题的底层固件替换解决方案深度解析 问题现象创维E900V21E有线网卡在Armbian下的异常行为 在嵌入式Linux设嵌入式开发工具构建工具操作系统OWASP Serverless / FaaS 安全加固指南最小权限、事件验证与密钥管理的实战速查OWASP Serverless / FaaS 安全加固指南最小权限、事件验证与密钥管理的实战速查 Serverless函数即服务FaaS以 AWS L应用安全终极安全审计指南Public-APIs项目API密钥管理与安全防护实践终极安全审计指南Public APIs项目API密钥管理与安全防护实践 在当今数字化时代API应用程序编程接口已成为连接各种服务和数据的关键桥梁。Pub文档上一篇Home Assistant UPB 集成实战upb.link_goto 动作快速将场景设置到目标亮度下一篇N64Recomp与Docker构建隔离开发环境的完整配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表