16 KiB
iOSアプリの拡張機能
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのグッズを手に入れましょう。
-
💬 Discordグループまたはtelegramグループに参加するか、Twitterで🐦@carlospolopmをフォローしてください。
-
ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。
コンテンツは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デバイスのカメラやマイクにアクセスできません。
静的解析
アプリにアプリ拡張機能が含まれているかの確認
元のソースコードがある場合は、Xcode(cmd+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
サポートされているデータタイプの特定
これは、ホストアプリとのデータ共有(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-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>
以下は、iOSアプリの拡張機能に関する内容です:
Share.appex
はテキストファイル(public.plain-text
およびpublic.file-url
)を送信しています。com.apple.mobilenotes.SharingExtension.appex
はテキストファイルを受信し、処理します。
XPCに関して内部で何が起こっているかを詳しく知りたい場合は、「libxpc.dylib」からの内部呼び出しを確認することをおすすめします。たとえば、frida-trace
を使用して自動生成されたスタブを拡張し、より興味深いメソッドを探求することができます。
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのグッズを手に入れましょう。
-
💬 Discordグループに参加するか、telegramグループに参加するか、Twitterでフォローする🐦@carlospolopm。
-
**ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリ**にPRを提出してください。