hacktricks/mobile-pentesting/ios-pentesting/ios-app-extensions.md
2023-07-07 23:42:27 +00:00

16 KiB
Raw Blame History

iOSアプリの拡張機能

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

コンテンツはhttps://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions からコピーされました

アプリの拡張機能を使用すると、ユーザーが他のアプリやシステムとやり取りしている間に、アプリがカスタムの機能やコンテンツを提供できます。いくつかの注目すべきものは次のとおりです。

  • カスタムキーボードiOSシステムキーボードをすべてのアプリで使用するためのカスタムキーボードに置き換えます。
  • 共有:共有ウェブサイトに投稿したり、他の人とコンテンツを共有したりします。
  • Todayウィジェットとも呼ばれ、通知センターのTodayビューでコンテンツを提供したり、クイックなタスクを実行したりします。

たとえば、ユーザーは_ホストアプリ_でテキストを選択し、「共有」ボタンをクリックし、リストから「アプリ」またはアクションを選択します。これにより、_含まれるアプリ_の_アプリ拡張機能_がトリガーされます。アプリ拡張機能は、ホストアプリのコンテキスト内でそのビューを表示し、ホストアプリが提供するアイテムこの場合は選択したテキストを使用して特定のタスクたとえば、ソーシャルネットワークに投稿するを実行します。これは、Apple App Extension Programming Guideのこの図が非常に良く要約しています。

セキュリティに関する考慮事項

セキュリティの観点から重要な点は次のとおりです。

  • アプリの拡張機能は、含まれるアプリと直接通信しない(通常、含まれるアプリの拡張機能が実行されている間は実行されていません)。
  • アプリの拡張機能ホストアプリは、プロセス間通信を介して通信します。
  • アプリの拡張機能の含まれるアプリとホストアプリはまったく通信しません
  • Todayウィジェット(他のアプリ拡張機能タイプではない)は、NSExtensionContextクラスのopenURL:completionHandler:メソッドを呼び出すことで、システムに含まれるアプリを開くように要求できます。
  • 任意のアプリの拡張機能とその含まれるアプリは、プライベートに定義された共有コンテナ内の共有データにアクセスできます。
  • アプリの拡張機能は、HealthKitなどの一部のAPIにアクセスできません。
  • AirDropを使用してデータを受信することはできませんが、データを送信することはできます。
  • 長時間実行されるバックグラウンドタスクは許可されていませんが、アップロードやダウンロードは開始できます。
  • アプリの拡張機能は、iMessageアプリの場合を除き、iOSデバイスのカメラやマイクにアクセスできません。

静的解析

アプリにアプリ拡張機能が含まれているかの確認

元のソースコードがある場合は、Xcodecmd+shift+fNSExtensionPointIdentifierのすべての出現箇所を検索するか、「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

サポートされているデータタイプの特定

これは、ホストアプリとのデータ共有ShareやAction Extensionsを介してに重要です。ユーザーがホストアプリで特定のデータタイプを選択し、ここで定義されたデータタイプと一致する場合、ホストアプリは拡張機能を提供します。これは、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 クラスを使用してバックグラウンドでのアップロードやダウンロードを行う場合、アプリとその含まれるアプリの両方が転送されたデータにアクセスできるように、共有コンテナを設定する必要があります。

アプリがアプリ拡張機能の使用を制限しているかどうかの確認

次のメソッドを使用して、特定の種類のアプリ拡張機能を拒否することが可能です:

ただし、現在は「カスタムキーボード」アプリ拡張機能に対してのみ可能であり(銀行アプリなど、キーボードを介して機密データを処理するアプリのテスト時に確認する必要があります)。

動的解析

ソースコードを持たずに知識を得るために、以下のことを行うことができます。

  • 共有されているアイテムの検査
  • 関与しているアプリ拡張機能の特定

共有されているアイテムの検査

これには、データの発生元アプリで NSExtensionContext - inputItems をフックする必要があります。

Telegram の前の例に続いて、チャットから受け取ったテキストファイルの「共有」ボタンを使用して、それをノートアプリにノートとして作成します:

トレースを実行すると、次の出力が表示されます:

(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.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>

以下は、iOSアプリの拡張機能に関する内容です

  • Share.appexはテキストファイル(public.plain-textおよびpublic.file-url)を送信しています。
  • com.apple.mobilenotes.SharingExtension.appexはテキストファイルを受信し、処理します。

XPCに関して内部で何が起こっているかを詳しく知りたい場合は、「libxpc.dylib」からの内部呼び出しを確認することをおすすめします。たとえば、frida-traceを使用して自動生成されたスタブを拡張し、より興味深いメソッドを探求することができます。

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