OWASP MASTG iOS 静态日志分析实战:用 r2 定位 NSLog 等日志 API 的敏感数据泄露(MASTG-DEMO-0065)
发布时间:2026/10/7 9:37:22 锦皓数字建站
`)
文档教程网络安全【免费下载链接】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仓库中的 iOS 演示样例 MASTG-DEMO-0065「Uses of Logging APIs with r2」展开完整讲解如何解包 iOS 应用、定位主二进制、并借助 radare2r2脚本化分析找出NSLog、print、os_log、Logger、vfprintf等日志 API 的调用位置从而验证 MASWE-0005敏感数据通过日志 API 泄露这一弱点并支撑测试用例 MASTG-TEST-0297 的静态判定。读完本文你将掌握一条可复制、可运行的解包 → r2 批量分析 → 反汇编核实参数 → 判定是否泄露的 iOS 日志泄露检测流水线。说明本文以 demos/ios/MASVS-STORAGE/MASTG-DEMO-0065/MASTG-DEMO-0065.md 为骨架所有命令、脚本与汇编输出均取自该演示目录中真实存在的文件相关测试用例见 tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0297.md。背景为什么日志 API 是敏感数据泄露的高危面在 iOS 平台上NSLog、NSAssert、NSCAssert、print、printf等日志 API 都可能无意间泄露敏感信息。日志消息会被写入系统控制台可通过统一日志Unified Logging等机制读取。虽然设备上的其他应用通常无法直接读取这些日志但出于数据泄露风险考虑直接记录敏感信息令牌、密码、个人信息等在安全实践中被明确禁止。这正是 OWASP MASVS-STORAGE-2敏感数据存储与弱点枚举条目 MASWE-0005 关注的范畴。MASTG-TEST-0297Sensitive Data Exposure Through Logging APIs通过静态分析验证应用是否包含以敏感数据为输入的日志 API 调用本文的演示样例 MASTG-DEMO-0065 正是这一测试的可执行示范它以一段故意中毒的 Swift 代码见 MastgTest.swift为靶子用 r2 脚本在编译后的二进制中定位日志调用。靶样本一个把 token 泄露到所有日志 API 的 Swift 文件演示目录中的 MastgTest.swift 定义了struct MastgTest其mastgTest方法首先构造了一个敏感令牌let token TOKEN123随后将它作为参数传递给多种日志与输出机制print(print: Leaking \(token) from print)debugPrint(debugPrint: Leaking \(token) from debugPrint)dump(token, name: dump: Leaking token from dump)NSLog(NSLog: Leaking \(token) from NSLog)os_log(os_log: Leaking %{public} from os_log, log: .default, type: .info, token)Loggeros框架在debug/info/warning/error/fault五种级别下分别以默认、privacy: .public、privacy: .private、privacy: .sensitive四种隐私标注输出 tokenC 层接口fputs、vfprintf、vdprintf、vsyslogSwift 中通过withVaList包装调用见swiftVfprintf、swiftVdprintf、swiftVsyslog三个辅助函数FileHandle.standardError.write(...)此外代码中保留了 ASLApple System Log日志的注释版示例swiftVaslLog/asl_vlog需要把asl.h加入 bridging header 才能启用用于提示检测人员在真实审计中也不应遗漏 ASL 这类较老的日志通道。该样本的价值在于它系统性地覆盖了 iOS 上几乎所有日志/输出 API 家族是练习静态检测的完美靶子——你能否在编译后的二进制中把这些调用全部找出来核心工具链r2 脚本化静态分析分析脚本 run.sh演示目录下的 run.sh 是整个流程的入口它把 r2 的每条命令打包成脚本保证分析可重复#!/bin/bash r2 -q -i loggingApis.r2 -A MASTestApp output.asm参数含义参数作用-q安静模式退出时自动结束 r2 会话不打印启动横幅-i loggingApis.r2进入交互模式前先执行脚本文件loggingApis.r2-A运行aaa全量分析自动分析函数、交叉引用、字符串等为后续afl、axt、pdf提供符号与引用信息MASTestApp被分析的二进制文件即从 App 包中提取的主可执行文件 output.asm将 r2 的全部输出重定向保存到output.asm分析命令脚本 loggingApis.r2loggingApis.r2 定义了分析策略先是关闭对阅读反汇编有干扰的展示选项再依次完成三步e asm.bytes false e scr.colorfalse e asm.varfalse !printf Uses of NSLog:\n afl~NSLog !printf \n !printf xrefs to NSLog:\n axt 0x10000d780 !printf \n !printf Invocation of NSLog:\n pd-- 5 0x1000088ec pdf 0x1000088ec function.asm逐行解读e asm.bytes false反汇编输出中不显示原始机器码字节只保留助记符与地址便于阅读e scr.colorfalse关闭颜色保证输出文件纯净e asm.varfalse关闭变量名美化让栈/寄存器引用保持原始寻址形式减少与工具版本相关的歧义。afl~NSLog列出所有函数analyze functions list并用 r2 的~内部过滤语法只保留名字中包含NSLog的行。这在没有符号剥离的 Swift/Objective-C 二进制中可以直接命中sym.imp.Foundation.NSLogCVarArg...dtF这样的导入桩import thunk。axt 0x10000d780列出地址0x10000d780即上一步发现的NSLog导入符号地址上的交叉引用cross references to告诉我们哪些函数调用了它。pd-- 5 0x1000088ec对调用点0x1000088ec反汇编print disassemblypd--表示同时向后展开5是行数上限用来观察blbranch with link即函数调用指令前后参数如何被装载进寄存器。pdf 0x1000088ec function.asm打印从该地址所属的完整函数反汇编print disassembly function把结果重定向到 function.asm用于观察日志调用所在函数整体上下文。提示afl、axt、pdf都是通用命令实际审计中应把loggingApis.r2里的NSLog关键词扩展为print、os_log、Logger、fprintf、vsyslog等见下文扩展检测面并把硬编码地址替换为axt上一步动态得到的地址即可把该模板复用到任意 iOS 二进制。实战步骤从 App 包到检测结论第 1 步解包并定位主二进制iOS 应用分发包IPA本质是 zip 归档。按 MASTG-TECH-0058应用二进制提取技术的标准做法解包后 App 可执行文件位于Payload/AppName.app/AppName。本演示中被分析的二进制为./Payload/MASTestApp.app/MASTestApp即MASTestApp.app包内的主可执行文件该文件已直接存放在演示目录中见 MASTestApp。第 2 步运行脚本批量查找 NSLog进入演示目录对主二进制执行cd demos/ios/MASVS-STORAGE/MASTG-DEMO-0065 ./run.shr2 会按loggingApis.r2的指令完成分析并写出两个产物output.asm脚本主输出NSLog 使用点、交叉引用、调用点反汇编function.asmpdf导出的完整函数反汇编供人工阅读。第 3 步解读 output.asmoutput.asm 的真实输出如下Uses of NSLog: 0x10000d780 1 12 sym.imp.Foundation.NSLogCVarArg...dtF xrefs to NSLog: sym.func.1000086f4 0x1000088ec [CALL:--x] bl sym.imp.Foundation.NSLogCVarArg...dtF Invocation of NSLog: │ 0x1000088d8 orr x1, x8, 0x8000000000000000 │ 0x1000088dc adrp x2, reloc.Foundation.Data._bridgeToObjectiveC.NSData...F ; 0x100014000 │ 0x1000088e0 ldr x2, [x2, 0x4f8] ; [0x1000144f8:4]158 │ ; reloc._swiftEmptyArrayStorage │ 0x1000088e4 mov x0, 0x23 ; # │ 0x1000088e8 movk x0, 0xd000, lsl 48 │ 0x1000088ec bl sym Foundation.NSLogCVarArg...dtF ; sym.imp.Foundation.NSLogCVarArg...dtF │ 0x1000088f0 mov x0, 0 │ 0x1000088f4 bl sym.func.100009d30 │ 0x1000088f8 mov x20, x0 │ 0x1000088fc bl sym OS_os_log.allocator...0E7defaultABvgZ ; sym.imp.OS_os_log.allocator...0E7defaultABvgZ三段结果分别对应脚本的三步Uses of NSLog0x10000d780处存在导入符号sym.imp.Foundation.NSLogCVarArg...dtFSwift 编译产物中NSLog的 CVarArg 变体列宽依次为地址、出现次数、引用计数、符号名。xrefs to NSLog符号sym.func.1000086f4在地址0x1000088ec处以CALL:--x类型引用了NSLog——即调用点位于函数0x1000086f4内部。Invocation of NSLog调用点0x1000088ec附近的反汇编显示x1装载了一个 tagged pointerorr x1, x8, 0x8000000000000000Swift 字符串指针的高位标记随后bl跳入NSLogCVarArg。从原始汇编本身并不能直接读出参数内容——这正是演示文档强调Readingoutput.asmdoesnt clearly show what arguments are passed toNSLog的原因。第 4 步用 function.asm 还原参数内容pdf导出的 function.asm 覆盖了调用点所在完整函数约 5.6 KB、上百条指令。在函数头部附近r2 已把加载进寄存器的立即数字符串直接标注在注释里│ 0x100008730 mov x25, 0x4f54 ; TO │ 0x100008734 movk x25, 0x454b, lsl 16 ; KE │ 0x100008738 movk x25, 0x3d4e, lsl 32 ; N │ 0x10000873c movk x25, 0x3231, lsl 48 ; 12四个movk序列把 64 位寄存器逐 16 位拼出 ASCII 字符TO、KE、N、12——合起来正是TOKEN123。同样的手法在函数体后面反复出现配合字符串区注释可以还原每条日志消息的完整内容例如0x10000e8f0print: Leaking TOKEN123 from print0x10000e920debugPrint: Leaking TOKEN123 from debugPrint0x10000e950dump: Leaking token from dump0x10000e970NSLog: Leaking TOKEN123 from NSLog0x10000e9a0os_log: Leaking %{public} from os_log随后函数中连续出现对print.separator.terminator...2StF、debugPrint.separator.terminator...2StF、dump.name.indent...、NSLogCVarArg、OS_os_log.allocator...0E7defaultABvgZ、os_log_type_t...0A0E4infoABvgZ、_os_log_impl等符号的调用以及大量swift_slowAlloc/swift_slowDealloc与section.15.__TEXT.__oslogstring的引用__oslogstring段正是 os_log 日志格式串所在段说明该函数把 token 依次喂给了print、debugPrint、dump、NSLog、os_log及Logger的全部日志级别。这就从二进制层面直接证明了日志 API 的输入参数中包含了敏感令牌。阅读技巧function.asm中movk x25, ..., lsl 48这类拼字模式是 Swift 编译器把短字符串内联进寄存器的典型形态当字符串较长时会改从__TEXT.__const或__cstring段adrp/add装载r2 会在地址后标注字符串字面量。抓住__oslogstring与各sym.imp.*调用即可快速圈定日志相关代码区域。扩展检测面从 NSLog 到全量日志 API演示文档明确要求更新loggingApis.r2以检测其他日志 API例如print。结合 MastgTest.swift 与 MASTG-TEST-0297 中列出的 API可以按三类扩展过滤词Objective-C / Foundation 日志NSLog、NSAssert、NSCAssert、NSLogvSwift 标准库输出print、debugPrint、dump编译后对应print.separator.terminator、debugPrint.separator.terminator、dump.name.indent等符号系统统一日志与 C 层输出os_log、Loggeros.Logger、_os_log_impl、fprintf、fputs、vfprintf、vdprintf、vsyslog、asl_logASL需 bridging header例如把loggingApis.r2中三处NSLog过滤/查询改为afl~print afl~os_log afl~Logger afl~vfprintf即可逐个确认这些 API 是否存在于目标二进制中随后对每个命中符号地址执行axt再对调用点执行pd--与pdf与第 3、4 步完全一致。对于目标为真实应用而非演示靶子的情况还可以结合 MASTG-TECH-0066二进制静态分析对导出符号表、__oslogstring段内容进行整体扫描避免遗漏被内联或被混淆的调用。判定标准与测试关联如何判定根据 MASTG-TEST-0297 的 Evaluation若应用存在已实现reachable/implemented的日志路径且这些日志 API 以敏感数据作为输入则测试失败。对应到本演示静态证据output.asm与function.asm中tokenTOKEN123以字符串字面量形式存在于二进制并作为参数传入多个日志 API 的调用点结论该应用存在敏感数据通过日志 API 泄露MASTG-TEST-0297 判定为失败。这与演示文档的 Evaluation 完全一致The test fails because the app callsNSLogwith a secret token as an argument.其措辞以NSLog为例实际样本中受影响的日志 API 远不止这一个。与 MASTG 体系的对应关系测试用例tests-beta/ios/MASVS-STORAGE/MASTG-TEST-0297.mdSensitive Data Exposure Through Logging APIs对应弱点 MASWE-0005属于 MASVS-STORAGE-2敏感数据存储旧版测试tests/ios/MASVS-STORAGE/MASTG-TEST-0053.mdMSTG-STORAGE-3已标记 deprecated由 0296/0297 取代其静态分析部分同样给出NSLog、NSAssert、NSCAssert、fprintf等关键词清单并提出用预处理宏在 DEBUG 下开启、发布版关闭NSLog的防御写法PREFIX_HEADER 中的#ifdef DEBUG #define NSLog(...) ... #endif关联技术MASTG-TECH-0058解包与二进制提取、MASTG-TECH-0066二进制静态分析、MASTG-TECH-0060运行时日志读取对应动态验证途径缓解实践best-practices/MASTG-BEST-0022.md 为相关最佳实践条目。小结与延伸本文演示的流水线可归纳为四步解包定位主二进制 → r2 脚本化搜索日志 API 符号 → axt 追踪交叉引用定位调用点 → pdf/字符串注释还原传入参数。它在 OWASP MASTG 中属于静态分析路径MASTG-TEST-0297与动态读取控制台日志MASTG-TECH-0060互补静态侧回答代码里有没有把敏感数据写进日志 API动态侧回答运行起来日志里到底出现了什么。值得注意的延伸点仅检测NSLog远远不够print、os_log、Logger、C 层vfprintf/vsyslog、ASL 都可能成为泄露通道检测脚本应覆盖全部家族Logger的privacy: .public/.private/.sensitive标注只是运行时脱敏策略不能作为静态检测的免责依据——样本中即便标注为.private/.sensitive的调用其格式串与参数同样静态可见对真实应用还应结合字符串段__TEXT.__oslogstring、__cstring与符号表做全量扫描并把本文模板中的硬编码地址改为由afl/axt动态解析。如需复现完整素材Swift 源码、r2 脚本、运行脚本、分析产物与二进制均可在仓库 demos/ios/MASVS-STORAGE/MASTG-DEMO-0065 目录下找到。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐用 frida-trace 追踪 Android 日志 API 定位敏感数据泄漏MASTG-DEMO-0006 实战演示用 frida trace 追踪 Android 日志 API 定位敏感数据泄漏MASTG DEMO 0006 实战演示 在 Android 应用安全测试中文档教程网络安全OWASP MASTG 实战iOS WebView 中 evaluateJavaScript 写入 DOM 的敏感数据泄露检测MASTG-DEMO-0146OWASP MASTG 实战iOS WebView 中 evaluateJavaScript 写入 DOM 的敏感数据泄露检测MASTG DEMO 0146文档教程网络安全OWASP MASTG 实践指南彻底移除 Android 应用日志代码防止敏感数据泄露OWASP MASTG 实践指南彻底移除 Android 应用日志代码防止敏感数据泄露 导读 本指南以 OWASP Mobile Application S文档教程网络安全上一篇RT-Thread 微芯 SAME70 平台 I2C 主机同步驱动HAL i2c_m_sync技术指南下一篇AI-Trader API完全参考手册从注册到交易的完整接口指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。