hacktricks/mobile-pentesting/ios-pentesting/ios-uipasteboard.md

8 KiB
Raw Blame History

<details>

<summary><strong>从零到英雄学习AWS黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>

支持HackTricks的其他方式

* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**

</details>


[`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) 使得在应用内部以及应用之间共享数据成为可能。有两种类型的剪贴板:

* **系统级通用剪贴板**:用于与**任何应用**共享数据。默认情况下设备重启和应用卸载后数据仍然持久存在自iOS 10起* **自定义/命名剪贴板**:用于与**另一个应用**具有与分享应用相同的团队ID或**应用本身**共享数据它们仅在创建它们的进程中可用。默认情况下是非持久的自iOS 10起即它们只存在于拥有创建应用退出之前。

一些安全考虑:

* 用户**无法授予或拒绝**应用读取**剪贴板**的权限。
* 自iOS 9起应用[无法在后台访问剪贴板](https://forums.developer.apple.com/thread/13760),这减少了后台剪贴板监控的可能性。
* [苹果警告持久化命名剪贴板](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc)并**不推荐使用**。相反,应使用共享容器。
* 从iOS 10开始有一个名为**通用剪贴板**的新Handoff功能默认情况下是启用的。它允许**通用剪贴板内容在设备之间自动传输**。如果开发者选择,可以禁用此功能,并且还可以为复制的数据设置过期时间和日期。

因此,重要的是**检查敏感信息是否被保存在全局剪贴板中**。\
同样重要的是检查**应用是否使用全局剪贴板数据执行操作**,因为恶意应用可能篡改这些数据。

**应用也可以阻止用户将敏感数据复制到剪贴板**(这是推荐的做法)。

## 静态分析

可以通过使用[`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc)获取**系统级通用剪贴板**,搜索源代码或编译后的二进制文件中的这个方法。处理敏感数据时应避免使用系统级通用剪贴板。

**自定义剪贴板**可以通过[`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc)或[`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc)创建。验证自定义剪贴板是否设置为持久化因为这自iOS 10起已被弃用。应该使用共享容器代替。

## 动态分析

Hook或追踪以下内容

* `generalPasteboard` 用于系统级通用剪贴板。
* `pasteboardWithName:create:``pasteboardWithUniqueName` 用于自定义剪贴板。

您还可以Hook或追踪已弃用的[`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc)方法并验证是否调用了它。

在**监控**剪贴板时,有几个**细节**可以动态**检索**

* 通过Hook `pasteboardWithName:create:` 并检查其输入参数或 `pasteboardWithUniqueName` 并检查其返回值来获取**剪贴板名称**。
* 获取**第一个可用的剪贴板项**:例如,对于字符串使用`string`方法。或者使用其他方法来处理[标准数据类型](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275)。
* 使用`numberOfItems`获取**项目数量**。
* 使用[便捷方法](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142)检查**标准数据类型的存在**,例如`hasImages`、`hasStrings`、`hasURLs`从iOS 10开始* 使用[`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc)检查**其他数据类型**通常是UTIs。您可以检查更具体的数据类型例如public.png和public.tiff[UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)或自定义数据如com.mycompany.myapp.mytype。请记住在这种情况下只有那些_声明了对该类型了解_的应用才能理解写入剪贴板的数据。使用[`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc)并设置相应的UTIs来检索它们。
* 通过Hook `setItems:options:` 并检查其选项中的 `UIPasteboardOptionLocalOnly``UIPasteboardOptionExpirationDate` 来检查排除或即将过期的项目。

如果只寻找字符串,您可能想使用**objection**的命令`ios pasteboard monitor`

> Hook进iOS UIPasteboard类并每5秒轮询一次generalPasteboard中的数据。如果发现新数据与上一次轮询的数据不同那么这些数据将被显示在屏幕上。

您也可以构建自己的剪贴板监控器,监控上述特定信息。

例如,这个脚本(受到[objection的剪贴板监控器](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)脚本的启发每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);

参考资料

{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}

通过 htARTE (HackTricks AWS Red Team Expert)从零开始学习AWS黑客攻击

支持HackTricks的其他方式