iOS UIPasteboard

Support HackTricks

iOSデバイス上でのアプリケーション間のデータ共有は、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秒ごとに読み取り、ログに記録します:

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);

参考文献

HackTricksをサポートする

Last updated