)
文档教程网络安全【免费下载链接】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点击查看免费下载在 iOS 应用中WKWebView提供了 JavaScript 与原生代码之间双向通信的桥接能力但若桥接处理器未校验消息来源与内容就会成为攻击者窃取密钥、凭据等敏感数据的窗口。本文基于 OWASP MASTG 仓库中的 MASTG-DEMO-0142 演示样本完整讲解此类漏洞的源码形态、静态检测步骤、radare2 反汇编溯源方法以及对应测试用例 MASTG-TEST-0376 的失败判定依据。读完本文你将掌握如何从二进制层面定位addScriptMessageHandler:name:调用点、交叉引用回溯桥接注册函数并评估 WebView 桥接暴露敏感功能的风险。WKWebView 原生桥接能力与风险并存iOS 应用可通过 WebView 原生桥接在 JavaScript 与原生代码之间建立双向通信通道。使用WKWebView时开发者通过WKUserContentController的add(_:name:)方法Objective-C 中为addScriptMessageHandler:name:注册消息处理器该处理器遵循WKScriptMessageHandler协议。注册完成后页面内的 JavaScript 即可通过以下方式向原生层发送消息window.webkit.messageHandlers.bridge.postMessage({action: getSecret}) window.webkit.messageHandlers.bridge.postMessage({action: getCredentials})其中bridge即注册时指定的处理器名称postMessage的载荷会被转发到原生侧的userContentController(_:didReceive:)回调。注册原生桥接本身并非不安全风险取决于暴露的功能性质与防护措施。如果处理器将存储的凭据、API 密钥等敏感数据直接返回给 JavaScript且不校验消息来源origin与内容那么任何能在 WebView 中执行 JavaScript 的攻击者例如通过 XSS、加载不可信内容或其他注入向量都可以调用这些原生方法提取数据或触发未授权操作。这正是 OWASP 在 MASTG-TEST-0376 中定义WebView 中原生桥接 API 引用静态检测用例的背景。漏洞样本剖析SecretBridgeHandler 的两面性MASTG-DEMO-0142 的完整 Swift 实现位于 MastgTest.swift其核心是一个名为SecretBridgeHandler的处理器类class SecretBridgeHandler: NSObject, WKScriptMessageHandler { func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { guard let body message.body as? [String: String], let action body[action] else { return } switch action { case getSecret: // FAIL: [MASTG-TEST-0376] 未校验消息来源即将 API 密钥返回给 JavaScript let secret MASTG_API_KEY072037ab-1b7b-4b3b-8b7b-1b7b4b3b8b7b let js window.receiveSecret(\(secret)) message.webView?.evaluateJavaScript(js, completionHandler: nil) case getCredentials: // FAIL: [MASTG-TEST-0376] 未做任何输入校验或来源检查即返回用户凭据 let credentials useradminpassS3cr3t! let js window.receiveCredentials(\(credentials)) message.webView?.evaluateJavaScript(js, completionHandler: nil) default: break } } }从源码可以清晰看到两条敏感数据泄露路径getSecret动作直接返回硬编码的 API 密钥字符串MASTG_API_KEY072037ab-...通过evaluateJavaScript:completionHandler:注入到页面上下文getCredentials动作返回硬编码的用户凭据useradminpassS3cr3t!同样未经任何校验直接回传。两种动作的处理逻辑均未读取message.body之外的任何上下文也未对消息来源页面执行message.frameInfo或 URL 校验属于典型的不安全桥接实现。桥接的注册发生在showWebView函数中let config WKWebViewConfiguration() // FAIL: [MASTG-TEST-0376] 无条件注册名为 bridge 的原生桥接 config.userContentController.add(SecretBridgeHandler(), name: bridge) let webView WKWebView(frame: .zero, configuration: config)随后 WebView 加载了一段本地构造的 HTMLSecure Portal页面页面内两个按钮分别触发getSecret()与getCredentials()函数通过window.webkit.messageHandlers.bridge.postMessage(...)调用原生桥接并在window.receiveSecret/window.receiveCredentials回调中展示结果。整个演示闭环展示了页面内任意脚本即可调用原生敏感能力的攻击面。复现步骤从 IPA 到二进制静态分析该 Demo 的检测过程分为两步与 MASTG-TEST-0376 定义的方法论一致。第一步提取应用包按 MASTG-TECH-0058Exploring the App Package 的流程从应用包中提取相关二进制。Demo 的说明文档明确指出The main binary is./Payload/MASTestApp.app/MASTestApp.即解包后主二进制位于Payload/MASTestApp.app/MASTestApp对应仓库中的 MASTestApp 文件为已编译的 Mach-O 二进制。第二步radare2 静态分析使用 MASTG-TOOL-0073radare2 for iOS配合仓库中的 run.sh 脚本与 webview_native_bridge.r2 命令脚本以-i选项运行r2 -q -e bin.relocs.applytrue -i webview_native_bridge.r2 -A MASTestApp output.txt参数说明-q静默模式不进入交互式 REPL-e bin.relocs.applytrue应用二进制重定位relocation信息使符号解析更准确-i webview_native_bridge.r2执行指定的 radare2 命令脚本-A自动分析auto-analysis output.txt将分析结果重定向保存。webview_native_bridge.r2 脚本本身完成三件事列出二进制中所有addScriptMessageHandler:name:选择器的使用位置、追踪该选择器的交叉引用xref、并反汇编桥接注册调用点的代码片段e asm.bytesfalse e scr.colorfalse e scr.interactivefalse e asm.varfalse e bin.relocs.applytrue ?e List all uses of the addScriptMessageHandler:name: selector: f~addScriptMessageHandler ?e xrefs to addScriptMessageHandler:name:: axt reloc.fixup.addScriptMessageHandler:name: ?e Code snippet containing the bridge registration call: pd-- 20 0x1eac其中axtxref to用于查找引用目标地址的所有位置pd-- 20表示从指定地址向前反汇编 20 条指令。这对应 MASTG-TECH-0066Static Analysis on iOS 中在二进制中查找相关 API的步骤其定位结果再交给 MASTG-TECH-0076Reviewing Disassembled Objective-C and Swift Code 做人工复核。反汇编溯源在二进制层面还原桥接注册radare2 的输出即仓库中的 output.txt完整展示了检测结果List all uses of the addScriptMessageHandler:name: selector: 0x0001342e 30 str.addScriptMessageHandler:name: 0x0001c2e0 8 reloc.fixup.addScriptMessageHandler:name: xrefs to addScriptMessageHandler:name:: sym.MASTestApp.MastgTest.showWebView._6E8AB2C58CE173A727EF27CB85DF8CD8.completion_...FZ_ 0x1eac [DATA:r--] ldr x1, reloc.fixup.addScriptMessageHandler:name:分析结果呈现三层证据链选择器字符串str.addScriptMessageHandler:name:位于0x0001342e是 Objective-C 方法选择器的字符串常量重定位引用reloc.fixup.addScriptMessageHandler:name:位于0x0001c2e0即该选择器在代码段中真正被引用的重定位项交叉引用回溯唯一引用该重定位项的位置是0x1eac位于符号sym.MASTestApp.MastgTest.showWebView...completion_...FZ_内部——与源码中showWebView函数注册桥接的逻辑完全对应证明桥接注册发生在此函数中。继续对0x1eac之前的指令做反汇编可以看到完整的注册调用序列│ 0x00001e5c bl sym.MASTestApp.SecretBridgeHandler.allocator._...cfC_ ; func.00001a94 │ 0x00001e60 stur x0, [x29, -0xe0] │ 0x00001e64 adrp x0, 0x14000 │ 0x00001e68 add x0, x0, 0x98d ; 0x1498d ; bridge │ 0x00001e6c mov w8, 6 │ 0x00001e70 mov x1, x8 ... │ 0x00001eac ldr x1, [x8, 0x2e0] ; [0x1342e:8]0x7069726353646461 ; addScriptMessageHandler:name: ; char *selector │ 0x00001eb0 bl sym.imp.objc_msgSend ; void *objc_msgSend(void *instance, char *selector)这段反汇编揭示了三条关键事实SecretBridgeHandler实例化0x1e5c处先调用SecretBridgeHandler的 allocator创建处理器实例并存入栈帧硬编码的桥接名称0x1e64–0x1e68将字符串字面量bridge位于0x1498d加载到寄存器随后经过 Swift 字符串桥接_builtinStringLiteral与Foundationbool...ridgeToObjectiveCSo8NSStringCyF作为name:参数无条件的注册调用0x1eac加载addScriptMessageHandler:name:选择器后0x1eb0处通过objc_msgSend完成桥接注册——整个序列中没有任何分支指令或来源校验逻辑印证了无条件注册的源码结论。值得注意的是SecretBridgeHandler的类型元数据也出现在反汇编中sym.__PROTOCOLS__TtC10MASTestApp19SecretBridgeHandler地址0x1c000进一步佐证该处理器类确实被链接进二进制并参与桥接。评估判定MASTG-TEST-0376 的失败依据按 MASTG-TEST-0376 的评估规则该测试用例的失败条件是注册了原生桥接且WKScriptMessageHandler实现向 JavaScript 暴露了敏感功能或数据且缺乏充分校验。针对本 Demo逐条核验如下桥接确实注册反汇编确认addScriptMessageHandler:name:在showWebView中被调用注册名bridge硬编码于0x1498d暴露的是安全相关数据SecretBridgeHandler的userContentController(_:didReceive:)处理getSecret返回硬编码 API 密钥与getCredentials返回用户凭据两个动作属于读取存储凭据的安全敏感上下文无消息来源与内容校验处理逻辑既不验证消息的 origin/frame也不校验消息内容任何在页面中执行的 JavaScript 均可调用。因此该样本被标记为kind: fail。评估文档还指出一个重要的风险边界由于本 Demo 的 WebView 加载的是开发者可控的本地构造 HTML 页面即时影响有限但一旦 WebView 加载攻击者可控内容例如通过 deep link、开放重定向或 XSS 注入攻击者即可执行window.webkit.messageHandlers.bridge.postMessage({action: getSecret})并在receiveSecret回调中收到 API 密钥将演示漏洞转化为真实数据泄露。缓解措施与最佳实践OWASP 针对此类问题给出了对应的防护指引 MASTG-BEST-0058Restrict Native Functionality Exposed Through WebView Bridges核心思路是限制 WebView 桥接暴露的原生功能最小化桥接暴露面仅注册业务确实需要的能力禁止将存储的凭据、密钥等敏感数据直接暴露给 JavaScript校验消息来源在userContentController(_:didReceive:)中检查message.frameInfo的 URL 与预期页面是否匹配拒绝来自未知或不可信页面的调用校验消息内容对message.body中的 action 与参数做白名单校验避免任意载荷驱动原生行为控制可加载内容避免 WebView 加载不可信或重定向可达的远程内容从源头降低 XSS 与注入风险对敏感操作增加二次确认涉及凭据读取、支付等高风险操作时在原生层增加额外的认证或用户确认机制。这些措施与 MASWE-0034该测试关联的弱点枚举项的治理目标一致即在架构层面消除任意页面脚本可直达原生敏感能力的通道。结论MASTG-DEMO-0142 提供了一个教科书式的 WKWebView 原生桥接信息泄露样本源码层面SecretBridgeHandler将 API 密钥与用户凭据无差别回传给页面脚本二进制层面radare2 通过选择器定位、重定位引用与交叉引用分析将addScriptMessageHandler:name:调用点精确回溯到showWebView函数的0x1eac处并还原出bridge名称的硬编码加载过程。这套测试用例 → 演示样本 → 源码实现 → 反汇编验证的闭环正是 OWASP MASTG 移动安全测试方法论的可操作范式既能用于安全测试人员对真实 App 的静态审计也能帮助开发者理解 WebView 桥接的设计红线在架构阶段就规避敏感数据暴露风险。延伸阅读测试用例MASTG-TEST-0376References to Native Bridge APIs in WebViews演示样本MASTG-DEMO-0142 及其配套的 Swift 源码、radare2 脚本、运行脚本 与 输出结果相关技术MASTG-TECH-0058 应用包提取、MASTG-TECH-0066 静态分析、MASTG-TECH-0076 反汇编复核相关工具MASTG-TOOL-0073radare2 for iOS最佳实践MASTG-BEST-0058Restrict Native Functionality Exposed Through WebView Bridges赞分享文档教程网络安全【免费下载链接】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 WebView 中 evaluateJavaScript 写入 DOM 的敏感数据泄露检测MASTG-DEMO-0146OWASP MASTG 实战iOS WebView 中 evaluateJavaScript 写入 DOM 的敏感数据泄露检测MASTG DEMO 0146文档教程网络安全用 OWASP MASTG 检测 Android 通知中的敏感数据泄露MASTG-DEMO-0078 静态分析实战用 OWASP MASTG 检测 Android 通知中的敏感数据泄露MASTG DEMO 0078 静态分析实战 导读 通知Notification是文档教程网络安全OWASP MASTG iOS 实战WKWebView 原生桥通过 evaluateJavaScript 向页面回传敏感数据的检测与修复OWASP MASTG iOS 实战WKWebView 原生桥通过 evaluateJavaScript 向页面回传敏感数据的检测与修复 导读 本文基于 OW文档教程网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考