恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
在 iOS 二进制中挖掘硬编码 HTTP URL:MASTG-DEMO-0084 实战剖析(OWASP MASTG)
首页
资讯中心
/
在 iOS 二进制中挖掘硬编码 HTTP URL:MASTG-DEMO-0084 实战剖析(OWASP MASTG)
在 iOS 二进制中挖掘硬编码 HTTP URL:MASTG-DEMO-0084 实战剖析(OWASP MASTG)
发布时间:2026/10/7 9:59:41
文档教程网络安全【免费下载链接】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 Mobile Application Security Testing GuideMASTG仓库中的 MASTG-DEMO-0084 为骨架讲解如何对已编译的 iOS 应用二进制执行静态分析定位硬编码的明文 HTTP 地址并结合 ATSApp Transport Security配置判断其真实危害。读者将掌握一条完整的实战链路解包 IPA → 用 radare2 脚本枚举http://字符串 → 通过交叉引用与反汇编追踪字符串的调用路径 → 结合 Info.plist 中的 ATS 例外评估风险从而能够在没有源码的情况下独立完成 MASTG-TEST-0321 的判定。一、Demo 背景一个注定失败的 iOS 网络样本MASTG-DEMO-0084属于 MASTG 的demos/ios/MASVS-NETWORK/目录是一个kind: fail的失败示例对应的测试用例是 MASTG-TEST-0321: Hardcoded HTTP URLs关联的安全弱点为 MASWE-0026。它的前身是MASTG-TEST-0065Testing Data Encryption on the Network后者已被标记为deprecated并由 MASTG V2 系列测试0321/0322/0236取代见 tests/ios/MASVS-NETWORK/MASTG-TEST-0065.md 的covered_by字段。配套样本由三部分构成见 MASTG-DEMO-0084 目录MASTestApp已编译的 Mach-O 主二进制MastgTest.swift对应的 Swift 源码用于对照验证二进制中的字符串与调用http_urls.r2run.sh驱动 radare2 的静态分析脚本与执行入口output.txt本次分析的完整输出即证据。需要强调MASTG-DEMO-0084讨论的是二进制层面的硬编码 URL 挖掘而兄弟 Demo MASTG-DEMO-0083 讨论的是Info.plist 层面的不安全 ATS 配置。两者互为印证——前者证明应用确实使用了明文 URL后者证明ATS 恰好放行了该域名合在一起才能构成完整的失败判定。二、样本代码硬编码 HTTP URL 的犯罪现场先看对应的源码 MastgTest.swift它直观展示了三类 URL 的对比import Foundation struct MastgTest { // SUMMARY: This sample demonstrates the use of hardcoded HTTP URLs in iOS apps. static let httpEndpoint http://httpbin.org/get // FAIL: [MASTG-TEST-0321] Hardcoded HTTP URL static let httpApiUrl http://example.com/api // FAIL: [MASTG-TEST-0321] Hardcoded HTTP URL static let httpsEndpoint https://httpbin.org/get // PASS: [MASTG-TEST-0321] HTTPS URL static func mastgTest(completion: escaping (String) - Void) { var result Testing HTTP URL connections:\n\n // Attempt to connect to HTTP endpoint if let url URL(string: httpEndpoint) { let task URLSession.shared.dataTask(with: url) { data, response, error in if let error error { result HTTP request to \(httpEndpoint) failed: \(error.localizedDescription)\n } else if let httpResponse response as? HTTPURLResponse { result HTTP request to \(httpEndpoint) returned status: \(httpResponse.statusCode)\n } completion(result) } task.resume() } else { result Invalid URL: \(httpEndpoint)\n completion(result) } } }代码注释直接标注了判定结论http://httpbin.org/get与http://example.com/api均为 FAIL硬编码 HTTP URLhttps://httpbin.org/get为 PASSHTTPS URL不触发该测试。关键调用链是URL(string: httpEndpoint)构造URL实例再交给URLSession.shared.dataTask(with:)发起请求——这是 iOS 标准 URL Loading System 的用法因此受 ATS 管控这一点对后续判定至关重要如果应用改用低层 APIATS 根本不生效见下文第六节的讨论。三、实战步骤用 radare2 从二进制中挖出 URL3.1 解包并定位主二进制依据技术文档 MASTG-TECH-0058: Exploring the App Package首先解压 IPA本质是一个 zip 包进入.app包并定位主二进制。本例中路径为./Payload/MASTestApp.app/MASTestApp3.2 编写 radare2 分析脚本MASTG-DEMO-0084使用 radare2iOS 作为分析引擎其脚本 http_urls.r2 内容如下e asm.bytesfalse e scr.colorfalse e asm.varfalse ?e Uses of http:// URLs: iz~http:// ?e ?e xrefs to http://httpbin.org/get: axt 0x100006c60 ?e ?e Use of http://httpbin.org/get: pd 15 0x100005130 ?e ... pd-- 5 0x100005238逐条解读脚本的意图e asm.bytesfalse/e scr.colorfalse/e asm.varfalse关闭字节显示、彩色输出与变量名折叠保证输出干净、利于后续 grep 与归档iz~http://iz列出 Mach-O__TEXT.__cstring段中的字符串~是 radare2 内置过滤器等价于 grep筛出所有含http://的字符串axt 0x100006c60axt列出该地址的交叉引用xrefs找出谁引用了http://httpbin.org/get字符串pd 15 0x100005130在引用点反汇编 15 条指令展示字符串如何被使用pd-- 5 0x100005238从0x100005238往前反汇编 5 条指令展示 URLSession 相关调用点。3.3 执行脚本run.sh 是唯一的执行入口一条命令完成分析#! /bin/bash r2 -q -i http_urls.r2 -A MASTestApp output.txt参数说明-qquiet 模式抑制交互提示-i http_urls.r2以批处理方式执行脚本-A启动时自动完成全量分析aa 等分析步骤生成函数、交叉引用数据库——没有这一步axt与pd无法给出有意义的符号级结果 output.txt将结果重定向保存为证据文件。值得说明radare2 是开源逆向框架而 rabin2 是它的姊妹命令行工具常用于快速抽取二进制信息导入导出、数据段字符串、交叉引用、入口点、架构类型等。在本流程中 radare2 承担了交互式深度分析的角色两者配合可以覆盖从快速枚举到逐指令追踪的不同需求。四、观察output.txt 揭示的二进制证据运行后得到的 output.txt 是本 Demo 的核心证据分三段呈现。4.1 明文 URL 字符串清单Uses of http:// URLs: 0 0x00006bd0 0x100006bd0 56 57 2.__TEXT.__cstring ascii HTTP request to http://httpbin.org/get returned status: 1 0x00006c10 0x100006c10 47 48 2.__TEXT.__cstring ascii HTTP request to http://httpbin.org/get failed: 2 0x00006c60 0x100006c60 22 23 2.__TEXT.__cstring ascii http://httpbin.org/get 3 0x00006c80 0x100006c80 36 37 2.__TEXT.__cstring ascii Invalid URL: http://httpbin.org/get\n各列含义序号 / 文件偏移 / 虚拟地址 / 字符串长度 / 段名 / 类型 / 内容。四条命中全部落在__TEXT.__cstring段且都指向同一个 URLhttp://httpbin.org/get——既包含直接请求的 URL 本体也包含拼接进日志文案的间接引用。值得注意的是源码中还存在http://example.com/api但在该二进制路径下未出现在本次输出中说明具体运行代码路径不同字符串清单会随之变化本次 Demo 的mastgTest只实际使用了httpEndpoint。4.2 交叉引用谁引用了该字符串xrefs to http://httpbin.org/get: sym.func.100005024 0x100005130 [STRN:r--] add x8, x8, str.http:__httpbin.org_getradare2 定位到函数sym.func.100005024其内部0x100005130处有一条add x8, x8, 0xc60指令将寄存器指向字符串地址0x100006c60。这证明该 URL不是死字符串而是被某函数实际取用。4.3 反汇编完整的调用链│ 0x100005130 add x8, x8, 0xc60 ; 0x100006c60 ; http://httpbin.org/get │ 0x100005134 sub x27, x8, 0x20 │ 0x100005138 mov x0, x24 │ 0x10000513c bl sym.imp.swift_retain │ 0x100005140 mov x0, x23 ; void *arg0 │ 0x100005144 bl sym.imp.swift_bridgeObjectRetain ; void *swift_bridgeObjectRetain(void *arg0) │ 0x100005148 orr x1, x27, 0x8000000000000000 │ 0x10000514c mov x8, x26 │ 0x100005150 mov x0, 0x16 │ 0x100005154 movk x0, 0xd000, lsl 48 │ 0x100005158 bl sym.imp.Foundation.URL.string_...cfC_ ; Foundation.URL.string(...cfC) │ 0x10000515c ldr x8, [x28, 0x30] │ 0x100005160 mov x0, x26 │ 0x100005164 mov w1, 1 │ 0x100005168 mov x2, x22 ... │ 0x100005224 mov x0, x27 │ 0x100005228 mov x1, x26 │ 0x10000522c mov x2, x22 │ 0x100005230 blr x8 │ 0x100005234 adrp x8, segment.__DATA ; 0x10000c000 │ 0x100005238 ldr x0, [x8, 0xc8] ; [0x10000c0c8:4]158 │ ; reloc.NSURLSession ; void *arg0 │ 0x10000523c bl sym.imp.objc_opt_self ; void *objc_opt_self(void *arg0) │ 0x100005240 adrp x8, segment.__DATA ; 0x10000c000 │ 0x100005244 ldr x1, [x8, 0xa0] ; [0x10000c0a0:4]0x6e87 ; reloc.fixup.sharedSession ; char *selector │ 0x100005248 bl sym.imp.objc_msgSend ; void *objc_msgSend(void *instance, char *selector)对照源码逐段还原0x100005130字符串http://httpbin.org/get被装入寄存器即源码中URL(string: httpEndpoint)的实参准备0x100005158调用Foundation.URL.string(...)构造URL实例——对应源码第 14 行URL(string: httpEndpoint)0x100005238起加载reloc.NSURLSession、调用objc_msgSend获取sharedSession重定位引用reloc.fixup.sharedSession随后发起会话请求——对应源码第 15 行URLSession.shared.dataTask(with: url)。至此从字符串到URL构造再到URLSession的三级调用链在反汇编层面被完整闭合这正是 MASTG-DEMO-0084 判定该 URL 确实被应用使用的硬证据。五、评估为什么判定为 FAILMASTG-DEMO-0084的结论是明确的失败kind: fail依据有两条缺一不可二进制中存在硬编码的明文 URLhttp://httpbin.org/get被实际使用见上文调用链触发 MASTG-TEST-0321ATS 配置放行了该域名应用在 Info.plist 中通过NSExceptionDomains为httpbin.org配置了NSExceptionAllowsInsecureHTTPLoads true相关细节见 MASTG-DEMO-0083因此该 HTTP 请求不会被 ATS 拦截能够真正发出明文流量。两者结合说明硬编码 URL从潜在风险升级为实际可利用的明文通信缺陷。需要特别留意 MASTG-TEST-0321 的局限性说明见 MASTG-TEST-0321.md二进制中存在 HTTP URL 并不意味着它一定被用于通信。其使用与否取决于运行时条件例如 URL 如何被调用、应用 ATS 配置是否允许明文流量。当 ATS 启用且未配置例外时HTTP 请求可能直接失败见 MASTG-TEST-0322而如果应用使用绕过 ATS 的低层 API请求则可能成功同样见 MASTG-TEST-0322。因此静态分析必须与动态验证互补例如通过中间人代理捕获真实网络流量确认应用在运行期确实向这些 HTTP 地址发起连接对应 MASTG-TEST-0236 的动态测试思路以及 MASTG-TEST-0065 中ATS 配置与真实流量可能不一致的告诫——即使 Info.plist 禁用了明文低层 API 或配置不当的跨平台框架仍可能偷偷发送 HTTP。六、知识延伸ATS 例外与明文流量判定要点由于 MASTG-DEMO-0084 的判定强依赖 ATS 上下文这里补充 MASTG-TEST-0065 / MASTG-TEST-0322 中的关键知识点iOS 9.0 起ATS 默认阻止明文 HTTP但存在多种后门使应用仍可发送明文在NSAppTransportSecurity中将NSAllowsArbitraryLoads设为true全局关闭iOS 10 起可用NSAllowsArbitraryLoadsInWebContent关闭 WebView 内容的 ATS 限制通过NSExceptionDomains为指定域名配置NSExceptionAllowsInsecureHTTPLoads true本 Demo 即属此类。ATS 不适用于低层网络接口如 Network framework、CFNetwork。Apple 官方建议优先使用 URL Loading System 这类高层框架因为低层 API 的安全责任完全落在开发者身上且犯错容易、代价高昂见 MASTG-TEST-0065.md 引用的 Apple 文档。ATS 例外并非一律不可接受如 Firefox iOS 出于浏览器产品定位全局禁用 ATS 即属合理例外但即便如此也应在 ATS 配置中包含 justification 说明字符串。静态检查的注意点应同时覆盖应用主二进制之外的内嵌扩展、framework、Watch App 等所有可执行组件见 MASTG-TEST-0065.md。对应到本 Demo 的 Info.plist可以看到一个叠满了 buff的不安全配置NSAllowsArbitraryLoads、NSAllowsArbitraryLoadsInWebContent、NSAllowsArbitraryLoadsForMedia、NSAllowsArbitraryLoadsForLocalNetworking全部为true外加api.example.com与httpbin.org两个域名级例外。MASTG-DEMO-0083 的评估还指出一个易被忽视的细节当NSAllowsArbitraryLoadsForLocalNetworking、NSAllowsArbitraryLoadsForMedia、NSAllowsArbitraryLoadsInWebContent存在时无论取值NSAllowsArbitraryLoads会被忽略。而本 Demo 中实际生效的是httpbin.org的域名级例外——正是它让http://httpbin.org/get的请求得以放行。七、总结与可复用的检测方法论MASTG-DEMO-0084 给出了一条可复用的无源码 iOS 明文 URL 审计流水线解包定位按 MASTG-TECH-0058 解压 IPA定位主二进制Payload/*.app/*字符串枚举radare2 的iz~http://快速筛出__TEXT.__cstring中的明文 URL引用追踪axt 地址找到引用者pd反汇编还原URL构造与URLSession调用链确认 URL 是否真正在用ATS 交叉验证检查 Info.plist 的NSAppTransportSecurity判断明文请求是否会被放行动态确认用代理抓包验证运行期真实流量避免误报/漏报对应 MASTG-TEST-0236。整套流程所需的证据文件——分析脚本、执行命令、输出结果——均可在仓库的 MASTG-DEMO-0084 目录 中直接复现验证。它同时展示了 MASTG 方法论的核心字符串存在 ≠ 实际使用实际使用 ATS 放行 ≠ 必然失败——每一步结论都必须有二进制级证据支撑这正是安全测试从扫描走向验证的关键。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐Arduino-ESP32 上手指南ESP32 安装到 WiFi 连接三步走Arduino ESP32 上手指南ESP32 安装到 WiFi 连接三步走 把一块 ESP32 开发板插上电脑几行熟悉的 C 代码就能让它连上 WiF文档教程网络安全PaddleSpeech RESTful API 解析语音服务端接口设计与实战调用指南PaddleSpeech RESTful API 解析语音服务端接口设计与实战调用指南 导读 本文围绕 PaddleSpeech 服务端 RESTful 接口文档教程网络安全MASTG 安卓硬编码加密密钥检测用 semgrep 与 SecretKeySpec 静态分析实战MASTG-DEMO-0017MASTG 安卓硬编码加密密钥检测用 semgrep 与 SecretKeySpec 静态分析实战MASTG DEMO 0017 本篇文章基于 OWASP文档教程网络安全上一篇boardgame.io 调试指南Debug 面板、Redux 增强器与服务器日志的完整实践下一篇ZCode 语音输入组件 SpeechInput 实战指南Web Speech API 与 MediaRecorder 双引擎语音转文字方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考