{{#include ../../banners/hacktricks-training.md}} iOSデバイス上のアプリケーション間でのデータ共有は、[`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard)メカニズムによって促進されており、主に2つのカテゴリに分かれています。 - **システム全体の一般ペーストボード**: これは**任意のアプリケーション**とデータを共有するために使用され、デバイスの再起動やアプリのアンインストールを超えてデータを持続させるように設計されています。この機能はiOS 10から利用可能です。 - **カスタム / 名前付きペーストボード**: これらは**アプリ内または同じチームIDを共有する別のアプリとのデータ共有**のために特に設計されており、作成したアプリケーションプロセスのライフサイクルを超えて持続するようには設計されていません。これはiOS 10で導入された変更に従っています。 **セキュリティの考慮事項**は、ペーストボードを利用する際に重要な役割を果たします。例えば: - ユーザーが**ペーストボード**へのアクセスを管理するためのアプリ権限を管理するメカニズムはありません。 - ペーストボードの不正なバックグラウンド監視のリスクを軽減するために、アクセスはアプリケーションがフォアグラウンドにあるときに制限されています(iOS 9以降)。 - プライバシーの懸念から、持続的な名前付きペーストボードの使用は共有コンテナの方が推奨されています。 - iOS 10で導入された**ユニバーサルクリップボード**機能は、一般ペーストボードを介してデバイス間でコンテンツを共有できるようにし、開発者がデータの有効期限を設定し、自動コンテンツ転送を無効にすることができます。 **機密情報が誤って**グローバルペーストボードに保存されないようにすることが重要です。さらに、アプリケーションはグローバルペーストボードデータの不正使用を防ぐように設計されるべきであり、開発者は機密情報をクリップボードにコピーすることを防ぐための対策を実装することが推奨されます。 ### 静的分析 静的分析では、ソースコードまたはバイナリを検索して以下を確認します: - `generalPasteboard`を使用して**システム全体の一般ペーストボード**の使用を特定します。 - `pasteboardWithName:create:`および`pasteboardWithUniqueName`を使用して**カスタムペーストボード**を作成します。持続性が有効になっているか確認しますが、これは非推奨です。 ### 動的分析 動的分析では、特定のメソッドをフックまたはトレースします: - システム全体の使用のために`generalPasteboard`を監視します。 - カスタム実装のために`pasteboardWithName:create:`および`pasteboardWithUniqueName`をトレースします。 - 持続性設定を確認するために非推奨の`setPersistent:`メソッド呼び出しを観察します。 監視すべき重要な詳細には以下が含まれます: - **ペーストボード名**と**内容**(例えば、文字列、URL、画像のチェック)。 - 存在する**アイテムの数**と**データタイプ**、標準およびカスタムデータタイプチェックを活用します。 - `setItems:options:`メソッドを調査して**有効期限およびローカル専用オプション**を確認します。 監視ツールの使用例としては、**objectionのペーストボードモニター**があり、一般ペーストボードを5秒ごとにポーリングして変更を確認し、新しいデータを出力します。 以下は、objectionのアプローチに触発されたシンプルなJavaScriptスクリプトの例で、ペーストボードからの変更を5秒ごとに読み取り、ログに記録します: ```javascript const UIPasteboard = ObjC.classes.UIPasteboard const Pasteboard = UIPasteboard.generalPasteboard() var items = "" var count = Pasteboard.changeCount().toString() setInterval(function () { const currentCount = Pasteboard.changeCount().toString() const currentItems = Pasteboard.items().toString() if (currentCount === count) { return } items = currentItems count = currentCount console.log( "[* Pasteboard changed] count: " + count + " hasStrings: " + Pasteboard.hasStrings().toString() + " hasURLs: " + Pasteboard.hasURLs().toString() + " hasImages: " + Pasteboard.hasImages().toString() ) console.log(items) }, 1000 * 5) ``` ## 参考文献 - [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8) - [https://hackmd.io/@robihamanto/owasp-robi](https://hackmd.io/@robihamanto/owasp-robi) - [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/) {{#include ../../banners/hacktricks-training.md}}