hacktricks/mobile-pentesting/ios-pentesting/ios-app-extensions.md
2023-08-03 19:12:22 +00:00

13 KiB
Raw Blame History

iOS应用扩展

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

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

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

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

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

安全注意事项

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

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

静态分析

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

如果你有原始源代码你可以使用Xcodecmd+shift+f搜索所有出现NSExtensionPointIdentifier的地方或者查看“Build Phases / Embed App extensions”

在那里,你可以找到所有嵌入的应用扩展的名称后面跟着.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访问找到应用程序包并列出所有内部的插件它们默认放置在那里或者使用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 Extension编程指南

检查与包含应用程序的数据共享

请记住,应用程序扩展及其包含的应用程序不能直接访问彼此的容器。但是,可以启用数据共享。这是通过"App Groups"NSUserDefaults API完成的。请参阅Apple App Extension编程指南中的此图:

正如指南中提到的那样,如果应用程序扩展使用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的"Share Extension"的Info.plistNSExtensionActivationRule中。

识别涉及的应用扩展

您还可以通过挂钩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,然后通过扩展自动生成的存根来深入研究您发现更有趣的方法。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥