hacktricks/mobile-pentesting/ios-pentesting/ios-app-extensions.md

12 KiB
Raw Blame History

iOS应用扩展

从零到英雄学习AWS黑客攻击通过 htARTE (HackTricks AWS红队专家)

支持HackTricks的其他方式

内容复制自 https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions

应用扩展允许应用程序在用户与其他应用程序或系统交互时提供自定义功能和内容。一些值得注意的包括:

  • 自定义键盘用自定义键盘替换iOS系统键盘以便在所有应用中使用。
  • 分享:发布到分享网站或与他人分享内容。
  • 今天:也称为小部件,它们在通知中心的今天视图中提供内容或执行快速任务。

例如用户在_宿主应用_中选择文本点击“分享”按钮并从列表中选择一个“应用”或操作。这将触发_包含应用_的_应用扩展_。应用扩展在宿主应用的上下文中显示其视图并使用宿主应用提供的项目在这种情况下是选定的文本来执行特定任务例如在社交网络上发布。请看这张来自苹果应用扩展编程指南的图片,它很好地总结了这一点:

安全考虑

从安全角度来看,重要的是要注意:

  • 一个应用扩展永远不会直接与其包含的应用通信(通常,当包含的应用扩展正在运行时,它甚至不会运行)。
  • 一个应用扩展宿主应用通过进程间通信。
  • 一个应用扩展的包含应用和宿主应用根本不通信。
  • 一个今天小部件(和其他类型的应用扩展不同)可以通过调用NSExtensionContext类的openURL:completionHandler:方法要求系统打开其包含的应用。
  • 任何应用扩展及其包含的应用都可以在私下定义的共享容器中访问共享数据
  • 应用扩展无法访问某些API例如HealthKit。
  • 它们无法使用AirDrop接收数据,但可以发送数据。
  • 不允许长时间运行的后台任务,但可以启动上传或下载。
  • 应用扩展无法访问iOS设备上的相机或麦克风iMessage应用扩展除外

静态分析

验证应用是否包含应用扩展

如果您有原始源代码您可以使用Xcodecmd+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-textpublic.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-textpublic.file-url)。
  • com.apple.mobilenotes.SharingExtension.appex 正在接收并将处理文本文件。

如果您想了解更多关于 XPC 底层发生的情况,我们建议查看 "libxpc.dylib" 的内部调用。例如,您可以使用 frida-trace,然后通过扩展自动生成的存根,深入研究您觉得更有趣的方法。

从零开始学习 AWS 黑客技术,成为 htARTE (HackTricks AWS 红队专家)

支持 HackTricks 的其他方式: