12 KiB
iOS应用扩展
从零到英雄学习AWS黑客攻击,通过 htARTE (HackTricks AWS红队专家)!
支持HackTricks的其他方式:
- 如果您想在HackTricks中看到您的公司广告或下载HackTricks的PDF,请查看订阅计划!
- 获取官方PEASS & HackTricks商品
- 发现PEASS家族,我们独家的NFTs系列
- 加入 💬 Discord群组或telegram群组或在Twitter上关注我 🐦 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享您的黑客技巧。
应用扩展允许应用程序在用户与其他应用程序或系统交互时提供自定义功能和内容。一些值得注意的包括:
- 自定义键盘:用自定义键盘替换iOS系统键盘,以便在所有应用中使用。
- 分享:发布到分享网站或与他人分享内容。
- 今天:也称为小部件,它们在通知中心的今天视图中提供内容或执行快速任务。
例如,用户在_宿主应用_中选择文本,点击“分享”按钮并从列表中选择一个“应用”或操作。这将触发_包含应用_的_应用扩展_。应用扩展在宿主应用的上下文中显示其视图,并使用宿主应用提供的项目,在这种情况下是选定的文本,来执行特定任务(例如,在社交网络上发布)。请看这张来自苹果应用扩展编程指南的图片,它很好地总结了这一点:
安全考虑
从安全角度来看,重要的是要注意:
- 一个应用扩展永远不会直接与其包含的应用通信(通常,当包含的应用扩展正在运行时,它甚至不会运行)。
- 一个应用扩展和宿主应用通过进程间通信。
- 一个应用扩展的包含应用和宿主应用根本不通信。
- 一个今天的小部件(和其他类型的应用扩展不同)可以通过调用
NSExtensionContext
类的openURL:completionHandler:
方法要求系统打开其包含的应用。 - 任何应用扩展及其包含的应用都可以在私下定义的共享容器中访问共享数据。
- 应用扩展无法访问某些API,例如HealthKit。
- 它们无法使用AirDrop接收数据,但可以发送数据。
- 不允许长时间运行的后台任务,但可以启动上传或下载。
- 应用扩展无法访问iOS设备上的相机或麦克风(iMessage应用扩展除外)。
静态分析
验证应用是否包含应用扩展
如果您有原始源代码,您可以使用Xcode(cmd+shift+f)搜索NSExtensionPointIdentifier
的所有出现,或查看“构建阶段/嵌入应用扩展”:
在那里,您可以找到所有嵌入的应用扩展的名称,后面跟着.appex
,现在您可以在项目中导航到各个应用扩展。
如果没有原始源代码:
在应用包(IPA或已安装的应用)内的所有文件中搜索NSExtensionPointIdentifier
:
$ 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访问,找到应用程序包并列出所有内部PlugIns(它们默认放置在那里),或者使用objection来完成:
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
。该键指定了被支持的数据以及例如支持的项目的最大数量。例如:
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>10</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
仅支持此处存在的数据类型,并且 MaxCount
不为 0
。然而,通过使用所谓的谓词字符串可以进行更复杂的过滤,该字符串将评估给定的 UTIs。请参阅 Apple 应用扩展编程指南 以获取更详细的信息。
检查与包含应用的数据共享
请记住,应用扩展和它们的包含应用不能直接访问彼此的容器。然而,可以启用数据共享。这是通过 "App Groups" 和 NSUserDefaults
API 完成的。请参见 Apple 应用扩展编程指南 中的此图:
如指南中所述,如果应用扩展使用 NSURLSession
类执行后台上传或下载,则应用必须设置共享容器,以便扩展及其包含应用都可以访问传输的数据。
验证应用是否限制使用应用扩展
可以使用以下方法拒绝特定类型的应用扩展:
然而,目前仅对“自定义键盘”应用扩展(在测试处理敏感数据的应用时应进行验证,例如银行应用)可能。
动态分析
对于动态分析,我们可以做以下事情来获得知识,而不需要源代码:
- 检查正在共享的项目
- 识别涉及的应用扩展
检查正在共享的项目
为此,我们应该在数据起源应用中挂钩 NSExtensionContext - inputItems
。
继续前面的 Telegram 示例,我们现在将使用文本文件(从聊天中接收)上的“分享”按钮在 Notes 应用中创建一个笔记:
如果我们运行跟踪,我们会看到以下输出:
(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: (
"<NSExtensionItem: 0x1c420a540> - userInfo:
{
NSExtensionItemAttachmentsKey = (
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
);
}"
)
在这里我们可以观察到:
- 这是通过 XPC 在后台进行的,具体是通过使用
libxpc.dylib
框架的NSXPCConnection
实现的。 - 包含在
NSItemProvider
中的 UTIs 是public.plain-text
和public.file-url
,后者被包含在 Telegram 的“分享扩展”的Info.plist
中的NSExtensionActivationRule
。
识别涉及的应用扩展
您还可以通过挂钩 NSExtension - _plugIn
来找出哪个应用扩展正在处理您的请求和响应:
我们再次运行相同的示例:
(0x1c0370200) NSExtension - _plugIn
RET: <PKPlugin: 0x1163637f0 ph.telegra.Telegraph.Share(5.3) 5B6DE177-F09B-47DA-90CD-34D73121C785
1(2) /private/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35
/Telegram X.app/PlugIns/Share.appex>
(0x1c0372300) -[NSExtension _plugIn]
RET: <PKPlugin: 0x10bff7910 com.apple.mobilenotes.SharingExtension(1.5) 73E4F137-5184-4459-A70A-83
F90A1414DC 1(2) /private/var/containers/Bundle/Application/5E267B56-F104-41D0-835B-F1DAB9AE076D
/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex>
如您所见,涉及两个应用扩展:
Share.appex
正在发送文本文件(public.plain-text
和public.file-url
)。com.apple.mobilenotes.SharingExtension.appex
正在接收并将处理文本文件。
如果您想了解更多关于 XPC 底层发生的情况,我们建议查看 "libxpc.dylib" 的内部调用。例如,您可以使用 frida-trace
,然后通过扩展自动生成的存根,深入研究您觉得更有趣的方法。
从零开始学习 AWS 黑客技术,成为 htARTE (HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想在 HackTricks 中看到您的公司广告或下载 HackTricks 的 PDF,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 发现PEASS 家族,我们独家的NFT 集合
- 加入 💬 Discord 群组 或 telegram 群组 或在 Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。