- 文档
- 教程
- 网络安全
【免费下载链接】mastg
The 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.
导读
本文以 OWASP Mobile Application Security Testing Guide(MASTG)中的测试用例 MASTG-TEST-0211(Broken Hashing Algorithms) 为核心,系统讲解如何在 iOS 应用中通过静态分析定位 MD5、SHA-1 等已损坏哈希算法的使用。你将掌握 iOS 两大密码学框架(CommonCrypto 与 CryptoKit)中哈希 API 的完整清单、基于 radare2 的二进制级检索方法、配套演示工程 MASTG-DEMO-0015 与 MASTG-DEMO-0016 的可复现操作,以及如何在"安全相关上下文"中正确判定算法使用是否违规。
测试概述:本用例检测什么
MASTG-TEST-0211 属于MASVS-CRYPTO类别,对应 MASWE-0008(弱哈希算法使用)弱点。它的目标非常明确:检测 iOS 应用中是否调用了已被业界判定为不安全(broken)的哈希算法。
该测试的类型定义为[static, code, manual],意味着它:
- 属于静态分析(static)——无需运行应用,直接分析二进制;
- 需要检查源代码/反汇编代码(code);
- 最终结论依赖人工研判(manual)——因为算法是否违规取决于其使用的上下文。
测试的核心思路是:聚焦应用通过密码学框架和库执行哈希操作的 API。iOS 生态中与哈希相关的框架主要有两个:
- CommonCrypto:C 语言接口的系统级密码学库;
- CryptoKit:Swift 原生密码学框架。
需要特别说明的是,Apple 的Security 框架只支持非对称算法(如签名、密钥交换),不提供哈希原语,因此不在本测试的范围内。
目标 API 全景:两大框架的哈希算法清单
CommonCrypto:从 MD2 到 SHA-512
CommonCrypto 的头文件CommonDigest.h定义了以下哈希算法 API,本测试关注其中全部可通过符号导入的入口:
| 算法 API | 摘要长度 | 安全状态 |
|---|---|---|
CC_MD2 | 128 bit | 已损坏 |
CC_MD4 | 128 bit | 已损坏 |
CC_MD5 | 128 bit | 已损坏 |
CC_SHA1 | 160 bit | 已损坏 |
CC_SHA224 | 224 bit | 安全 |
CC_SHA256 | 256 bit | 安全 |
CC_SHA384 | 384 bit | 安全 |
CC_SHA512 | 512 bit | 安全 |
在二进制中,这些 API 以sym.imp.CC_MD5、sym.imp.CC_SHA1等导入符号的形式存在,这正是静态检索的切入点。
CryptoKit:Insecure命名空间的刻意区分
CryptoKit 在 API 设计上非常鲜明地表达了安全性立场:安全算法直接以类型名暴露(SHA256、SHA384、SHA512),而 MD5 与 SHA-1 则被归入名为Insecure的专用命名空间,以此提示开发者"你正在使用不安全的算法":
| CryptoKit API | 安全状态 |
|---|---|
SHA256 | 安全 |
SHA384 | 安全 |
SHA512 | 安全 |
Insecure.MD5 | 已损坏 |
Insecure.SHA1 | 已损坏 |
在二进制符号层面,这些调用会体现为sym.imp.CryptoKit.Insecure.MD5、sym.imp.CryptoKit.Insecure.SHA1等导入符号(详见下文演示的检索输出)。
测试步骤一:从应用包中提取二进制(MASTG-TECH-0058)
要分析一个 iOS 应用,第一步是拿到 IPA 并解包提取出可执行二进制。MASTG 为此提供了通用技术 MASTG-TECH-0058(Exploring the App Package),其核心流程如下。
先用unzip解压 IPA:
unzip iGoat-Swift.ipa解压后会得到Payload目录,内含 Application Bundle(.app)。例如:
$ ls -1 Payload/iGoat-Swift.app Info.plist _CodeSignature/ Frameworks/ iGoat-Swift与哈希检测相关的关键产物是:
- 主二进制文件:与 bundle 同名(去掉
.app后缀),例如Payload/MASTestApp.app/MASTestApp,它包含应用的全部代码(Swift/Objective-C 编译产物); Frameworks/:应用的动态库与 framework,如Realm.framework、libswiftCore.dylib等,其中可能内嵌第三方哈希实现;Info.plist:应用配置元数据(bundle ID、版本号等),Linux 下可用plistutil -i Info.plist -o Info_xml.plist转换为 XML 后检查。
提取二进制是后续所有检索命令的前提:检测对象是主二进制及其 framework 中的可执行代码,而不只是源代码文件。
测试步骤二:在二进制中检索哈希 API(MASTG-TECH-0066)
MASTG-TECH-0211 指定使用 MASTG-TECH-0066(Static Analysis on iOS) 来查找相关 API。该技术以 radare2(r2,即 MASTG-TOOL-0073)为主要工具,以下是针对哈希算法的完整检索套路。
列函数并过滤
用afl列出二进制中所有函数,并用~过滤器按名字筛选。查找 CommonCrypto 哈希函数:
afl~CC_查找 CryptoKit 不安全哈希函数:
afl~Insecure.在配套演示 MASTG-DEMO-0016 的输出 output.txt 中,这条命令的结果如下,可以看到 MD5/SHA-1 相关的 4 个导入符号被完整列出:
Uses of CryptoKit.Insecure functions: 0x100007274 1 12 sym.imp.CryptoKit.Insecure.SHA1Digest. 0x100007280 1 12 sym.imp.CryptoKit.Insecure.MD5. 0x10000728c 1 12 sym.imp.CryptoKit.Insecure.SHA1. 0x100007298 1 12 sym.imp.CryptoKit.Insecure.MD5Digest.追踪交叉引用
仅仅看到导入符号还不够,必须确定谁在调用它。用axt查找对目标地址的交叉引用,例如对CryptoKit.Insecure.MD5:
axt @ 0x100007280 sym.func.10000469c 0x1000046d8 [CALL:--x] bl sym.imp.CryptoKit.Insecure.MD5.这表示sym.func.10000469c函数内部在0x1000046d8处通过bl(branch-and-link)指令调用了Insecure.MD5。同理可追踪CC_MD5、CC_SHA1的调用点。
如果需要完整还原调用链,可使用axg输出从被调函数反向回溯到调用者的调用图:
axg ..78ac反汇编调用点上下文
锁定调用地址后,用pd反汇编该区域的指令。例如查看 CommonCrypto 中CC_MD5调用点前后 5 条指令:
pd-- 5 @ 0x1000048c4在 MASTG-DEMO-0015 的输出 中可以看到典型的 ARM64 调用序列——先构造参数(add x0, sp, 0x18指向输出缓冲区、mov w1, 0清零),再执行bl sym.imp.CC_MD5:
Use of MD5: 0x1000048b8 e01b00f9 str x0, [sp, 0x30] 0x1000048bc e0630091 add x0, sp, 0x18 0x1000048c0 01008052 mov w1, 0 ; CODE XREF from sym.func.100004728 @ +0xf0(x) 0x1000048c4 390a0094 bl sym.imp.CC_MD5 0x1000048c8 e00316aa mov x0, x22 0x1000048cc e10314aa mov x1, x20 0x1000048d0 7d000094 bl sym.func.100004ac4对完整函数体可用pdf反编译查看其整体实现:
pdf @ <function_address>配套演示:一键复现检测过程
MASTG 仓库为 MASTG-TEST-0211 提供了两个可直接复现的演示工程,分别覆盖两大框架:
MASTG-DEMO-0015:CommonCrypto 场景
MASTG-DEMO-0015 对应 CommonCrypto 场景。其 样例源码 MastgTest.swift 直观展示了"问题代码长什么样"——用CC_SHA1和CC_MD5直接对输入数据计算摘要:
import Foundation import CommonCrypto struct MastgTest { // Function to generate a SHA-1 hash static func generateSHA1Hash(data: Data) -> String { var hash = UInt8) data.withUnsafeBytes { _ = CC_SHA1($0.baseAddress, CC_LONG(data.count), &hash) } return hash.map { String(format: "%02hhx", $0) }.joined() } // Function to generate an MD5 hash static func generateMD5Hash(data: Data) -> String { var hash = UInt8) data.withUnsafeBytes { _ = CC_MD5($0.baseAddress, CC_LONG(data.count), &hash) } return hash.map { String(format: "%02hhx", $0) }.joined() } static func mastgTest(completion: @escaping (String) -> Void) { let input = "This is a sample text".data(using: .utf8)! let sha1Hash = generateSHA1Hash(data: input) let md5Hash = generateMD5Hash(data: input) // ... completion(value) } }作者提供的 radare2 脚本 cchash.r2 把整个检测流程脚本化(?e为 r2 的打印命令):
?e Uses of CommonCrypto hash function: afl~CC_ ?e xrefs to CC_MD5: axt @ 0x1000071a8 ?e xrefs to CC_SHA1: axt @ 0x1000071b4 ?e Use of MD5: pd-- 5 @ 0x1000048c4 ?e Use of SHA1: pd-- 5 @ 0x10000456c配合 run.sh 即可对MASTestApp二进制一键执行完整分析:
r2 -q -i cchash.r2 -A MASTestApp命令参数说明:-q静默模式(不进入交互界面)、-i cchash.r2加载并执行脚本、-A自动分析(让afl等命令有分析结果可用)。
MASTG-DEMO-0016:CryptoKit 场景
MASTG-DEMO-0016 对应 CryptoKit 场景,检索脚本 cryptokit_hash.r2 将过滤目标换成Insecure.前缀。其 输出 output.txt 显示,Insecure.MD5的调用点位于sym.func.10000469c内的0x1000046d8,Insecure.SHA1的调用点位于sym.func.1000041d8内的0x100004214,并给出了对应的反汇编片段:
xrefs to CryptoKit.Insecure.MD5: sym.func.10000469c 0x1000046d8 [CALL:--x] bl sym.imp.CryptoKit.Insecure.MD5. xrefs to CryptoKit.Insecure.SHA1: sym.func.1000041d8 0x100004214 [CALL:--x] bl sym.imp.CryptoKit.Insecure.SHA1.观察:期望的输出形态
按照 MASTG-TEST-0211 的定义,执行上述步骤后,输出应当包含所有调用了相关密码学函数的函数的反汇编代码。具体而言:
- 二进制中哈希 API 导入符号的完整列表(
afl~CC_/afl~Insecure.的输出); - 每个弱哈希 API 的交叉引用信息(
axt输出,标明调用方函数与调用指令地址); - 调用点所在区域的反汇编代码(
pd-- 5/pd输出,用于人工研判上下文)。
评估:如何判定测试失败
MASTG-TEST-0211 的判定规则很直接:如果在源码或二进制中发现弱哈希算法的使用,测试即失败。典型的失败样本包括:
- MD5(
CC_MD5、CryptoKit.Insecure.MD5) - SHA-1(
CC_SHA1、CryptoKit.Insecure.SHA1)
在两个演示工程中,由于CC_MD5/CC_SHA1(DEMO-0015)和Insecure.MD5/Insecure.SHA1(DEMO-0016)均被检出,测试结论均为失败。
注意:此列表是非穷尽的。MD2、MD4、SHA-224 等也属于弱哈希范畴(其中 MD2/MD4 同属已损坏算法),应根据官方权威机构的持续更新调整检测清单。
进一步验证:区分"安全相关"与"非安全"上下文(MASTG-TECH-0076)
发现弱哈希调用并不等于漏洞成立。MASTG-TEST-0211 明确要求使用 MASTG-TECH-0076(Reviewing Disassembled Objective-C and Swift Code) 对每个报告点进行人工研判,核心问题是:该算法是否被用于保护敏感数据的安全相关场景。
MASTG-TECH-0076 提供了一套系统化的手工分析套路,适用于本用例的上下文判定:
- 理解应用工作原理——先弄清应用的目标以及错误输入时的行为;
- 通读二进制中的字符串——如错误提示、日志等,帮助定位数据处理逻辑;
- 寻找名字相关的函数与类——例如包含
Hash、Digest、Password字样的符号; - 从入口点跟进——从
application:didFinishLaunchingWithOptions:等生命周期入口沿调用链追踪,确认哈希结果最终流向哪里。
判定原则:同一算法,两种结论
关键判例是NIST 的立场:例如,用 MD5 做密码哈希是被 NIST 明令禁止的;但用 MD5 做不涉及安全性的校验和(checksum)通常可以接受。因此:
| 使用场景 | 判定 |
|---|---|
| 用 SHA-1/MD5 对密码、口令、令牌做单向哈希 | 违规(安全相关上下文) |
| 用 MD5 校验下载文件完整性、检测传输错误 | 一般可接受(非安全用途) |
| 用 SHA-1 生成数字签名、证书指纹 | 违规(安全相关上下文) |
从源码结构看,DEMO-0015/0016 的MastgTest.swift只是对固定样例文本计算并输出摘要,属于教学演示性质;真实评估时必须结合反汇编代码判断哈希结果是否参与了认证、授权、数据保护等安全链路。
保持更新:算法淘汰是动态过程
弱哈希清单会随密码学进展不断变化。构建长期存储数据场景的应用时,应持续跟踪权威机构的最新建议,包括:
- 美国国家标准与技术研究院(NIST)的算法建议,特别是其 2024 年发布的NIST IR 8547《Transition to Post-Quantum Cryptography Standards》(后量子密码标准迁移指南),其中对哈希算法在抗量子时代的长期安全性提出了前瞻性要求;
- 德国联邦信息安全办公室(BSI)等区域监管机构的技术指南。
这意味着 MASTG-TEST-0211 的检测清单不应被当作一成不变的静态集合,而应结合应用的数据留存周期与最新标准动态调整。
结语
MASTG-TEST-0211 是 MASTG 中针对 iOS 弱哈希算法的标准化检测用例,其方法论可以概括为一条可复用的链路:解包 IPA 提取二进制(MASTG-TECH-0058)→ 用 radare2 按符号过滤哈希 API 并追踪交叉引用(MASTG-TECH-0066)→ 反汇编调用点 → 结合人工分析判定安全上下文(MASTG-TECH-0076)。配合仓库内的 MASTG-DEMO-0015 与 MASTG-DEMO-0016 演示工程,安全测试人员可以在几秒钟内复现完整的检测流程,并将同样的方法论迁移到任何 Swift/Objective-C 应用的二进制审计中。
- 文档
- 教程
- 网络安全
【免费下载链接】mastg
The 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.
相关推荐
使用 radare2 检测 iOS 应用中的 CommonCrypto 弱哈希算法:MASTG-DEMO-0015 实战
使用 radare2 检测 iOS 应用中的 CommonCrypto 弱哈希算法:MASTG DEMO 0015 实战 本篇技术指南以 OWASP MASTG
文档教程网络安全OWASP MASTG 测试指南:在 iOS 应用中检测被破解的对称加密算法(MASTG-TEST-0210)
OWASP MASTG 测试指南:在 iOS 应用中检测被破解的对称加密算法(MASTG TEST 0210) 本文基于 OWASP Mobile Applic
文档教程网络安全检测 Android 应用导出 FileProvider 的过度文件共享:MASTG 静态测试 MASTG-TEST-0357 实战指南
检测 Android 应用导出 FileProvider 的过度文件共享:MASTG 静态测试 MASTG TEST 0357 实战指南 MASTG TEST
文档教程网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考