首页 / 资讯中心 / 文章详情

iOS 可调试应用(Debuggable Apps)检测与防护:深入解析 MASTG 中 get-task-allow 权限的静态与动态分析

iOS 可调试应用(Debuggable Apps)检测与防护:深入解析 MASTG 中 get-task-allow 权限的静态与动态分析 ★ FEATURED ARTICLE
文档教程网络安全【免费下载链接】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中 MASVS-CODE 类别下的 iOS 可调试应用Debuggable Apps知识点系统讲解get-task-allow权限为何会让应用暴露在调试攻击之下、如何在发布前正确关闭调试开关、如何通过静态分析提取 entitlements与动态分析附加 LLDB验证应用是否可调试以及攻击者如何利用这一配置缺陷。读完本文你将掌握从解包 IPA、提取权限、判定结果到运行时验证的一整套可复现的检测流程。什么是可调试的 iOS 应用在 iOS 平台上应用是否可调试由一个关键的代码签名权限entitlement决定get-task-allow。当应用的可执行文件Mach-O 二进制的 entitlements 中包含该键且值为true时系统会允许调试器如 LLDB以task_for_pid方式获取目标进程的 Mach task port从而附加到该进程并实施断点、内存读写、寄存器修改等操作。该知识点的官方定义为MASTG-KNOW-0062Apps can be made debuggable by adding theget-task-allowkey to the app entitlements file and setting it totrue.在 MASVS 的分类体系中该知识点归属于 MASVS-CODE 下的代码质量与构建设置验证目标旧版编号 MSTG-CODE-2对应新版 MASVS-RESILIENCE-4并由测试用例 MASTG-TEST-0261Debuggable Entitlement Enabled in the entitlements.plist覆盖关联弱点编号 MASWE-0063。调试在开发期是功能在发布期是风险调试是应用开发阶段不可或缺的能力开发者借助get-task-allow让 Xcode 可以附加调试器定位崩溃、检查变量、观察调用栈。但一旦应用携带该权限进入 App Store 或企业分发渠道就相当于向攻击者敞开了大门攻击者可以附加 LLDB 等调试器实时观察和篡改运行时的内存数据、函数返回值与认证逻辑可以绕过客户端校验例如破解 crackme、绕过生物识别或证书校验为后续的运行时 hook、注入等逆向工程手段提供便利入口。因此MASTG 的结论非常明确调试功能在发布到 App Store 或企业计划enterprise program之前必须关闭。发布前如何关闭调试能力要确保应用以非调试release模式发布需要从构建环境的编译标志入手检查。原文档给出了四条可操作检查项MASTG-KNOW-0062选择项目的 Build Settings定位编译预处理配置在Apple Clang - Preprocessing → Preprocessor Macros中确认未选中DEBUG或DEBUG_MODE针对 Objective-C 代码确认Debug executable选项未被勾选在Swift Compiler - Custom Flags → Other Swift Flags中确认不存在-D DEBUG条目针对 Swift 代码。这三类开关分别作用于不同层面预处理器宏Preprocessor Macros控制 Objective-C 的#ifdef DEBUG条件编译分支Swift 自定义标志中的-D DEBUG控制 Swift 的#if DEBUG条件编译分支而 Debug executable 则直接决定产物是否携带get-task-allow权限、是否允许调试器附加。从源码结构看调试标志的影响从仓库的演示工程结构可以印证上述开关与产物之间的关系。以 MASTG-DEMO-0036 为例该示例故意在 entitlements 文件中加入了get-task-allow?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyget-task-allow/key true/ /dict /plist文件位于 MASTestApp.entitlements。可以推断该演示应用的构建配置中 Debug executable 处于开启状态或开发签名阶段因此签名后的二进制会内嵌该权限——这正是我们要在测试中捕获的漏洞样本。静态分析提取并检查 entitlements验证一个应用是否可调试最直接的方法是静态提取其二进制中的 entitlements检查get-task-allow的值。完整流程分两步第一步解包 IPA定位主二进制参考 MASTG-TECH-0058Exploring the App Package先用标准 ZIP 工具解包 IPAunzip iGoat-Swift.ipa解包后在Payload目录下得到应用包Application Bundle.app其中与签名和权限相关的关键内容是_CodeSignature/对整个 bundle 所有文件的签名embedded.mobileprovision描述文件主二进制如iGoat-Swift与 bundle 同名、去掉.app后缀的可执行文件entitlements 内嵌于其 Mach-O 结构中。例如 MASTG-DEMO-0036 中的主二进制路径为./Payload/MASTestApp.app/MASTestApp。第二步用四种工具提取 entitlementsMASTG-TECH-0111Extracting Entitlements from MachO Binaries给出了四种提取手段覆盖静态与命令行场景1. rabin2radare2 家族——MASTG-TOOL-0129rabin2 -OC MASTestApp演示工程 run.sh 中正是用该命令配合grep快速聚焦关键权限rabin2 -OC MASTestApp | grep -A1 get-task-allow2. ldid——MASTG-TOOL-0111-e表示提取 entitlements-A指定目标架构16777228:0即CPU_TYPE_ARM64:CPU_SUBTYPE_ARM64_ALLldid -e -A16777228:0 iGoat-Swift.app/iGoat-Swift3. ipsw——MASTG-TOOL-0105ipsw macho info -e iGoat-Swift.app/iGoat-Swift4. codesignmacOS 原生——MASTG-TOOL-0114注意--entitlements的参数必须是-才能将内容输出到标准输出codesign -d --entitlements - iGoat-Swift.app/iGoat-Swift判定标准无论使用哪种工具观察输出中的get-task-allow键即可。以下是一个可调试应用的典型 entitlements 输出来自 MASTG-TECH-0111 的 ldid 示例?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyapplication-identifier/key stringTNAJ496RHB.OWASP.iGoat-Swift/string keycom.apple.developer.team-identifier/key stringTNAJ496RHB/string keyget-task-allow/key true/ keykeychain-access-groups/key array stringTNAJ496RHB.OWASP.iGoat-Swift/string /array /dict /plist结论只要get-task-allow存在且值为true该应用即判定为可调试测试失败MASTG-TEST-0261 的 Evaluation 部分明确The test case fails if theget-task-allowentitlement is present and set totrue。反之若输出中不含该键或值为false则应用以发布模式构建具备应有的防护。在旧版测试 MASTG-TEST-0082 中使用了ldid -e iGoat-Swift.app/iGoat-Swift的简化形式判定逻辑一致。动态分析尝试附加调试器验证静态检查给出配置事实动态分析则验证其实际可利用性——即能否真的把一个调试器附加到运行中的应用进程。底层原理ptrace 与 task_for_pidMASTG-TECH-0084Debugging解释了 iOS 调试与 Linux 的关键差异iOS 上的ptrace系统调用并不完整所有PT_READ_*/PT_WRITE*请求缺失调试器无法用它读写内存。因此 LLDB 等调试器必须通过task_for_pid获取目标进程的 Mach task port再借助 Mach IPC 接口完成挂起进程、读写寄存器thread_get_state/thread_set_state、读写虚拟内存mach_vm_read/mach_vm_write等操作。这就是get-task-allow权限至关重要的根本原因——它授权调试器取得该 task port。前置条件签名 debugserverXcode 自带的debugserver只能附加自身开发的应用。要对任意第三方应用调试需要为其附加task_for_pid-allow等权限并重新签名。基本流程MASTG-TECH-0084从 Xcode 的 DeveloperDiskImage.dmg位于/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/目标iOS版本/中取出/usr/bin/debugserver创建包含task_for_pid-allow、get-task-allow等键的 entitlements.plist用codesign -s - --entitlements entitlements.plist -f debugserver重签名iOS 12 及以上需在设备端用ldid -Sentitlements.xml debugserver完成签名通过iproxy 2222 22转发端口、scp拷入设备后即可附加任意进程debugserver *:1234 -a 2670 # 附加到 PID 2670 debugserver -x backboard *:1234 /Applications/MobileSMS.app/MobileSMS # 启动并调试应用 debugserver *:1234 -a MobileSMS # 按名称附加到已运行应用宿主机侧连接(lldb) process connect connect://ip-of-ios-device:1234对可调试应用的验证结论若静态分析确认get-task-allow为true那么动态附加调试器通常会成功——这直接证实了该配置缺陷可被攻击者利用。反过来若应用带有反逆向/反调试防护anti-debugging调试器可能被检测并中止这一情况在 MASTG-TEST-0082 中有明确提醒if the application is equipped with anti-reverse engineering controls, then the debugger can be detected and stopped。这意味着附加失败并不必然代表应用不可调试也可能是反调试机制在起作用需要结合静态结果综合判断。从知识点到测试用例仓库内的完整证据链该主题在仓库中形成了完整的知识点 → 测试用例 → 演示工程三级结构便于读者复现与引用层级文件内容知识点MASTG-KNOW-0062概念定义与发布前关闭调试开关的检查项测试用例V2MASTG-TEST-0261静态解包 提取 entitlements get-task-allow判定测试用例V1 旧版MASTG-TEST-0082旧版 MSTG-CODE-2 测试含 ldid 示例与动态附加说明测试技术MASTG-TECH-0111四种 entitlements 提取工具与完整输出示例测试技术MASTG-TECH-0058IPA 解包与应用包结构解析测试技术MASTG-TECH-0084LLDB 调试原理与 debugserver 部署演示工程MASTG-DEMO-0036含get-task-allow的样本工程entitlements、run.sh、output.asm其中演示工程的运行脚本 run.sh 提供了一条可直接执行的检测命令rabin2 -OC MASTestApp | grep -A1 get-task-allow运行后若输出中出现keyget-task-allow/key与true/即可判定样本为可调试应用测试失败——这与 MASTG-DEMO-0036 的评估结论一致。小结与安全建议开发期get-task-allow true是 Xcode 调试所必需的仅应在开发/测试构建中使用发布期必须确保 release 构建不包含get-task-allow。检查点包括 Debug executable、Objective-C 的DEBUG/DEBUG_MODE预处理器宏以及 Swift 的-D DEBUG自定义编译标志检测方法解包 IPAunzip→ 用 rabin2 / ldid / ipsw / codesign 提取 entitlements → 检查get-task-allow进一步可用 LLDB/debugserver 尝试动态附加验证可利用性判定口径entitlements 中出现get-task-allow且为true即构成可调试缺陷MASWE-0063对应 MASTG-TEST-0261 测试失败。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐使用 rabin2 检测 iOS 可调试 Appget-task-allow Entitlement 静态分析实战MASTG-DEMO-0036使用 rabin2 检测 iOS 可调试 Appget task allow Entitlement 静态分析实战MASTG DEMO 0036 本篇技术文档教程网络安全OWASP MASTG Android 可调试应用Debuggable Apps检测指南从 Manifest 标志到 JDWP 反调试OWASP MASTG Android 可调试应用Debuggable Apps检测指南从 Manifest 标志到 JDWP 反调试 导读 本文基于 O文档教程网络安全MASTG 实战Android 原生反调试检测——TracerPid 与 ptrace 自检的静态分析MASTG-DEMO-0116MASTG 实战Android 原生反调试检测——TracerPid 与 ptrace 自检的静态分析MASTG DEMO 0116 本篇基于 OWASP文档教程网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站