2024-01-12 09:01:50 +00:00
```markdown
2022-04-28 16:01:33 +00:00
< details >
2024-01-12 09:01:50 +00:00
< summary > < strong > 从零到英雄学习AWS黑客攻击< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > ! < / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-01-12 09:01:50 +00:00
支持HackTricks的其他方式:
2022-04-28 16:01:33 +00:00
2024-01-12 09:01:50 +00:00
* 如果您想在**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来分享您的黑客技巧。**
2022-04-28 16:01:33 +00:00
< / details >
2024-01-12 09:01:50 +00:00
[`UIPasteboard` ](https://developer.apple.com/documentation/uikit/uipasteboard ) 使得在应用内部以及应用之间共享数据成为可能。有两种类型的剪贴板:
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
* **系统级通用剪贴板**:用于与**任何应用**共享数据。默认情况下, 设备重启和应用卸载后数据仍然持久存在( 自iOS 10起) 。
* **自定义/命名剪贴板**:用于与**另一个应用**( 具有与分享应用相同的团队ID) 或**应用本身**共享数据( 它们仅在创建它们的进程中可用) 。默认情况下是非持久的( 自iOS 10起) , 即它们只存在于拥有( 创建) 应用退出之前。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
一些安全考虑:
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
* 用户**无法授予或拒绝**应用读取**剪贴板**的权限。
* 自iOS 9起, 应用[无法在后台访问剪贴板](https://forums.developer.apple.com/thread/13760),这减少了后台剪贴板监控的可能性。
* [苹果警告持久化命名剪贴板 ](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc )并**不推荐使用**。相反,应使用共享容器。
* 从iOS 10开始, 有一个名为**通用剪贴板**的新Handoff功能, 默认情况下是启用的。它允许**通用剪贴板内容在设备之间自动传输**。如果开发者选择,可以禁用此功能,并且还可以为复制的数据设置过期时间和日期。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
因此,重要的是**检查敏感信息是否被保存在全局剪贴板中**。\
同样重要的是检查**应用是否使用全局剪贴板数据执行操作**,因为恶意应用可能篡改这些数据。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
**应用也可以阻止用户将敏感数据复制到剪贴板**(这是推荐的做法)。
2021-05-21 16:38:18 +00:00
2023-08-03 19:12:22 +00:00
## 静态分析
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
可以通过使用[`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc)获取**系统级通用剪贴板**,搜索源代码或编译后的二进制文件中的这个方法。处理敏感数据时应避免使用系统级通用剪贴板。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
**自定义剪贴板**可以通过[`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起已被弃用。应该使用共享容器代替。
2021-05-21 16:38:18 +00:00
2023-08-03 19:12:22 +00:00
## 动态分析
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
Hook或追踪以下内容:
* `generalPasteboard` 用于系统级通用剪贴板。
* `pasteboardWithName:create:` 和 `pasteboardWithUniqueName` 用于自定义剪贴板。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
您还可以Hook或追踪已弃用的[`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc)方法并验证是否调用了它。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
在**监控**剪贴板时,有几个**细节**可以动态**检索**:
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
* 通过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` 来检查排除或即将过期的项目。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
如果只寻找字符串,您可能想使用**objection**的命令`ios pasteboard monitor`:
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
> Hook进iOS UIPasteboard类并每5秒轮询一次generalPasteboard中的数据。如果发现新数据, 与上一次轮询的数据不同, 那么这些数据将被显示在屏幕上。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
您也可以构建自己的剪贴板监控器,监控上述特定信息。
2021-05-21 16:38:18 +00:00
2024-01-12 09:01:50 +00:00
例如,这个脚本(受到[objection的剪贴板监控器](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)脚本的启发) 每5秒读取一次剪贴板项目, 如果有新内容, 它将打印出来:
```
2021-05-21 16:38:18 +00:00
```javascript
const UIPasteboard = ObjC.classes.UIPasteboard;
2023-08-03 19:12:22 +00:00
const Pasteboard = UIPasteboard.generalPasteboard();
var items = "";
var count = Pasteboard.changeCount().toString();
2021-05-21 16:38:18 +00:00
setInterval(function () {
2023-08-03 19:12:22 +00:00
const currentCount = Pasteboard.changeCount().toString();
const currentItems = Pasteboard.items().toString();
2021-05-21 16:38:18 +00:00
2023-08-03 19:12:22 +00:00
if (currentCount === count) { return; }
2021-05-21 16:38:18 +00:00
2023-08-03 19:12:22 +00:00
items = currentItems;
count = currentCount;
2021-05-21 16:38:18 +00:00
2023-08-03 19:12:22 +00:00
console.log('[* Pasteboard changed] count: ' + count +
' hasStrings: ' + Pasteboard.hasStrings().toString() +
' hasURLs: ' + Pasteboard.hasURLs().toString() +
' hasImages: ' + Pasteboard.hasImages().toString());
console.log(items);
2021-05-21 16:38:18 +00:00
2023-08-03 19:12:22 +00:00
}, 1000 * 5);
2021-05-21 16:38:18 +00:00
```
2023-08-03 19:12:22 +00:00
# 参考资料
2021-05-21 16:38:18 +00:00
2021-10-18 11:21:18 +00:00
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
2021-05-21 16:38:18 +00:00
2022-04-28 16:01:33 +00:00
< details >
2024-01-12 09:01:50 +00:00
< summary > < strong > 通过< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > 从零开始学习AWS黑客攻击! < / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-01-12 09:01:50 +00:00
支持HackTricks的其他方式:
2022-04-28 16:01:33 +00:00
2024-01-12 09:01:50 +00:00
* 如果您想在**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来分享您的黑客技巧。
2022-04-28 16:01:33 +00:00
< / details >