OWASP MASTG iOS 实战:用 radare2 定位已废弃的 UIWebView(MASTG-DEMO-0094 / MASTG-TEST-0331)

发布时间:2026/10/8 9:38:30
OWASP MASTG iOS 实战:用 radare2 定位已废弃的 UIWebView(MASTG-DEMO-0094 / MASTG-TEST-0331) 文档教程网络安全【免费下载链接】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-0094 为主线完整复现检测 iOS 应用是否使用了已废弃的UIWebView这一静态分析流程从解包 IPA、定位主二进制到使用 radare2 检索UIWebView类引用并解读反汇编输出最后结合对应测试用例 MASTG-TEST-0331 判定测试失败。读完本文你将掌握一条可直接复制的命令行检测路径并理解为什么UIWebView在 iOS 12 之后仍被严格视为安全问题。背景为什么 UIWebView 仍是移动安全测试的必查项UIWebView是 Apple 在 iOS 2 时代推出的网页视图组件自iOS 12.0 起被官方废弃deprecated_since: 12.0取而代之的是WKWebView与SFSafariViewController。废弃并不等于消失——存量应用、老旧 SDK 或开发者惯性仍会让UIWebView出现在新构建的二进制中这正是 MASTG-TEST-0331 存在的意义。该测试用例归属 MASVS-PLATFORM 类目对应MASWE-0035弱点类型为static / code即纯静态代码分析。其判定规则极其明确只要在应用二进制中发现任何对UIWebView的引用测试即失败。原因在于UIWebView相较WKWebView存在三类结构性安全缺陷依据 MASTG-KNOW-0076 与 MASTG-TEST-0331JavaScript 无法被完整禁用UIWebView中脚本默认开启且没有关闭开关注入的恶意脚本必然可以执行缺少进程隔离UIWebView与 App 主进程同进程渲染WebKit 内存破坏类漏洞可直接波及 App 本体而WKWebView采用 out-of-process 渲染不支持现代 Web 安全特性如 Content Security PolicyCSP等且没有hasOnlySecureContent这类安全状态查询 API。Demo 样例概况与测试判定逻辑MASTG-DEMO-0094 的 front matter 完整声明了该演示的属性platform: ios title: Use of the Deprecated UIWebView code: [swift] id: MASTG-DEMO-0094 test: MASTG-TEST-0331 kind: fail其中kind: fail表示这是一个预期失败不通过的样例——应用故意使用了UIWebView供测试人员练习如何通过静态分析将其抓出来。整个演示围绕三件事展开解包应用并定位主二进制对应技术 MASTG-TECH-0058使用 radare2对应工具 MASTG-TOOL-0073检索UIWebView的类引用与交叉引用xref解读输出、确认调用点并按 MASTG-TEST-0331 的规则判定测试失败。恶意样例源码分析MastgTest.swift演示应用的可疑代码位于 demos/ios/MASVS-PLATFORM/MASTG-DEMO-0094/MastgTest.swift它是一个带completion回调的静态函数会在主线程队列中创建一个UIWebView并加载https://owasp.orgimport SwiftUI import UIKit import WebKit struct MastgTest { inline(never) _optimize(none) public static func mastgTest(completion: escaping (String) - Void) { DispatchQueue.main.async { completion(Showing WebView for 2s...) DispatchQueue.main.asyncAfter(deadline: .now() 1){ let webView UIWebView() webView.loadRequest(URLRequest(url: URL(string: https://owasp.org)!)) // 2. Create a UIViewController to hold the WebView let viewControllerToPresent UIViewController() viewControllerToPresent.view webView if let presenter topViewController() { presenter.present(viewControllerToPresent, animated: true, completion: {}) } else { completion(Failed to present web view (no active view controller).) } } } } // ... }几个值得注意的细节import WebKit是个烟雾弹——源码虽引入了 WebKit 框架但实例化的却是 UIKit 下的UIWebViewinline(never) _optimize(none)保证该函数不会被编译器内联或优化掉从而在二进制中保留清晰的符号与调用链方便 radare2 等工具定位loadRequest(URLRequest(...))是UIWebView特有的加载 APIWKWebView对应的是load(_:)在二进制中会体现为对reloc.UIWebView的加载与objc_msgSend调用topViewController()辅助函数用于从UIWindowScene的 key window 递归找到当前可见控制器兼容UINavigationController、UITabBarController、presentedViewController三种层级目的是把 WebView 弹到最上层——这是演示可运行的工程细节与漏洞检测本身无关。步骤一解包 IPA 并定位主二进制MASTG-TECH-0058按照 MASTG-TECH-0058 的标准流程拿到.ipa后先用unzip解包unzip MASTestApp.ipa解包后得到一个Payload/目录内含 Application Bundle.app。其中最重要的产物是主二进制文件——名字与 bundle 名相同、去掉.app后缀本样例为./Payload/MASTestApp.app/MASTestApp用十六进制头部可确认这是一个标准 Mach-O 64 位可执行文件magic0xFEEDFACF__PAGEZERO段起始head -c 64 ./Payload/MASTestApp.app/MASTestApp | od -A x -t x1z # 000000 cf fa ed fe 0c 00 00 01 00 00 00 00 02 00 00 00 ................ # 000010 2a 00 00 00 58 11 00 00 85 00 21 00 00 00 00 00 *...X.....!..... # 000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45 ....H...__PAGEZEiOS 二进制无法像 Android 那样反编译回高级语言只能反汇编分析因此后续步骤全部围绕反汇编工具展开。步骤二radare2 静态分析MASTG-TOOL-0073仓库为该演示准备了一条一键执行的脚本 demos/ios/MASVS-PLATFORM/MASTG-DEMO-0094/run.sh#!/bin/bash r2 -q -i uiwebview.r2 -A MASTestApp output.txt参数含义-q安静模式不进入交互式 REPL执行完脚本即退出-i uiwebview.r2载入并执行 radare2 命令脚本相当于把多条 r2 命令批量化-A自动分析aaa级别的全量分析生成函数、引用与交叉引用数据库 output.txt将脚本输出重定向保存。脚本内容 demos/ios/MASVS-PLATFORM/MASTG-DEMO-0094/uiwebview.r2 分三段完成检测e asm.bytesfalse e scr.colorfalse e asm.varfalse ?e List all uses of the UIWebView class: f~UIWebView ?e List all xrefs to the UIWebView class: axt 0x100010108 ?e Code snippet that contains the xref to UIWebView: pd 10 0x100004514逐条说明开头的e asm.bytesfalse不显示指令机器码、e scr.colorfalse关闭彩色输出便于重定向到文件、e asm.varfalse不显示反汇编中的变量名三行是输出净化设置保证结果可读、可归档?e是 r2 的回显注释命令用于在输出流中插入分隔标题f~UIWebViewf列出所有 flag符号~是 r2 的 grep 过滤器——在全部 flag 中筛选包含UIWebView的项本质是枚举二进制中对该类的全部引用relocaxt 0x100010108axtanalyze xrefs to查询指向地址0x100010108的交叉引用——该地址正是上一步发现的reloc.UIWebView所在位置回答谁在使用 UIWebViewpd 10 0x100004514在 xref 来源地址0x100004514处反汇编 10 条指令pd print disassembly把调用现场摊开给人看。观察解读 radare2 输出output.txt运行结果保存在 demos/ios/MASVS-PLATFORM/MASTG-DEMO-0094/output.txt三段输出分别对应脚本的三个动作1类引用清单——二进制中只存在一处对UIWebView的重定位引用List all uses of the UIWebView class: 0x100010108 8 reloc.UIWebView0x100010108是.text段基址偏移出的重定位槽地址8表示其在__DATA段中的引用计数/条目大小。2交叉引用谁在用——答案直接指向源码中的函数List all xrefs to the UIWebView class: sym.MASTestApp.MastgTest.mastg.completion__1 0x100004514 [DATA:r--] ldr x0, reloc.UIWebView从符号名sym.MASTestApp.MastgTest.mastg.completion__1可以看出这是MastgTest.mastgTest(completion:)闭包completion__1即第一个闭包参数编译后的函数。xref 类型为[DATA:r--]数据段只读引用指令是ldr x0, reloc.UIWebView——把UIWebView类对象加载进寄存器x0为后续objc_allocWithZone分配实例做准备。源码与二进制在此完美对上号let webView UIWebView()这一行就是这一切的源头。3调用现场反汇编——pd 10展示了完整实例化序列│ 0x100004514 ldr x0, [x8, 0x108] ; [0x100010108:4]231 │ ; reloc.UIWebView ; void *arg0 │ 0x100004518 bl sym.imp.objc_allocWithZone ; void *objc_allocWithZone(void *arg0) │ 0x10000451c adrp x26, sym.__METACLASS_DATA__... │ 0x100004520 ldr x1, [x26, 0x90] ; ... selector │ 0x100004524 bl sym.imp.objc_msgSend ; void *objc_msgSend(void *instance, char *selector) │ 0x100004528 mov x21, x0 │ 0x10000452c adrp x8, sym.imp.swift_deallocObject ; 0x10000a000 │ 0x100004530 add x8, x8, 0xc90 ; 0x10000ac90 ; https://owasp.org │ 0x100004534 sub x8, x8, 0x20这段 ARM64 汇编清晰还原了 Objective-C 运行时下的 UIWebView 创建流程ldr x0, [x8, 0x108]取出UIWebView类对象bl objc_allocWithZone分配实例内存adrp/ldr加载初始化 selectorbl objc_msgSend发送初始化消息随后add x8, x8, 0xc90指向字符串常量https://owasp.org——正是源码中URL(string: https://owasp.org)!编译产物进一步佐证该 WebView 用于加载远程网页。评估测试判定为失败依据 MASTG-TEST-0331 的评估规则The test case fails if any use ofUIWebViewis found in the app.本样例在二进制中检索到reloc.UIWebView及其明确的交叉引用sym.MASTestApp.MastgTest.mastg.completion__1使用点确凿存在因此MASTG-TEST-0331 判定失败对应MASWE-0035弱点成立。整个检测链路为MASTG-TEST-0331判定规则 └─ MASTG-TECH-0058解包定位二进制 └─ MASTG-TOOL-0073 / radare2f~UIWebView 找引用 → axt 找 xref → pd 看现场 └─ 输出 evidencereloc xref 汇编片段纵深UIWebView 的安全缺陷详解MASTG-KNOW-0076如果说是否用了 UIWebView是检测的判定面那么为什么它是弱点则要从 MASTG-KNOW-0076 的 WebView 知识体系中拆解1. JavaScript 无法禁用UIWebView中 JavaScript 默认启用且没有任何公开 API 可以关闭。与之对比WKWebView可通过WKPreferences.javaScriptEnabled false完全禁用脚本这是缓解脚本注入攻击的关键手段。旧版测试 MASTG-TEST-0076 也明确提示JavaScript cannot be disabled forUIWebViews。2. 缺少进程隔离WKWebView的渲染进程与 App 主进程相互独立out-of-process renderingWebKit 层面的内存破坏漏洞不会直接击穿 AppUIWebView则与 App 同进程渲染一旦引擎被攻破攻击者直接获得的是 App 进程的完整权限面。3. 文件访问默认全开这是UIWebView最容易被低估的风险点它的allowFileAccessFromFileURLs与allowUniversalAccessFromFileURLs默认即为开启且无法关闭。这意味着运行在file://上下文中的 JavaScript 可以访问本地其他file://资源乃至跨源内容——而 JS 又无法禁用两条缺陷叠加加载不可信本地 HTML 时几乎等同于打开本地文件读取通道。另外UIWebView使用baseURL nil加载内容时产生的是applewebdata://协议源同源策略的约束方式与WKWebView的 opaque origin 模型不同存在被绕过的历史案例空间。4. 桥接与安全查询能力缺失UIWebView的 JS 桥接依赖 JavaScriptCore 的JSContext/JSExport机制暴露给 JavaScript 的任意原生能力都会成为注入脚本的攻击面UIWebView没有hasOnlySecureContent这类接口无法在运行时确认页面是否只加载了安全资源混合内容mixed content检测只能靠代理等外部手段旧版 MASTG-TEST-0076 的 Dynamic Analysis 一节演示了用 Frida 的ObjC.choose枚举 WebView 实例并读取hasOnlySecureContent的做法。修复建议迁移到 WKWebView 或 SFSafariViewController检测出UIWebView后的标准修复路径同样来自 MASTG-KNOW-0076需要深度定制、扩展 App 功能改用WKWebView。它支持禁用 JavaScriptjavaScriptEnabled、控制弹窗javaScriptCanOpenWindowsAutomatically、进程隔离、load(_:)系列 APIloadHTMLString:baseURL:、loadData:、loadFileURL:allowingReadAccessToURL:等并可通过WKUserContentController管理注入脚本与消息桥接仅需通用网页浏览体验改用SFSafariViewControlleriOS 9。它自带地址栏、安全指示器与分享按钮与 Safari 共享会话且按 App Store Review Guidelines 不得被其他视图遮挡其 JS 同样无法关闭因此不建议用于扩展型内嵌 UI。迁移时还需注意WKWebView的allowingReadAccessTo参数按加载粒度约束本地文件读取范围——单文件传入文件路径、整目录传入目录路径这是UIWebView时代不存在的精细控制。补充二进制字符串层的快速筛查手段除 radare2 外旧版测试 MASTG-TEST-0076 还提供了基于字符串扫描的轻量替代方案radare2 全家桶中的rabin2# 直接检索 UIWebView 类名字符串 rabin2 -zz ./MASTestApp | egrep UIWebView$ # 输出示例引用计数随编译产物变化 # 489 0x0002fee9 0x10002fee9 9 10 (5.__TEXT.__cstring) ascii UIWebView # 896 0x0003c813 0x0003c813 24 25 () ascii _OBJC_CLASS_$_UIWebView # 1754 0x00059599 0x00059599 23 24 () ascii _OBJC_CLASS_$_UIWebView同一手法也可用于确认修复是否到位搜索WKWebView及其初始化方法符号或对 Swift 符号做 demangle 还原可读签名xcrun swift-demangle __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO # --- nonobjc __C.WKWebView.init(frame:configuration:) - __C.WKWebView在实际测试中建议将 radare2 的f~UIWebViewaxt方法精确、可复现、产出证据与rabin2 -zz | egrep字符串扫描快速、适合批量巡检组合使用互为验证。结语MASTG-DEMO-0094 是一份教科书级的最小化失败样例源码故意触碰红线实例化UIWebView静态分析工具链unzip→r2 -A -i→f~→axt→pd以不到十条命令将其钉死最终由 MASTG-TEST-0331 判定失败并对应 MASWE-0035 弱点。整套流程可直接平移到任何真实 IPA 的审计中——如果你在某个 iOS 应用的二进制里也看到reloc.UIWebView和objc_allocWithZone的组合那么它同样需要被记录为一个安全缺陷并推动迁移。关联仓库资源速查演示文档demos/ios/MASVS-PLATFORM/MASTG-DEMO-0094/MASTG-DEMO-0094.md恶意样例源码demos/ios/MASVS-PLATFORM/MASTG-DEMO-0094/MastgTest.swiftradare2 脚本与运行输出uiwebview.r2 / run.sh / output.txt测试用例tests-beta/ios/MASVS-PLATFORM/MASTG-TEST-0331.md现行/ tests/ios/MASVS-PLATFORM/MASTG-TEST-0076.md旧版已废弃知识条目knowledge/ios/MASVS-PLATFORM/MASTG-KNOW-0076.md相关技术/工具techniques/ios/MASTG-TECH-0058.md解包与二进制定位、tools/ios/MASTG-TOOL-0073.mdradare2赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐MASTG 静态分析实战使用 radare2 在 iOS 二进制中定位并恢复冗长日志消息MASTG-TEST-0358 / MASTG-DEMO-0124MASTG 静态分析实战使用 radare2 在 iOS 二进制中定位并恢复冗长日志消息MASTG TEST 0358 / MASTG DEMO 0124文档教程网络安全用 radare2 逆向分析 iOS 设备的 Passcode 检测OWASP MASTG MASTG-DEMO-0024 与 LAContext.canEvaluatePolicy 实战解析用 radare2 逆向分析 iOS 设备的 Passcode 检测OWASP MASTG MASTG DEMO 0024 与 LAContext.canEv文档教程网络安全OWASP MASTG 实战用 Frida 运行时监控 iOS 文本输入框的敏感数据掩码MASTG-DEMO-0113 / MASTG-TEST-0347OWASP MASTG 实战用 Frida 运行时监控 iOS 文本输入框的敏感数据掩码MASTG DEMO 0113 / MASTG TEST 0347文档教程网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考