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

10 KiB
Raw Blame History

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

UIPasteboardは、アプリ内および他のアプリ間でデータを共有するために使用されます。2種類のペーストボードがあります。

  • システム全体の一般的なペーストボード任意のアプリとデータを共有するためのものです。iOS 10以降、デバイスの再起動やアプリのアンインストールに関係なく、デフォルトで永続的です。
  • カスタム/名前付きペーストボード別のアプリ共有元のアプリと同じチームIDを持つまたはアプリ自体とデータを共有するためのものです作成したプロセス内でのみ利用可能です。iOS 10以降、デフォルトでは非永続的です。つまり、所有作成アプリが終了するまで存在します。

いくつかのセキュリティ上の考慮事項:

  • ユーザーはアプリがペーストボードを読み取る許可を付与または拒否することはできません
  • iOS 9以降、アプリはバックグラウンドでのペーストボードのアクセスを制限されています。これにより、バックグラウンドでのペーストボードの監視が緩和されます。
  • Appleは永続的な名前付きペーストボードについて警告しており、その使用を推奨していません。代わりに、共有コンテナを使用する必要があります。
  • iOS 10以降、デフォルトで有効になっているハンドオフ機能の一部であるUniversal Clipboardがあります。これにより、一般的なペーストボードの内容が自動的にデバイス間で転送されます。開発者が選択すれば、この機能を無効にすることも可能で、コピーされたデータの有効期限を設定することもできます。

したがって、機密情報がグローバルペーストボードに保存されていないかを確認することが重要です。
また、アプリケーションがグローバルペーストボードのデータを使用してアクションを実行していないかを確認することも重要です。悪意のあるアプリケーションがこのデータを改ざんする可能性があります。

アプリケーションは、ユーザーがクリップボードに機密データをコピーするのを防ぐこともできます(推奨されています)。

静的解析

システム全体の一般的なペーストボードは、generalPasteboardを使用して取得できます。このメソッドをソースコードまたはコンパイルされたバイナリで検索してください。機密データを扱う場合は、システム全体の一般的なペーストボードの使用は避けるべきです。

カスタムペーストボードは、pasteboardWithName:create:またはpasteboardWithUniqueNameを使用して作成できます。カスタムペーストボードが永続的に設定されているかどうかを確認してください。iOS 10以降、これは非推奨となっています。代わりに共有コンテナを使用する必要があります。

動的解析

以下のメソッドをフックまたはトレースしてください:

  • システム全体の一般的なペーストボードの場合はgeneralPasteboard
  • カスタムペーストボードの場合はpasteboardWithName:create:およびpasteboardWithUniqueName

また、非推奨のsetPersistent:メソッドをフックまたはトレースし、呼び出されているかどうかを確認してください。

ペーストボードを監視する際には、以下の詳細情報を動的に取得できます:

  • pasteboardWithName:create:をフックして入力パラメータを検査するか、pasteboardWithUniqueNameをフックして返り値を検査することで、ペーストボードの名前を取得できます。
  • 最初に利用可能なペーストボードアイテムを取得します。文字列の場合はstringメソッドを使用します。または、標準のデータ型の他のメソッドを使用します。
  • numberOfItemsを使用してアイテムの数を確認します。
  • 便利なメソッドを使用して、標準のデータ型の存在を確認します。例えば、hasImageshasStringshasURLsiOS 10以降などです。
  • [containsPasteboardTypes:inItemSet:](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes? たとえば、このスクリプト(objectionのペーストボードモニターのスクリプトに基づいていますは、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);

参考文献

{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}

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