多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

OWASP MASTG iOS 逆向工程工具检测测试实战:MASTG-TEST-0091 的原理、执行与绕过评估

OWASP MASTG iOS 逆向工程工具检测测试实战:MASTG-TEST-0091 的原理、执行与绕过评估 文档教程网络安全【免费下载链接】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移动应用安全测试指南中的 iOS 逆向工程工具检测测试用例 MASTG-TEST-0091 为核心结合仓库内的知识页 MASTG-KNOW-0087、最佳实践 MASTG-BEST-0048 及 V2 版接替用例 MASTG-TEST-0354 展开。读完本文你将掌握如何设计并执行针对 Frida、ElleKit、SSL Kill Switch 3 等逆向工具的检测验证实验如何评估检测机制的可绕过性以及从防御方视角理解这些检测手段的效力边界。一、测试用例定位从 MSTG-RESILIENCE-4 到 MASVS-RESILIENCE-4MASTG-TEST-0091 是 MASTG V1 体系下的 iOS 逆向工程工具检测测试用例其 Front Matter 元数据清晰标明了它在整个安全验证体系中的位置字段值说明masvs_v1_idMSTG-RESILIENCE-4V1 时代归属的 MASVS 控制项编号masvs_v2_idMASVS-RESILIENCE-4V2 时代对应的 MASVS 编号platformios仅适用于 iOS 平台masvs_v1_levelsR属于 Resilience弹性/抗逆向高级别要求profiles[R]对应 V2 的 R 类测试画像statusdeprecated已弃用由 V2 新用例接替covered_by[MASTG-TEST-0354]接替用例编号deprecation_noteNew version available in MASTG V2弃用原因说明该用例在 V2 中的接替者是 MASTG-TEST-0354标题为 Runtime Use of Hook Detection Techniques运行时 Hook 检测技术使用情况类型标记为[dynamic, hooks]关联的弱点编号为 MASWE-0058并配套引用知识页 MASTG-KNOW-0087 与最佳实践 MASTG-BEST-0048。从仓库结构看围绕该测试用例形成了测试用例tests/tests-beta→ 知识页knowledge→ 最佳实践best-practices→ 工具页tools→ 技术页techniques的完整证据链这也是 MASTG 内容组织的一贯模式测试描述做什么知识页解释检测原理最佳实践指导如何加固。二、测试目的与判定逻辑2.1 测试思路OverviewMASTG-TEST-0091 的测试思路非常直接在测试设备上预先安装各种逆向工程工具与框架然后正常启动目标 App观察 App 是否对这些工具的存在作出响应。文档点名的代表性工具包括MASTG-TOOL-0031Frida跨平台动态插桩框架MASTG-TOOL-0139ElleKitiOS 函数 Hook 框架MASTG-TOOL-0066SSL Kill Switch 3禁用 SSL 证书校验含证书固定的越狱插件。2.2 期望的防御响应行为文档明确指出App 应当以某种方式对逆向工具的存在作出反应典型响应包括四类向用户弹出警告并要求其确认接受相关责任如检测到越狱/调试环境继续使用风险自负优雅地终止执行阻止 App 继续运行安全擦除设备上存储的敏感数据上报后端服务器例如用于反欺诈检测与风控。若 App 对这些工具的存在完全无动于衷则说明其缺乏对逆向工程工具的基本检测能力——在 V2 用例 MASTG-TEST-0354 中判定标准被进一步形式化为如果 Hook 成功执行并返回预期数据测试即判定失败Failed表明 App 缺少运行时完整性校验。2.3 测试之后的绕过评估检测到防御响应只是第一步测试用例的核心价值在于评估这些检测机制的实际强度。文档要求测试人员在观察到防御响应后继续尝试绕过检测并回答四个关键问题检测机制能否被平凡地绕过例如仅仅 Hook 单个 API 函数通过静态与动态分析定位检测代码的难度有多大是否必须编写自定义代码才能禁用防御花费了多少时间对绕过该机制的难度总体评估是什么这四问构成了一套可量化的攻防对抗评估框架后续各节将分别从攻击方与防御方两个视角展开。三、被检测的典型逆向工具及其工作机制理解检测机制的前提是理解被检测工具的工作机制。以下三类工具是 iOS 逆向工具检测场景中最常出现的对象。3.1 Frida最常被检测的动态插桩框架Frida 通过将 QuickJS JavaScript 引擎注入目标进程允许测试人员在原生 App 上执行任意 JavaScript 片段。其三种运行模式对应三种不同的可检测特征模式工作原理可检测特征Injected注入模式frida-server 以守护进程运行在设备上默认监听 localhost:27042通过 ptrace 劫持目标进程线程注入 frida-agent.so 并与主机端建立双向通信需要越狱设备设备上存在 frida-server 进程与 27042 端口Embedded嵌入式模式将 frida-gadget 库嵌入 IPA 并强制 App 作为原生库加载适用于未越狱设备App 包内出现 FridaGadget.dylib 等库文件Preloaded预加载模式类似DYLD_INSERT_LIBRARIES由 frida-gadget 自主运行并从文件系统加载脚本依赖 dyld 加载机制可被 dyld 镜像枚举发现Frida 的两大核心 API 也是检测的重点对象Interceptor在函数序言处注入 trampoline内联 Hook将执行流重定向到自定义代码。这种方式会覆写原始代码类似于调试器下断点因此可被 App 的自身代码校验checksum或 trampoline 扫描检测到Stalker采用即时动态重编译基于 Capstone将代码复制到新内存区域并交错插入插桩代码不触碰原始代码因此对基于代码校验与 trampoline 检测的手段免疫但会留下执行痕迹。需要说明的是Frida 17 引入了破坏性变更内置的 Java/Objective-C/Swift 运行时桥被移除编写自定义 Frida 工具时需通过frida-pm install frida-java-bridge等方式单独安装桥接包并用frida-compile打包脚本。详细信息见 MASTG-TOOL-0031 文档。3.2 ElleKit越狱生态的 Hook 基础设施ElleKit 是 Dopamine、palera1n 等主流越狱使用的函数 Hook 框架提供对 Substrate 与 libhooker 两套 API 的兼容。通过 SileoMASTG-TOOL-0064 安装的越狱插件tweak通常借助 ElleKit 修改 App 行为例如篡改函数参数或返回值具体机制见 MASTG-TECH-0067。由于 ElleKit 是越狱生态的基础组件其加载的 dylib、注入的 trampoline 等痕迹都可作为检测对象检测方式与 Frida 类似详见第四节。3.3 SSL Kill Switch 3禁用证书校验的越狱插件SSL Kill Switch 3 是一款 jailbreak tweak用于在 iOS/macOS App 内禁用 SSL 证书验证——包括对证书固定certificate pinning的绕过。它的存在本身就意味着设备处于越狱状态且被植入了网络层插桩因此也是逆向工具检测应覆盖的对象之一。完整说明见 MASTG-TOOL-0066。四、检测机制深挖以 Frida 为例的原理分析知识页 MASTG-KNOW-0087 对逆向工程工具检测给出了系统性的原理剖析。其核心观点是可以从未经修改的逆向工具安装痕迹关联的应用程序包、文件、进程、工具特有的修改与工件入手实现检测。下文以 Frida 为例展开其他工具如 ElleKit可同理检测。4.1 Frida 的典型残留痕迹Frida 在默认配置注入模式下以frida-server名称运行在越狱设备上当显式附加目标 App如通过 frida-trace 或 Frida CLI时会向 App 内存注入frida-agent。其残留痕迹包括frida-server 进程及其绑定的 TCP 端口 27042嵌入模式的FridaGadget.dylib库文件。以嵌入模式为例App 的静态内容ARM 编译产物与外部库存放在Application.app目录下。在越狱设备上查看 App 的 Frameworks 目录可直接观察到嵌入的 Frida 库iPhone:/var/containers/Bundle/Application/UUID/SwiftSecurity.app/Frameworks root# ls -alh total 87M drwxr-xr-x 10 _installd _installd 320 Nov 19 06:08 ./ drwxr-xr-x 11 _installd _installd 352 Nov 19 06:08 ../ -rw-r--r-- 1 _installd _installd 70M Nov 16 06:37 FridaGadget.dylib -rw-r--r-- 1 _installd _installd 3.8M Nov 16 06:37 libswiftCore.dylib ...4.2 四种典型检测方法及效力讨论MASTG-KNOW-0087 以表格形式总结了四类典型的 Frida 检测方法及其绕过难度其中部分方法已在 MASTG-TOOL-0141 中有落地实现方法原理效力讨论检查环境相关工件查找 frida-server 进程、Frida 库、临时文件等痕迹遍历已加载库_dyld_get_image_name查找含 frida 的名称进程查询在 iOS 上缺乏公开 APICommandLine不可用NSTask方案会导致 App Store 审核被拒dyld 镜像枚举仅对嵌入式/经 dyld 加载的工具有效frida-server 注入模式使用绕过 dyld 的自定义 Mach-O 加载器无法被检出改名即可绕过检查开放 TCP 端口frida-server 默认绑定 27042 端口探测端口是否开放只能检测默认配置端口可通过命令行参数修改绕过极为简单检查 D-Bus AUTH 响应frida-server 使用 D-Bus 协议通信向每个开放端口发送 D-Bus AUTH 消息并检查应答对 frida-server 较为稳健但 Frida 还有不需要 frida-server 的替代运行模式检查命名管道named pipesfrida-server 通过命名管道进行外部通信对 Frida Interceptor/ElleKit 有效但对 Stalker 无效4.3 检测的固有盲区值得特别强调的是 dyld 镜像枚举的局限。在 iOS 上/proc目录不可用无法像 Android 那样直接 grep 进程内存映射而 frida-server 注入模式下其 agent 是通过自定义 Mach-O 加载器绕过 dyld注入的_dyld_image_count/_dyld_get_image_name只返回 dyld 追踪的镜像因此官方构建的 frida-server 注入模式无法被 dyld 镜像列表检测。该技术仅对 Frida Gadget嵌入模式和经DYLD_INSERT_LIBRARIES等 dyld 途径加载的工具有效。此外还有两类可选的检测途径trampoline 检测识别 Interceptor/ElleKit 在函数序言注入的跳板代码以及命名管道检测。但正如文档强调的每种检测方法的有效性都取决于是否越狱、越狱的具体版本与方式、以及工具自身的版本——这是一场持续的猫鼠游戏。五、实战执行步骤从安装到观察与评估5.1 V1 测试流程MASTG-TEST-0091在测试设备上安装一种或多种逆向工程工具/框架Frida、ElleKit、SSL Kill Switch 3 等启动目标 App观察 App 是否产生防御响应警告、终止、擦除数据、上报后端观察到响应后开展绕过工作并回答 2.3 节中的四个评估问题。5.2 V2 测试流程MASTG-TEST-0354V2 用例将测试流程细化为一套可复现的动态测试步骤使用 MASTG-TECH-0056 安装 App使用 MASTG-TECH-0095Method Hooking 对相关 API 调用进行 Hook全面操作 App尽可能触发更多流程并在一切可输入的位置输入敏感数据。V2 关注的高价值 Hook 目标包括源自 MASTG-TEST-0354钥匙串与凭据HookSecItemCopyMatching、SecItemAdd、SecItemUpdate可提取钥匙串条目、会话令牌、凭据与机密密码学操作HookSecKeyCreateSignature、SecKeyCreateDecryptedData、CCCrypt可提取密钥、签名、明文或解密数据本地认证HookLAContext.evaluatePolicy、LAContext.evaluateAccessControl可绕过认证网络层HookURLSession.dataTask(with:completionHandler:)、URLSession.uploadTask、URLSession.downloadTask、URLSessionTask.resume可提取或篡改敏感网络数据。5.3 方法 Hook 的标准姿势以 MASTG-TECH-0095 中拦截NSURLRequest initWithURL:方法的 Frida 脚本为例该脚本展示了使用ObjC.classes获取类方法、用Interceptor.attach挂钩、并通过NSAutoreleasePool管理内存的标准范式import sys import frida # JavaScript to be injected frida_code // Obtain a reference to the initWithURL: method of the NSURLRequest class var URL ObjC.classes.NSURLRequest[- initWithURL:]; // Intercept the method Interceptor.attach(URL.implementation, { onEnter: function(args) { // Get a handle on NSString var NSString ObjC.classes.NSString; // Obtain a reference to the NSLog function, and use it to print the URL value // args[2] refers to the first method argument (NSURL *url) var NSLog new NativeFunction(Module.findExportByName(Foundation, NSLog), void, [pointer, ...]); // We should always initialize an autorelease pool before interacting with Objective-C APIs var pool ObjC.classes.NSAutoreleasePool.alloc().init(); try { // Creates a JS binding given a NativePointer. var myNSURL new ObjC.Object(args[2]); // Create an immutable ObjC string object from a JS string object. var str_url NSString.stringWithString_(myNSURL.toString()); // Call the iOS NSLog function to print the URL to the iOS device logs NSLog(str_url); // Use Fridas console.log to print the URL to your terminal console.log(str_url); } finally { pool.release(); } } }); process frida.get_usb_device().attach(Safari) script process.create_script(frida_code) script.load() sys.stdin.read()5.4 观察与评估执行测试后观察输出中应出现以下两类结果之一Hook 回调数据函数参数、返回值、调用栈等——说明插桩成功会话终止、脚本报错、空响应或缺失预期 Hook 数据——说明 App 检测到了插桩并作出防御响应。判定规则如果 Hook 成功执行并返回预期数据说明 App 缺少运行时完整性校验测试失败。同时必须注意假阴性False Negative如果所选 Hook 点未覆盖 App 的敏感代码路径、所触发的流程未处理敏感数据、或 App 的 Hook 检测逻辑以规避本次插桩的方式实现如混淆、动态加载、原生代码、反插桩技术、或在 Hook 安装之前就执行的检查则未发现任何结果并不代表 App 具备有效的运行时 Hook 检测需要额外的逆向工程或自定义插桩进一步确认。六、绕过检测攻击方的对抗思路知识页 MASTG-KNOW-0087 给出了绕过逆向工具检测的两步指南修补反逆向功能通过二进制修补工具如 MASTG-TOOL-0073/MASTG-TOOL-0098 或 MASTG-TOOL-0033禁用不想要的检测行为NOP 掉检测函数、修改跳转条件等Hook 文件系统 API使用 MASTG-TOOL-0039 或 MASTG-TOOL-0139ElleKit 在 Objective-C/Swift 层或原生层 Hook 文件系统 API返回指向原始文件的句柄而非被修改的文件从而让基于文件内容/校验和的检测失效。结合 2.3 节的四问框架评估者应针对每个被发现的检测点逐一回答能否单点 Hook 即绕过平凡绕过检测代码的定位难度静态符号、字符串、混淆程度是否需要编写自定义代码及其耗时最终给出综合难度评估。值得注意的是检测→绕过本身是循环往复的文档明确指出检测库是平凡任务绕过检测同样平凡——例如仅需重命名 frida-server/frida-gadget/frida-agent 工件即可使大部分名称匹配检测失效。七、防御方视角MASTG-BEST-0048 的加固建议最佳实践 MASTG-BEST-0048 将针对逆向工具的防御组织为三类控制构成纵深防御体系7.1 检测类控制Detective Controls检查加载的动态库用_dyld_image_count()/_dyld_get_image_name()遍历已加载库匹配FridaGadget、frida-agent、cynject等已知工件名。需注意其盲区frida-server 注入模式的 agent 绕过 dyld 注入不在 dyld 镜像列表中且基于名称的检查可通过重命名库绕过多技术叠加库名扫描 TCP 27042 端口探测发送 D-Bus AUTH 消息观察应答 命名管道扫描提高覆盖度。7.2 威慑类控制Deterrent Controls检测逻辑用原生代码C实现原生代码远难于 Swift/Objective-C后者可被 Frida 的ObjC/SwiftAPI 直接拦截但需注意原生层向应用层回传结果的那次桥接调用本身仍可被 Hook混淆检测逻辑参考 MASTG-KNOW-0089 对检测例程做代码混淆将检查点散布到整个应用而非集中一处并变化检测时机周期性、随机事件触发、敏感操作前一刻内联检测逻辑避免将检测代码放进独立命名函数——命名函数的固定入口可被单个 Hook 打补丁直接在调用点内联检测逻辑可消除这一固定目标。7.3 响应类控制Responsive Controls检测到逆向工具后立即终止会话、清除内存中的敏感数据、上报后端服务器标记被入侵的会话。不允许 App 在被入侵状态下继续运行且响应机制本身也应在原生代码中实现并做控制流混淆。八、测试前提、局限与注意事项环境前提frida-server 注入模式只能在越狱设备上运行未越狱设备上只能使用嵌入式 frida-gadget 模式。检测方法的效果随越狱版本、工具版本不同而变化iOS 平台限制iOS 无公开 API 查询运行进程或执行系统命令CommandLine不可用NSTask会导致 App Store 审核被拒因此基于进程枚举的检测在 iOS 上受限范围声明MASTG-TEST-0354 明确将检测机制的健壮性与抗绕过性排除在测试范围之外——检测方法与绕过技术都在持续演进坚定的攻击者拥有足够时间与资源仍可规避保护。此类机制应作为纵深防御的一部分而非独立解决方案猫鼠游戏本质工具的每次更新如 Frida 17、新注入方式、端口修改、工件改名都可能使既有检测失效检测方需持续跟进。九、仓库资源导航如需深入研读建议按以下路径继续探索当前仓库测试用例V1 弃用版tests/ios/MASVS-RESILIENCE/MASTG-TEST-0091.md测试用例V2 现行版tests-beta/ios/MASVS-RESILIENCE/MASTG-TEST-0354.md原理知识页knowledge/ios/MASVS-RESILIENCE/MASTG-KNOW-0087.mdFrida 检测方法详表见其 L19-L61 附近加固最佳实践best-practices/MASTG-BEST-0048.md工具文档Frida、ElleKit、SSL Kill Switch 3、Sileo操作技术iOS 应用安装、方法 Hook 实战、越狱插件机制赞分享文档教程网络安全【免费下载链接】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 逆向工程工具检测测试MASTG-TEST-0048实战指南从检测评估到绕过验证OWASP MASTG Android 逆向工程工具检测测试MASTG TEST 0048实战指南从检测评估到绕过验证 导读 本文围绕 OWASP Mob文档教程网络安全OWASP MASTG Android 根检测测试指南绕过手法与有效性评估MASTG-TEST-0045OWASP MASTG Android 根检测测试指南绕过手法与有效性评估MASTG TEST 0045 导读 本文围绕 OWASP Mobile App文档教程网络安全iOS 原生代码混淆不足检测实战基于 OWASP MASTG 的 MASTG-TEST-0391 逆向测试指南iOS 原生代码混淆不足检测实战基于 OWASP MASTG 的 MASTG TEST 0391 逆向测试指南 MASTG TEST 0391 是 OWASP文档教程网络安全上一篇Greasy Fork完全上手从安装到部署的零门槛攻略下一篇SDRPlusPlus配置文件合并算法多设备设置冲突解决创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表