检测与配置实战指南)
文档教程网络安全【免费下载链接】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 MASTGMobile Application Security Testing Guide仓库中的 MASTG-KNOW-0061 知识条目 展开系统讲解 iOS 应用中三类关键二进制保护机制——PIE位置无关可执行文件、内存管理ARC与栈破坏保护Stack Smashing Protection的原理、适用语言边界、Xcode 工程配置步骤以及如何在已编译的 Mach-O 二进制中验证这些机制是否真正生效。读完本文你将掌握用 radare2 / Objection 等工具解析pic、canary标志与 ARC 相关符号的完整命令流理解为何纯 Swift 应用可以不查栈金丝雀这类语言相关判断并能把理论知识直接落地到 MASTG 的测试用例MASTG-TEST-0228 / 0229 / 0230中执行。本文对应的完整理论知识背景可进一步参考 Testing Code Quality 章节。一、为什么要在意二进制保护机制iOS 应用的防护并非只有代码混淆一种手段。编译器Clang / swiftc在构建阶段就能注入一系列免费的free安全特性用于缓解缓冲区溢出、内存泄漏、地址泄露等常见漏洞。Xcode 默认会打开这些特性但以下两类场景依然需要安全测试人员主动验证老旧应用在早期 iOS 版本或旧工具链下编译的应用可能没有开启这些机制编译器标志误配置misconfiguration工程被人为改动了Other C Flags、Linking等 Build Settings导致默认保护被关闭。关键前提是这些机制的存在性检测严重依赖应用的开发语言。例如检测栈金丝雀stack canary的传统技术对纯 Swift 应用并不适用因此必须先判断二进制是 Objective-C、Swift 还是 C/C再决定检测策略。二、三类核心保护机制的原理与适用边界MASTG 将 iOS 二进制保护机制划分为三类每类的适用对象与语言边界都不同。2.1 PIEPosition Independent Executable原理PIE 是完全由位置无关代码PIC构成的可执行文件。PIC 的代码无论被加载到内存的哪个绝对地址都能正确运行而 PIE 可执行文件被加载时其基址、栈、堆和库的地址都会由ASLR地址空间布局随机化随机排布从而显著提高攻击者预测内存地址的难度。详细定义见 Position Independent Code。适用边界来自 MASTG-KNOW-0061PIE 只适用于Mach-O 类型为MH_EXECUTE的可执行二进制即主应用二进制如YourApp.app/YourApp不适用于 Mach-O 类型为MH_DYLIB的库dylib 与 framework。动态库天然位置无关不携带MH_PIE标志因此检查 PIE 时无需也无法对动态库执行。2.2 内存管理ARCAutomatic Reference Counting原理ARC 是 Clang 编译器专为Objective-C 与 Swift提供的内存管理特性它自动释放在类实例不再被引用时占用的内存。与追踪式垃圾回收GC不同ARC 没有后台进程异步回收对象它也不自动处理引用环开发者需要用弱引用weak reference打破强引用循环否则可能造成死锁与内存泄漏。详细背景见 Memory Management。适用边界纯 Objective-C、Swift 以及混合hybrid二进制都应启用 ARC对于C/C 原生库ARC 不适用——开发者必须自行完成手动内存管理manual memory management。手动管理一旦出错极易引入内存安全违例memory safety violations或内存泄漏相关风险与排查方法见 Memory Corruption Bugs。2.3 栈破坏保护Stack Smashing Protection / Stack Canary原理栈金丝雀stack canary在栈上、返回指针之前的位置存放一个隐藏整数值并在函数返回语句执行前校验该值。缓冲区溢出攻击通常通过覆写内存区域来篡改返回指针以劫持程序流程若金丝雀启用它会先被覆写CPU 因而能检测到内存被篡改。栈溢出比堆溢出更容易使程序执行脱轨因为栈上保存着所有活动函数调用的返回地址。详见 Stack Smashing Protection。适用边界关键语言差异纯 Objective-C 二进制始终应启用栈金丝雀纯 Swift 二进制Swift 在设计上就是内存安全的memory safe如果库是纯 Swift 编写的且未启用栈金丝雀风险极小可以跳过检查C/C 二进制提供了对内存与指针的直接访问是缓冲区溢出的高危区栈金丝雀尤其重要。已知检测限制检测栈金丝雀的现有技术对纯 Swift 应用不奏效详见下文测试用例章节这是语言相关检测差异的最典型例子。三、Xcode 工程配置逐步开启三项保护以下步骤均来自 MASTG-KNOW-0061 的操作章节可直接照做。3.1 通用入口每项配置的第一步都是相同的在 Xcode 中选中Targets区域里的目标点击Build Settings标签页查看该目标的构建设置。后续针对不同机制修改对应字段。3.2 开启栈金丝雀保护Stack Canary在目标构建设置中完成找到Other C Flags一节确保其中包含-fstack-protector-all选项同时确保Position Independent Executables (PIE)支持已启用金丝雀与 PIE 通常配合使用。-fstack-protector-all会让编译器为所有函数都插入金丝雀检查。MASTG 的测试文档也提到社区中某些大型框架如 React Native出于性能考虑只使用-fstack-protector-strong仅保护含易受攻击缓冲区的函数这会导致在二进制中搜索stack_chk_fail符号时可能找不到结果属于预期的误报场景详见下文测试章节。3.3 开启 PIE 保护按以下步骤将应用构建为 PIE将iOS Deployment Target设置为iOS 4.3 或更高版本在Apple Clang - Code Generation一节确认Generate Position-Dependent Code保持默认值NO在Linking一节确认Generate Position-Dependent Executable保持默认值NO。两个字段均为 NO 时产物即为位置无关的可执行文件。3.4 开启 ARC 保护Swift 应用swiftc编译器自动启用ARC无需任何配置Objective-C 应用需要人工确认步骤为进入目标构建设置确认Objective-C Automatic Reference Counting保持默认值YES。官方背景资料可参阅 Apple 的 Technical QA QA1788 Building a Position Independent Executable该条目由原知识文档引用此处仅作背景说明不构成仓库内证据。四、实战验证在已编译二进制中检测保护机制配置是否正确生效必须回到编译产物上验证。MASTG 提供了两条成熟的技术路径MASTG-TECH-0118获取编译器提供的安全特性 与 MASTG-TECH-0058探索应用包、MASTG-TECH-0082提取捆绑库。4.1 准备工作拿到二进制与全部库解包 IPAMASTG-TECH-0058unzip MASTestApp.ipa # 应用包位于 Payload/MASTestApp.app/ # 主二进制通常与 bundle 同名Payload/MASTestApp.app/MASTestApp列出所有捆绑的动态库与 frameworkMASTG-TECH-0082unzip -o MASTestApp.ipa -d MASTestApp ls -1 MASTestApp/Payload/MASTestApp.app/Frameworks/ # App.framework # Flutter.framework # libswiftCore.dylib # ...为避免遗漏 app 扩展、Watch App 等可执行组件可递归查找find MASTestApp/Payload -type d \( -name *.framework -o -name *.appex -o -name *.app \) find MASTestApp/Payload -type f \( -name *.dylib -o -perm -111 \)也可以用otool -L或 radare2 的il命令查看某个 Mach-O 记录的动态库依赖并过滤掉/System/Library/、/usr/lib/等系统库路径分辨哪些是随 IPA 分发的捆绑库otool -L MASTestApp/Payload/MASTestApp.app/MASTestApp otool -L MASTestApp/Payload/MASTestApp.app/Frameworks/App.framework/App为什么必须逐个分析所有库主二进制的依赖列表并不包含仅属于某个 framework 或扩展的依赖MASTG-TECH-0082 原文说明。因此 PIE / Canary / ARC 检查应对主二进制和每个捆绑库逐一执行。4.2 用 radare2 检查 PIC 与金丝雀以 MASTG 测试文档MASTG-TEST-0087、MASTG-TECH-0118的示例为模板打开主二进制并执行i命令过滤关键字r2 MASTestApp [0x100007408] i~canary,pic canary true pic true输出解读pic truePIE位置无关可执行已启用canary true栈金丝雀已启用。注意i~canary,pic中的波浪号是 radare2 的输出过滤语法类似 grep只显示包含canary或pic的行便于快速定位。4.3 用 radare2 检查 ARC 符号ARC 的启用体现在符号表里。用is命令列出符号并过滤release/retain等关键字MASTG-TECH-0118[0x100007408] is~release,retain 80 0x0000790c 0x10000790c LOCAL FUNC 0 imp.objc_release_x20 82 0x00007924 0x100007924 LOCAL FUNC 0 imp.objc_retain_x25 85 0x00007948 0x100007948 LOCAL FUNC 0 imp.objc_retainAutoreleasedReturnValue 101 0x00007a08 0x100007a08 LOCAL FUNC 0 imp.swift_release 102 0x00007a14 0x100007a14 LOCAL FUNC 0 imp.swift_retain常见的 ARC 相关符号包括objc_autorelease、objc_retainAutorelease、objc_release、objc_retain、objc_retainAutoreleasedReturnValueswift_release、swift_retain判断规则二进制不需要包含全部符号才算启用 ARC——只要存在其中若干符号即可认为 ARC 在使用中。4.4 用 Objection 一键总览如果不习惯 radare2ObjectionMASTG 工具链成员提供了ios info binary命令以表格形式一次性展示各项保护状态MASTG-TECH-0118com.yourcompany.PPClient on (iPhone: 13.2.3) [usb] # ios info binary Name Type Encrypted PIE ARC Canary Stack Exec RootSafe -------------------- ------- ----------- ----- ----- -------- ------------ ---------- PayPal execute True True True True False False CardinalMobile dylib False False True True False False FraudForce dylib False False True True False False ...注意表中Type一列execute对应MH_EXECUTE可检查 PIEdylib对应MH_DYLIBPIE 恒为 False 属正常因为动态库天然位置无关。五、MASTG 测试用例落地从知识到判定MASTG 把上述知识直接映射为三个 V2 测试用例均由知识条目MASTG-KNOW-0061支撑测试用例文件检测对象失败条件MASTG-TEST-0228tests-beta/ios/MASVS-CODE/MASTG-TEST-0228.mdPIE主二进制 PIC 被禁用MASTG-TEST-0229tests-beta/ios/MASVS-CODE/MASTG-TEST-0229.md栈金丝雀任何非纯 Swift 的二进制/库缺少金丝雀相关符号MASTG-TEST-0230tests-beta/ios/MASVS-CODE/MASTG-TEST-0230.mdARC含 Objective-C/Swift 代码的二进制缺少 ARC 相关符号三者均关联漏洞枚举项MASWE-0045。5.1 MASTG-TEST-0228PIE 检查使用 MASTG-TECH-0058 从应用包中提取相关二进制使用 MASTG-TECH-0118 在主二进制上执行并 greppic关键字输出应显示 PIC 启用状态若 PIC 被禁用则测试失败。5.2 MASTG-TEST-0229栈金丝雀检查含预期误报先用 MASTG-TECH-0082 识别全部捆绑库再用 MASTG-TECH-0118 对主二进制与每个共享库提取安全特性相关符号判定任何二进制或库如果不是纯 Swift、却缺少表明金丝雀的符号如objc_autorelease、objc_retainAutorelease测试失败。该用例特别强调以下预期误报false positive场景出现时应视为通过、但需人工复核源码与编译标志内存安全语言如 Flutter/Dart 应用不使用栈金丝雀Dart 自身有缓冲区溢出缓解机制编译器优化库可能原本以-fstack-protector-strong编译React Native 案例但优化后二进制中搜索不到stack_chk_fail。社区讨论中维护者明确表示不会改用-fstack-protector-all理由是额外性能开销换不来实际安全收益——这正是语言/框架相关检测差异的实证。另一个重要提示仅凭__stack_chk_fail符号只能说明应用某处启用了栈破坏保护金丝雀通常对整个二进制统一启停但也存在开发者静态链接了带金丝雀的库、却对整体应用禁用的边界情况。若要对特定安全关键方法做确定结论必须逐个逆向检查MASTG-TEST-0229。5.3 MASTG-TEST-0230ARC 检查Objective-CClang 编译时使用-fobjc-arc标志即可启用 ARCSwift默认启用C/C不适用ARC 是 Objective-C/Swift 专属特性。判定规则启用 ARC 的二进制会包含objc_autorelease、objc_retainAutorelease等符号。若某含 Objective-C 或 Swift 代码的二进制出现_objc_msgSendObjective-C或_swift_allocObjectSwift却缺少对应 ARC 符号则测试失败。同样存在边界误判符号只能证明 ARC 在应用某处启用静态链接的库与整体应用可能启停不一致。若要确证安全关键方法的 ARC 状态需逐一逆向或向开发者索取源码MASTG-TEST-0230。5.4 语言识别Objective-C 还是 Swift检测策略的差异源于语言差异因此第一步是区分二进制语言。MASTG 建议MASTG-TEST-0229通过导入符号与链接库来区分检测 Objective-C 二进制相对容易检测纯 Swift二进制更困难——取决于 Swift 版本与编译设置二进制中仍可能残留 Objective-C 符号或库。这种模糊性是栈金丝雀检测对纯 Swift 无效论断的根源详见 SensePost 博客 On iOS Binary Protections 的 identifying objc vs swift 一节作为背景参考。六、源码级佐证文档与测试在仓库中的组织如果你要追溯本文所有结论的一手来源可按以下路径在仓库中交叉验证知识条目本文主体knowledge/ios/MASVS-CODE/MASTG-KNOW-0061.md通用理论章节Document/0x04h-Testing-Code-Quality.md 中的 Binary Protection Mechanisms含 PIC/PIE、ARC/GC/手动内存管理、栈金丝雀的完整定义技术操作指南MASTG-TECH-0118radare2 与 Objection 命令、MASTG-TECH-0058解包 IPA、MASTG-TECH-0082提取捆绑库V1 时代测试MASTG-TEST-0087Make Sure That Free Security Features Are Activated已标记 deprecated被 V2 用例覆盖内含 DVIA 示例i~pic,canary输出canary true、pic true以及is~release,retain展示的 ARC 符号表V2 时代测试MASTG-TEST-0228、MASTG-TEST-0229、MASTG-TEST-0230七、快速决策清单在实际测试中可按语言维度快速决策二进制类型必查项可跳过项备注纯 Objective-CPIE、Canary、ARC—三项都应在默认构建下开启纯 SwiftPIECanary风险极小且现有检测手段失效、ARC 自动启用仅验证 PIE 即可混合ObjC SwiftPIE、Canary、ARC—按 Objective-C 规则检查C/C 库Canary重点ARC不适用手动内存管理是独立风险点另查 Memory Corruption Bugs动态库MH_DYLIBCanary、ARCPIE天然位置无关主二进制与每个库逐一分析一句话总结Xcode 默认开启的免费安全特性并非永远可靠——用 radare2 的i/is命令或 Objection 的ios info binary验证编译产物按语言差异判断金丝雀与 ARC 的必要性再对照 MASTG-TEST-0228/0229/0230 的失败条件给出最终结论这就是 MASTG 给出的完整 iOS 二进制保护机制检测闭环。赞分享文档教程网络安全【免费下载链接】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 Android 二进制保护机制检测指南PIE、内存管理与 Stack Canary 的判定方法OWASP MASTG Android 二进制保护机制检测指南PIE、内存管理与 Stack Canary 的判定方法 二进制保护机制Binary Prot文档教程网络安全OWASP MASTG 中的 RASP 实战移动应用运行时自保护Runtime Application Self-Protection检测机制与实现路径全解析OWASP MASTG 中的 RASP 实战移动应用运行时自保护Runtime Application Self Protection检测机制与实现路径全文档教程网络安全MASTG 实战指南在 iOS 二进制中检测 URLSession 被降至 TLS 1.0 的最低版本配置MASTG-DEMO-0110MASTG 实战指南在 iOS 二进制中检测 URLSession 被降至 TLS 1.0 的最低版本配置MASTG DEMO 0110 导读 本文以 O文档教程网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考