# iOS应用扩展
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
- 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
**内容摘自**[**https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions)
应用扩展允许应用在用户与其他应用或系统进行交互时提供自定义功能和内容。一些值得注意的应用扩展有:
* **自定义键盘**:用自定义键盘替换iOS系统键盘,可在所有应用中使用。
* **分享**:发布到共享网站或与他人分享内容。
* **Today**:也称为**小部件**,它们在通知中心的Today视图中提供内容或执行快速任务。
例如,用户在_主机应用_中选择文本,点击“分享”按钮并从列表中选择一个“应用”或操作。这将触发_包含应用_的_应用扩展_。应用扩展在主机应用的上下文中显示其视图,并使用主机应用提供的项目(在本例中为所选文本)执行特定任务(例如在社交网络上发布)。请参阅这张图片,它来自[Apple应用扩展编程指南](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple\_ref/doc/uid/TP40014214-CH2-SW13),很好地总结了这一点:
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQx9khfTwUwYuMti%2Fapp\_extensions\_communication.png?alt=media)
### **安全注意事项**
从安全角度来看,重要的是要注意:
* **应用扩展永远不会直接与其包含应用通信**(通常,在包含的应用扩展运行时,它甚至不会运行)。
* **应用扩展**和**主机应用**通过**进程间通信**进行通信。
* **应用扩展的**包含应用和**主机应用不进行通信**。
* **Today小部件**(以及其他任何应用扩展类型)可以通过调用`NSExtensionContext`类的`openURL:completionHandler:`方法要求系统打开其包含应用。
* 任何**应用扩展**及其**包含应用**可以访问在私有定义的共享容器中的共享数据。
* 应用扩展**无法访问某些API**,例如HealthKit。
* 它们**无法使用AirDrop接收数据**,但可以发送数据。
* **不允许长时间运行的后台任务**,但可以启动上传或下载。
* 应用扩展**无法访问iOS设备上的相机或麦克风**(除了iMessage应用扩展)。
### 静态分析
#### **验证应用是否包含应用扩展**
如果你有原始源代码,你可以使用Xcode(cmd+shift+f)搜索所有出现`NSExtensionPointIdentifier`的地方,或者查看“Build Phases / Embed App extensions”:
![](<../../.gitbook/assets/image (496).png>)
在那里,你可以找到所有嵌入的应用扩展的名称后面跟着`.appex`,现在你可以在项目中导航到各个应用扩展。
如果没有原始源代码:
在应用包(IPA或已安装的应用)的所有文件中搜索`NSExtensionPointIdentifier`:
```bash
$ grep -nr NSExtensionPointIdentifier Payload/Telegram\ X.app/
Binary file Payload/Telegram X.app//PlugIns/SiriIntents.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Share.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/NotificationContent.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Widget.appex/Info.plist matches
Binary file Payload/Telegram X.app//Watch/Watch.app/PlugIns/Watch Extension.appex/Info.plist matches
```
您还可以通过SSH访问,找到应用程序包并列出所有内部的插件(它们默认放置在那里),或者使用objection来完成:
```bash
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # cd PlugIns
/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
Telegram X.app/PlugIns
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection Read Write Name
------------ ------- ------------------ ------ ------- -------------------------
Directory 493 None True False NotificationContent.appex
Directory 493 None True False Widget.appex
Directory 493 None True False Share.appex
Directory 493 None True False SiriIntents.appex
```
我们现在可以看到与之前在Xcode中看到的四个应用程序扩展相同的内容。
#### **确定支持的数据类型**
这对于与主机应用程序共享数据(例如通过共享或操作扩展)非常重要。当用户在主机应用程序中选择某个数据类型并且它与此处定义的数据类型匹配时,主机应用程序将提供该扩展。值得注意的是,这与通过`UIActivity`进行数据共享的方式之间的区别,在那种情况下,我们必须定义文档类型,也使用UTIs。应用程序不需要为此定义扩展。可以仅使用`UIActivity`来共享数据。
检查应用程序扩展的`Info.plist`文件,并搜索`NSExtensionActivationRule`。该键指定支持的数据以及支持的最大项目数等。例如:
```markup
NSExtensionAttributes
NSExtensionActivationRule
NSExtensionActivationSupportsImageWithMaxCount
10
NSExtensionActivationSupportsMovieWithMaxCount
1
NSExtensionActivationSupportsWebURLWithMaxCount
1
```
只支持这里列出的数据类型,并且`MaxCount`不能为`0`。然而,可以使用所谓的谓词字符串来进行更复杂的过滤,该字符串将评估给定的UTIs。有关更详细的信息,请参阅[Apple App Extension编程指南](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple\_ref/doc/uid/TP40014214-CH21-SW8)。
**检查与包含应用程序的数据共享**
请记住,应用程序扩展及其包含的应用程序不能直接访问彼此的容器。但是,可以启用数据共享。这是通过["App Groups"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple\_ref/doc/uid/TP40011195-CH4-SW19)和[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) API完成的。请参阅[Apple App Extension编程指南](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple\_ref/doc/uid/TP40014214-CH21-SW11)中的此图:
![](../../mobile-apps-pentesting/ios-pentesting/broken-reference)
正如指南中提到的那样,如果应用程序扩展使用`NSURLSession`类执行后台上传或下载,则应用程序必须设置共享容器,以便扩展和其包含的应用程序都可以访问传输的数据。
**验证应用程序是否限制了应用程序扩展的使用**
可以使用以下方法拒绝特定类型的应用程序扩展:
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
但是,目前只有"自定义键盘"应用程序扩展可以这样做(在测试处理敏感数据的应用程序时,例如银行应用程序,应进行验证)。
### 动态分析
对于动态分析,我们可以在没有源代码的情况下执行以下操作以获取信息:
* 检查正在共享的项目
* 识别所涉及的应用程序扩展
**检查正在共享的项目**
为此,我们应该在数据源应用程序中挂钩`NSExtensionContext - inputItems`。
继续使用Telegram的前一个示例,我们现在将使用“共享”按钮在Notes应用程序中创建一个带有文本文件的便签(该文件是从聊天中接收到的):
![](<../../.gitbook/assets/image (497).png>)
如果我们运行跟踪,我们将看到以下输出:
```bash
(0x1c06bb420) NSExtensionContext - inputItems
0x18284355c Foundation!-[NSExtension _itemProviderForPayload:extensionContext:]
0x1828447a4 Foundation!-[NSExtension _loadItemForPayload:contextIdentifier:completionHandler:]
0x182973224 Foundation!__NSXPCCONNECTION_IS_CALLING_OUT_TO_EXPORTED_OBJECT_S3__
0x182971968 Foundation!-[NSXPCConnection _decodeAndInvokeMessageWithEvent:flags:]
0x182748830 Foundation!message_handler
0x181ac27d0 libxpc.dylib!_xpc_connection_call_event_handler
0x181ac0168 libxpc.dylib!_xpc_connection_mach_event
...
RET: (
" - userInfo:
{
NSExtensionItemAttachmentsKey = (
" {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
);
}"
)
```
在这里我们可以观察到:
* 这是在底层通过XPC实现的,具体来说是通过使用`libxpc.dylib`框架的`NSXPCConnection`实现的。
* `NSItemProvider`中包含的UTIs是`public.plain-text`和`public.file-url`,后者包含在Telegram的"Share Extension"的[`Info.plist`](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist)的`NSExtensionActivationRule`中。
**识别涉及的应用扩展**
您还可以通过挂钩`NSExtension - _plugIn`来找出哪个应用扩展负责处理您的请求和响应:
我们再次运行相同的示例:
```bash
(0x1c0370200) NSExtension - _plugIn
RET:
(0x1c0372300) -[NSExtension _plugIn]
RET:
```
正如您所见,涉及到两个应用程序扩展:
* `Share.appex`正在发送文本文件(`public.plain-text`和`public.file-url`)。
* `com.apple.mobilenotes.SharingExtension.appex`正在接收并处理文本文件。
如果您想了解有关XPC在底层发生的情况,我们建议查看来自"libxpc.dylib"的内部调用。例如,您可以使用[`frida-trace`](https://www.frida.re/docs/frida-trace/),然后通过扩展自动生成的存根来深入研究您发现更有趣的方法。
###
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
- 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享您的黑客技巧。**