跳过内容

MASTG-TEST-0072: 测试应用扩展

此测试即将更新

此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。

通过提交 PR 来帮助我们:MASTG v1->v2 MASTG-TEST-0072: 测试应用扩展 (ios)

发送反馈

概述

静态分析

静态分析将负责

  • 验证应用是否包含应用扩展
  • 确定支持的数据类型
  • 检查与包含应用的数据共享
  • 验证应用是否限制使用应用扩展

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

如果您有原始源代码,您可以使用 Xcode(cmd+shift+f)搜索所有出现的 NSExtensionPointIdentifier,或者查看“构建阶段 / 嵌入应用扩展”

在那里您可以找到所有嵌入的应用扩展的名称,后跟 .appex,现在您可以导航到项目中的各个应用扩展。

如果没有原始源代码

在应用包(IPA 或已安装的应用)中的所有文件中 Grep 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 进行数据共享之间的区别,在 UIActivity 中我们必须定义文档类型,也使用 UTI。 一个应用不需要为此拥有扩展。 可以仅使用 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 的数据类型才会被支持。 但是,通过使用所谓的谓词字符串可以进行更复杂的过滤,该谓词字符串将评估给定的 UTI。 请参阅 Apple App Extension Programming Guide 以获取有关此的更多详细信息。

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

请记住,应用扩展及其包含的应用无法直接访问彼此的容器。 但是,可以启用数据共享。 这是通过 “App Groups”NSUserDefaults API 完成的。 请参阅 Apple App Extension Programming Guide 中的这张图

正如该指南中也提到的,如果应用扩展使用 NSURLSession 类来执行后台上传或下载,则应用必须设置共享容器,以便扩展及其包含的应用都可以访问传输的数据。

验证应用是否限制使用应用扩展

可以使用以下方法拒绝特定类型的应用扩展

但是,目前仅适用于“自定义键盘”应用扩展(并且在测试通过键盘处理敏感数据的应用时应进行验证,例如银行应用)。

动态分析

对于动态分析,我们可以执行以下操作来在没有源代码的情况下获得知识

  • 检查正在共享的项目
  • 识别涉及的应用扩展

检查正在共享的项目

为此,我们应该在数据来源应用中 hook 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 中包含的 UTI 是 public.plain-textpublic.file-url,后者包含在 Telegram 的“共享扩展”的 Info.plist 中的 NSExtensionActivationRule 中。

识别涉及的应用扩展

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