
文档教程网络安全【免费下载链接】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 仓库中的 MASTG-DEMO-0041 演示用例完整还原一个 iOS 安全测试场景某 App 仅依赖LocalAuthentication框架的LAContext.evaluatePolicy进行生物识别门禁将敏感 token 的保护押在一个可被逻辑绕过的布尔结果上。读者将学会用 radare2r2对主二进制做静态分析在反汇编层识别objc_msgSend与LAPolicyDeviceOwnerAuthenticationWithBiometrics特征并与 Keychain 的SecAccessControlCreateWithFlags方案对比最终掌握该弱点的判定标准对应 MASTG-TEST-0266和实际绕过思路。该 demo 的测试结论是失败的insecure因为二进制中只找到生物识别验证的调用没有任何要求用户在场的 Keychain API 调用属于可被 MASTG-TECH-0135 绕过生物识别认证 轻易击穿的典型缺陷。1. 为什么生物识别验证成功不等于敏感数据安全Demo 对应的测试用例 MASTG-TEST-0266 给出的判定视角非常清晰它把两种保护机制放在了对立面LocalAuthentication API如LAContext负责完成 Touch ID / Face ID / 设备密码等用户认证只返回成功或失败不负责存储任何秘密也不执行任何强制安全策略。应用拿到布尔结果后自行决定是否放行——这个自行决定正是漏洞温床。Keychain API真正安全地存储敏感数据并可通过SecAccessControlCreateWithFlags配置访问控制策略如要求用户在场的kSecAccessControlUserPresence标志。认证结果不再是独立的一次性布尔值而是被嵌入到进程外的安全数据读取路径中绕过认证的难度显著提高。用一句话概括前者是认证通过 → 才给你看数据后者是认证通过 → 系统才把数据交给你。后者把安全决策从应用代码手中移交给了操作系统安全服务。2. 样例源码错误示范的完整代码Demo 的不安全示例源码位于 MastgTest.swift完整代码如下import Foundation import LocalAuthentication struct MastgTest { static func mastgTest(completion: escaping (String) - Void) { let token 8767086b9f6f976g-a8df76 let context LAContext() let reason Authenticate to access your token context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, error in DispatchQueue.main.async { if success { completion(✅ Retrieved token: \(token)) return } // Authentication failed: inspect the error code let message: String if let laError error as? LAError { switch laError.code { case .userCancel: message Authentication was cancelled by the user. case .userFallback: message User tapped the fallback button (e.g. entered a password). case .systemCancel: message Authentication was cancelled by the system (e.g. another app came to foreground). case .passcodeNotSet: message Passcode is not set on the device. case .biometryNotAvailable: message No biometric authentication is available on this device. case .biometryNotEnrolled: message The user has not enrolled any biometrics. case .biometryLockout: message Biometry is locked out due to too many failed attempts. default: // For any future or undocumented codes message laError.localizedDescription } } else { // Some other non-LAError error message error?.localizedDescription ?? Unknown authentication error. } completion(❌ \(message)) } } } }分析这段代码的缺陷点敏感数据与认证结果耦合在同一个进程内token是硬编码字符串认证成功与否只影响是否通过completion回调返回它。攻击者只要让回调以成功路径执行即可拿到 token。控制流依赖一个 if 判断if success { ... }是典型的可被操纵的逻辑分支。demo 明确指出该方式之所以弱正是因为依赖 if 语句检查认证是否成功攻击者可用 MASTG-TECH-0135 等技巧绕过。未使用 Keychain整个文件中没有任何SecItemAdd/SecItemCopyMatching/SecAccessControlCreateWithFlags调用token 完全没有落到系统级安全存储中。错误处理相对完善但无济于事对LAError的各类 code用户取消、回退、系统取消、未设置密码、生物识别不可用/未录入/锁定都做了中文式消息映射这只能提升可用性不能提升安全性。按测试元数据该用例关联的弱点是 MASWE-0020元数据见 MASTG-TEST-0266.md 的 front matter并关联到 MASTG-KNOW-0056 / MASTG-KNOW-0057 的知识条目。3. 复现步骤从 IPA 到反汇编证据3.1 获取并解包 App首先按 MASTG-TECH-0058探索 App 包 的流程拿到 IPA 并解压。标准方式unzip MASTestApp.ipa解压后在Payload目录下得到 Application Bundle.app。Demo 明确指出主二进制位于./Payload/MASTestApp.app/MASTestApp3.2 编写 r2 自动化脚本仓库中已提供现成的 radare2 脚本 insecureAuthenticationBiometricsApi.r2内容如下e asm.bytesfalse e scr.colorfalse e asm.varfalse ?e Print xrefs to Run analysis aaa ?e Print xrefs to evaluatePolicy f~evaluatePolicy ?e ?e Print xrefs to 0x100010098 axt 0x100010098 ?e ?e Print disassembly around evaluatePolicy in the function pdf 0x100004344 | grep -C 5 evaluatePolicy: ?e Print xrefs to SecAccessControlCreateWithFlags f~SecAccessControlCreateWithFlags脚本关键点逐行解读命令作用e asm.bytesfalse反汇编时不显示原始机器码字节聚焦指令语义e scr.colorfalse关闭颜色输出便于重定向到文件后阅读e asm.varfalse关闭变量名注释保持输出与地址/寄存器一一对应aaa对二进制执行完整分析auto analysis构建函数与引用关系f~evaluatePolicy在 flags 空间中过滤包含evaluatePolicy的符号/标志定位 selector 的字符串与 relocaxt 0x100010098查看指定地址evaluatePolicy:localizedReason:的 reloc.fixup 所在处的交叉引用找出谁在调用它pdf 0x100004344对包含调用的函数做反汇编并用grep -C 5截取evaluatePolicy:上下文f~SecAccessControlCreateWithFlags检查二进制中是否存在 Keychain 访问控制 API 的引用3.3 一键运行仓库提供的一键脚本 run.sh#!/bin/bash r2 -q -i insecureAuthenticationBiometricsApi.r2 -e emu.strtrue -A MASTestApp output.asm参数说明-q安静模式执行完脚本后直接退出不进入交互式 shell-i insecureAuthenticationBiometricsApi.r2批处理执行脚本中的全部 r2 命令-e emu.strtrue启用字符串模拟emu.str让 r2 在引用字符串时模拟求值便于在反汇编中直接看到evaluatePolicy:localizedReason:等 selector 字符串内容-A等价于在脚本开头执行aaa分析脚本内也显式执行了一次双保险 output.asm全部输出重定向到 output.asm便于留档与对比。4. 观察反汇编输出如何出卖了生物识别调用运行后得到的 output.asm 完整还原如下Print xrefs to Run analysis Print xrefs to evaluatePolicy 0x100008297 38 str.evaluatePolicy:localizedReason:reply: 0x100010098 8 reloc.fixup.evaluatePolicy:localizedReason: Print xrefs to 0x100010098 sym.MASTestApp.MastgTest.mastg.completion.nd_n 0x100004344 [DATA:r--] ldr x1, [x8, 0x98] Print disassembly around evaluatePolicy in the function │ 0x100004334 bl sym.imp.swift_retain │ 0x100004338 mov x0, x23 ; void *arg0 │ 0x10000433c bl sym.imp.swift_release ; void swift_release(void *arg0) │ ; void swift_release(0) │ 0x100004340 adrp x8, sym.__METACLASS_DATA__TtC10MASTestAppP33_9471609302C95FC8EC1D59DD4CF2A2DB19ResourceBundleClass ; 0x100010000 │ 0x100004344 ldr x1, [x8, 0x98] ; [0x100010098:4]0x8297 ; reloc.fixup.evaluatePolicy:localizedReason: ; char *selector │ 0x100004348 mov x0, x19 ; void *instance │ 0x10000434c mov w2, 1 │ 0x100004350 mov x3, x20 │ 0x100004354 mov x4, x22 │ 0x100004358 bl sym.imp.objc_msgSend ; void *objc_msgSend(void *instance, char *selector) Print xrefs to SecAccessControlCreateWithFlags4.1 两条关键证据链证据链一selector 与 reloc 定位f~evaluatePolicy找到了两处0x100008297字符串str.evaluatePolicy:localizedReason:reply:即 Objective-C 方法 selector 的运行时字符串长度 38 字节0x100010098reloc.fixup.evaluatePolicy:localizedReason:即方法 selector 的 relocation 修复项供ldr x1, [x8, 0x98]加载使用。证据链二调用点反汇编axt 0x100010098显示唯一交叉引用来自sym.MASTestApp.MastgTest.mastg.completion.nd_n函数内的地址0x100004344——正是 Swift 源码中mastgTest的编译产物符号名与 Swift 源码结构一一对应。4.2 为何反汇编与 Swift 源码长得不一样Demo 明确指出输出看起来和 MastgTest.swift 不完全一样因为编译器会把部分函数转换成 Objective-C 的对应物。二进制中等价的 Objective-C 表示形如objc_msgSend(void *address, evaluatePolicy:localizedReason:, LAPolicyDeviceOwnerAuthenticationWithBiometrics, ...)对照反汇编的寄存器约定ARM64 调用规范x0 self/instancex1 selectorx2起为方法参数行号指令含义0x100004344ldr x1, [x8, 0x98]加载 selectorevaluatePolicy:localizedReason:0x100004348mov x0, x19第一个参数LAContext实例instance0x10000434cmov w2, 1第二个参数策略枚举被设为10x100004350mov x3, x20第三个参数localizedReason字符串0x100004354mov x4, x22第四个参数reply 回调 block0x100004358bl sym.imp.objc_msgSend发起 Objective-C 消息发送关键判定objc_msgSend的第三个参数对应w2寄存器在函数调用前通过第 17 行输出中0x10000434c的mov指令设置为1。这个1正是LAPolicyDeviceOwnerAuthenticationWithBiometrics的枚举值——即只启用生物识别Face ID / Touch ID认证不包含设备密码兜底。4.3 枚举取值全集来自 SDK 头文件的事实依据要确认1的枚举含义可在装有 XcodeMASTG-TOOL-0070 的机器上直接对 LocalAuthentication 框架头文件做 grepgrep kLAPolicyDeviceOwnerAuthentication /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/LocalAuthentication.framework/Headers/LAPublicDefines.h预期输出即该枚举的全部合法取值#define kLAPolicyDeviceOwnerAuthenticationWithBiometrics 1 #define kLAPolicyDeviceOwnerAuthentication 2 #define kLAPolicyDeviceOwnerAuthenticationWithWatch 3 #define kLAPolicyDeviceOwnerAuthenticationWithBiometricsOrWatch 4 #define kLAPolicyDeviceOwnerAuthenticationWithWristDetection 5 #define kLAPolicyDeviceOwnerAuthenticationWithCompanion kLAPolicyDeviceOwnerAuthenticationWithWatch #define kLAPolicyDeviceOwnerAuthenticationWithBiometricsOrCompanion kLAPolicyDeviceOwnerAuthenticationWithBiometricsOrWatch这些常量对应 Swift 中LAPolicy枚举deviceOwnerAuthenticationWithBiometrics1、deviceOwnerAuthentication2、deviceOwnerAuthenticationWithWatch3、deviceOwnerAuthenticationWithBiometricsOrWatch4、deviceOwnerAuthenticationWithWristDetection5。因此mov w2, 1确凿指向源码中的.deviceOwnerAuthenticationWithBiometrics。5. 评估为什么该测试判为失败对照 MASTG-TEST-0266 的评估标准对每个值得保护的敏感数据资源如果同时满足以下两点测试用例即失败LAContext.evaluatePolicy被显式使用没有任何要求用户在场的SecAccessControlCreateWithFlags调用即未使用任何要求用户在场的访问控制标志。本 demo 的 output.asm 中最后一行Print xrefs to SecAccessControlCreateWithFlags之后没有任何输出证明二进制内不存在 Keychain 访问控制 API 的引用。输出仅显示 LocalAuthentication API 的生物识别验证引用因此✅ 条件 1 成立evaluatePolicy:localizedReason:调用明确存在0x100004358❌ 条件 2 不满足SecAccessControlCreateWithFlags零引用。结论测试失败应用被判定为不安全。该判定方法属于静态代码分析类型测试元数据中type: [static, code]。6. 实战佐证这类弱点如何被真实绕过Demo 明确提示该方式可被 MASTG-TECH-0135绕过生物识别认证 绕过。该技术文档给出的通用判断是当应用只用if authenticated {...}这样的布尔结果做门禁、而没有用SecAccessControlCreateWithFlags的 Keychain API 要求用户在场时即可绕过。越狱设备或已重签名的非越狱设备上的绕过流程在越狱设备上安装并运行 frida-server使用 objectionMASTG-TOOL-0038附加目标 App 并执行内置的biometrics_bypass模块objection -n MASTestApp start ios ui biometrics_bypass该模块通过 hook 篡改认证结果使evaluatePolicy回调始终返回成功从而让if success分支恒为真token 随即泄露。绕过效果见 MASTG-TECH-0135 中的实测截图非越狱设备上objection 默认无法附加需要先将 App 以get-task-allow标志重签名详见 MASTG-TECH-0084再走同样的流程。7. 正确姿势让认证成为安全读取路径的一部分本 demo 的真正价值在于给出了正反对照认证结果本身不该是安全边界安全边界应落在系统级数据存储上。修复方案是把敏感 token 移入 Keychain并配置要求用户在场的访问控制import Security import LocalAuthentication let accessControl SecAccessControlCreateWithFlags( kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, [.userPresence], // 要求用户在场生物识别或密码 nil ) var query: [String: Any] [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: mastg-secret-token, kSecValueData as String: Data(token.utf8), kSecAttrAccessControl as String: accessControl as Any ] let status SecItemAdd(query as CFDictionary, nil)读取时同样走 Keychain 查询路径系统会在SecItemCopyMatching时强制执行用户在场认证。此时攻击者即使篡改应用内任意布尔判断也拿不到数据——因为数据本身从未离开系统安全容器。这正是 MASTG-TEST-0266 要求同时检查SecAccessControlCreateWithFlags引用存在的根本原因。8. 小结一次可复用的静态审计流程从 MASTG-DEMO-0041 可以提炼出一条可复用的 iOS 生物识别安全审计流水线解包unzip获取Payload/*.app定位主二进制MASTG-TECH-0058静态扫描用 r2或等效工具检索evaluatePolicy:localizedReason:selector 与SecAccessControlCreateWithFlags符号反汇编确认通过objc_msgSend的参数w2寄存器的值确认具体的LAPolicy枚举排除误报交叉比对evaluatePolicy存在但 Keychain 访问控制缺失 → 判为失败MASTG-TEST-0266动态验证可选用 objection 的ios ui biometrics_bypass实际绕过证明可利用性MASTG-TECH-0135。该流程涉及的全部产物——demo 文档、源码、r2 脚本、输出证据、运行脚本 以及对应的 测试用例 与 绕过技术——均可直接在仓库中复现与交叉验证是一份自洽、可审计、可教学的完整安全测试样本。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐使用 radare2 静态分析 iOS Keychain 生物认证回退kSecAccessControlUserPresence 实战解析MASTG-DEMO-0043使用 radare2 静态分析 iOS Keychain 生物认证回退kSecAccessControlUserPresence 实战解析MASTG DEM文档教程网络安全OWASP MASTG 实践指南使用 CryptoObject 为 Android 生物识别认证建立密码学绑定MASTG-BEST-0036OWASP MASTG 实践指南使用 CryptoObject 为 Android 生物识别认证建立密码学绑定MASTG BEST 0036 导读 本指南文档教程网络安全MASTG 最佳实践 MASTG-BEST-0038Android 生物识别认证中的显式用户确认setConfirmationRequired安全配置指南MASTG 最佳实践 MASTG BEST 0038Android 生物识别认证中的显式用户确认setConfirmationRequired安全配置指南文档教程网络安全上一篇3分钟解锁WeMod高级功能为什么这个开源增强工具改变了游戏规则下一篇终极指南如何提取和解密Android QQ聊天记录数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考