- 文档
- 教程
- 网络安全
【免费下载链接】mastg
The 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.
本文基于 OWASP Mobile Application Security Testing Guide(MASTG)的 iOS 剪贴板监控技术(MASTG-TECH-0134)展开。iOS 剪贴板是跨应用共享数据的系统级通道,任何应用复制的文本、URL、图片等敏感数据都会短暂驻留在其中,成为移动应用安全测试中容易被忽视的泄露点。读完本文,你将掌握如何通过 hookUIPasteboard类获取剪贴板内容与数据类型、使用 objection 的ios pasteboard monitor命令进行快速轮询监控,并能够编写自定义 Frida 脚本对敏感数据进行实时追踪。
剪贴板:为什么值得监控
在 iOS 安全模型中,每个应用的数据都被限制在沙盒目录内(详见 App Sandbox Directories),应用之间无法直接读写对方的文件。但剪贴板(UIPasteboard)是例外——它由系统统一管理,进程间共享,任何应用都可以读取用户复制的数据,无需任何权限申请。这意味着:
- 用户在一个 App 中复制了账号、口令、Token、地址等敏感信息,另一个恶意 App 即可在后台静默读取;
- 应用自身若将敏感数据写入剪贴板(例如点击"复制验证码"后不做清除),也会扩大数据暴露面;
- MASTG 在代码质量测试中也明确将 Pasteboards 列为不受信任的外部输入来源之一,见 Testing Code Quality。
因此,安全测试中需要监控剪贴板,检查是否有敏感数据被复制到其中,以检测潜在的数据泄露或剪贴板滥用行为。
获取剪贴板信息:HookUIPasteboard的四个切入点
UIPasteboard是 UIKit 提供的剪贴板接口,MASTG 建议在运行时通过 Frida 等工具 hook 以下方法/属性,获取剪贴板的状态与内容:
1. 获取剪贴板实例名
- Hook
pasteboardWithName:create:,检查其输入参数(剪贴板名称),可确认应用正在使用哪个命名剪贴板; - Hook
pasteboardWithUniqueName,检查其返回值,可捕获应用创建的临时唯一剪贴板。
2. 读取剪贴板项内容
获取第一个可用的剪贴板项:例如对于字符串,使用string方法;对于其他标准数据类型(如 URL、图片、颜色、HTML 等),使用对应的读取方法(如URL、image、color、HTML等)。
3. 统计项数量
使用numberOfItems属性获取当前剪贴板中的项数,可用于判断剪贴板是否被写入新内容。
4. 检查数据类型是否存在
- 使用便捷方法(convenience methods)快速检查标准数据类型是否存在,例如
hasImages、hasStrings、hasURLs(hasURLs自 iOS 10 起可用); - 使用
containsPasteboardTypes:inItemSet:检查更具体的数据类型(通常是 UTI,即 Uniform Type Identifier)。可以检查诸如public.png、public.tiff之类的图片 UTI,也可以检查自定义数据类型(如com.mycompany.myapp.mytype)。注意:对于自定义 UTI,只有"声明了解(declare knowledge of)"该类型的应用才能理解写入剪贴板的数据——这与 UIActivity 分享机制中的行为一致,详见 UIActivity Sharing 一节; - 使用
itemSetWithPasteboardTypes:并设置对应的 UTI 列表,批量取回这些类型的剪贴板项。
5. 检查被排除或即将过期的剪贴板项
HooksetItems:options:,检查其 options 中是否包含UIPasteboardOptionLocalOnly(仅本地可用、不参与系统级共享)或UIPasteboardOptionExpirationDate(指定过期时间),以确认应用是否主动限制了剪贴板内容的传播范围与生命周期。
快速通道:使用 objection 的ios pasteboard monitor命令
如果只需监控字符串类型的数据,最快捷的方式是使用 objection(MASTG-TOOL-0074)内置的剪贴板监控命令:
ios pasteboard monitor该命令的实现原理是:hook 进 iOS 的UIPasteboard类,每 5 秒轮询一次generalPasteboard(通用剪贴板)。如果发现与上次轮询不同的新数据,就将其显示在屏幕上。
使用 objection 前,需要先连接到目标应用。objection 支持两种连接方式(详见 MASTG-TOOL-0074):
- 越狱设备 + frida-server:直接附加到正在运行的应用,
objection -n "AppName" start; - 非越狱设备 + 重打包应用:先对 IPA 进行重打包以注入 Frida Gadget(见 MASTG-TECH-0092),再以
objection -n Gadget start启动。
进入 objection REPL 后即可运行ios pasteboard monitor开始监控,适合在测试中快速确认"复制操作是否携带敏感数据"。
进阶:编写自定义 Frida 剪贴板监控脚本
对于需要追踪特定类型数据的场景,可以自行构建剪贴板监控器。MASTG 提供了一个基于 objection 剪贴板监控脚本(pasteboard.ts)思路编写的 Frida 示例脚本,每 5 秒读取一次剪贴板项,若有新内容则打印出来:
const UIPasteboard = ObjC.classes.UIPasteboard; const Pasteboard = UIPasteboard.generalPasteboard(); var items = ""; var count = Pasteboard.changeCount().toString(); setInterval(function () { const currentCount = Pasteboard.changeCount().toString(); const currentItems = Pasteboard.items().toString(); if (currentCount === count) { return; } items = currentItems; count = currentCount; console.log('[* Pasteboard changed] count: ' + count + ' hasStrings: ' + Pasteboard.hasStrings().toString() + ' hasURLs: ' + Pasteboard.hasURLs().toString() + ' hasImages: ' + Pasteboard.hasImages().toString()); console.log(items); }, 1000 * 5);脚本原理逐行解析
- 获取剪贴板对象:
UIPasteboard.generalPasteboard()拿到系统通用剪贴板(与应用内命名剪贴板相对,generalPasteboard是跨应用共享的主剪贴板); - 记录基准状态:
changeCount()返回剪贴板内容的变更计数器——每次剪贴板内容被写入/替换,该计数都会递增,是判断"是否有新数据"的可靠依据; - 定时轮询:
setInterval每 5 秒(1000 * 5毫秒)执行一次; - 变更检测:将当前的
changeCount与上次记录的值比较,相同则直接返回(跳过),不同则说明剪贴板发生了写入; - 内容快照:
items()返回剪贴板所有项,打印前先更新基准count; - 类型标注:通过
hasStrings()、hasURLs()、hasImages()三个便捷方法快速标注新内容的类型,便于在日志中一眼识别敏感数据类型。
实际输出解读
脚本运行时的输出如下:
[* Pasteboard changed] count: 64 hasStrings: true hasURLs: false hasImages: false ( { "public.utf8-plain-text" = hola; } ) [* Pasteboard changed] count: 65 hasStrings: true hasURLs: true hasImages: false ( { "public.url" = "https://codeshare.frida.re/"; "public.utf8-plain-text" = "https://codeshare.frida.re/"; } ) [* Pasteboard changed] count: 66 hasStrings: false hasURLs: false hasImages: true ( { "com.apple.uikit.image" = "<UIImage: 0x1c42b23c0> size {571, 264} orientation 0 scale 1.000000"; "public.jpeg" = "<UIImage: 0x1c44a1260> size {571, 264} orientation 0 scale 1.000000"; "public.png" = "<UIImage: 0x1c04aaaa0> size {571, 264} orientation 0 scale 1.000000"; } )输出展示了三次连续的剪贴板写入:
- 纯文本(
changeCount64):复制了字符串"hola",对应 UTI 为public.utf8-plain-text; - URL(
changeCount65):复制了https://codeshare.frida.re/。注意同一条数据同时以public.url和public.utf8-plain-text两种 UTI 呈现——iOS 会自动为 URL 提供文本表示; - 图片(
changeCount66):复制了一张尺寸为 571×264 的图片,同时以com.apple.uikit.image、public.jpeg、public.png三种 UTI 呈现。
关于 UTI 与数据可达性
从输出可以看出,同一份剪贴板数据往往可通过多种 UTI 读取。是否能够"读懂"取决于读取方是否声明了解对应类型:public.utf8-plain-text、public.url、public.png、public.jpeg等系统标准 UTI 对几乎所有应用可见,因此文本、URL、图片默认会暴露给其他应用;而com.apple.uikit.image这类私有 UTI 或应用自定义类型(如com.mycompany.myapp.mytype),只有声明了解该类型的应用才能正确解析,其余应用即使读到也无法理解。这与 UIActivity Sharing 一节中"自定义 UTI 需双方声明知识才能互通"的机制完全一致——测试者在分析剪贴板泄露面时,应同时关注标准 UTI 覆盖的通用数据与自定义 UTI 承载的应用专属数据。
将剪贴板监控纳入完整测试流程
剪贴板监控并不是孤立操作,它与 MASTG 中多个测试与知识模块相互印证:
- 数据分享场景:应用通过
UIActivityViewController分享数据时(参见 UIActivity Sharing 知识 与 测试 UIActivity Sharing),分享的 items 同样可能被写入剪贴板或经剪贴板中转。测试时应把剪贴板监控与 UIActivity 分享的 hook(如initWithActivityItems:applicationActivities:)结合,完整还原数据的传播路径; - 不受信任输入:剪贴板内容属于应用外部输入,恶意来源可向剪贴板注入内容,应用若信任剪贴板数据(如自动粘贴到输入框),可能引入注入风险;
- 越权读取面:结合沙盒目录知识可知,剪贴板是少数不受沙盒约束的共享通道,测试报告中应将"剪贴板中的敏感数据"单独列为泄露风险点。
实战建议与注意事项
- 优先使用 changeCount 而非内容比对:
changeCount是系统级的变更计数器,比逐字节比对内容更可靠,也能捕获"内容相同但被重新写入"的情况; - 区分监控范围:
generalPasteboard只能看到通用剪贴板。若应用使用命名剪贴板(pasteboardWithName:create:创建),需额外 hook 该方法捕获剪贴板名称后再针对监控; - 关注剪贴板生命周期:Hook
setItems:options:检查UIPasteboardOptionExpirationDate与UIPasteboardOptionLocalOnly,可判断应用是否设置了数据过期时间或限制本地可见性——这是评估应用剪贴板安全设计的重要依据; - 轮询间隔权衡:objection 与示例脚本默认 5 秒轮询一次,适合人工观察;如需捕获瞬时写入的敏感数据(如自动填充的验证码),可适当缩短轮询间隔,但要注意过于频繁的轮询会增加运行时开销;
- 结合静态分析:在动态监控的同时,检查应用源码中所有写入剪贴板的调用点(
UIPasteboard.generalPasteboard().setItems、setString等),确认复制内容是否包含口令、令牌、身份证号等高敏数据,并在测试报告中给出清除剪贴板(如复制后置空)或改用专用安全通道(如系统验证码自动填充 API)的修复建议。
通过以上"命令级快速监控 + 脚本级自定义监控"的组合,测试者可以全面掌握 iOS 应用在剪贴板维度的数据泄露情况,从而在 MASTG 的测试框架下形成完整的证据链与修复指引。
- 文档
- 教程
- 网络安全
【免费下载链接】mastg
The 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.
相关推荐
iOS 通用剪贴板(General Pasteboard)敏感数据静态检测:OWASP MASTG 测试用例 MASTG-TEST-0276 深度解析
iOS 通用剪贴板(General Pasteboard)敏感数据静态检测:OWASP MASTG 测试用例 MASTG TEST 0276 深度解析 本文基于
文档教程网络安全MASTG 实战:用 Frida 与 idevicesyslog 双通道监测 iOS 应用日志,检测实现细节泄露(MASTG-DEMO-0125)
MASTG 实战:用 Frida 与 idevicesyslog 双通道监测 iOS 应用日志,检测实现细节泄露(MASTG DEMO 0125) 本文围绕 O
文档教程网络安全使用 Frida 运行时监控 iOS WKWebView 本地文件访问:OWASP MASTG MASTG-DEMO-0099 实战解析
使用 Frida 运行时监控 iOS WKWebView 本地文件访问:OWASP MASTG MASTG DEMO 0099 实战解析 本文基于 OWASP
文档教程网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考