iOS UIPasteboard

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

iOSデバイス上のアプリケーション間およびアプリケーション内でのデータ共有は、UIPasteboardメカニズムによって容易に行われます。このメカニズムは、次の2つの主要なカテゴリに分かれています:

  • システム全体の一般ペーストボード:これは任意のアプリケーションとデータを共有するために使用され、iOS 10以降で利用可能になったデータのデバイス再起動やアプリのアンインストールを超えた永続化機能が設計されています。

  • カスタム/名前付きペーストボード:これらは、アプリ内または同じチームIDを共有する別のアプリとのデータ共有のために特に設計されており、これらはiOS 10で導入された変更に従い、作成したアプリケーションプロセスの寿命を超えて永続化されることはありません。

セキュリティに関する考慮事項は、ペーストボードを利用する際に重要な役割を果たします。たとえば:

  • ユーザーがペーストボードへのアクセス権限を管理するメカニズムはありません。

  • ペーストボードの未承認のバックグラウンド監視のリスクを軽減するため、アクセスはアプリケーションが前面にあるときに制限されています(iOS 9以降)。

  • プライバシー上の懸念から、永続的な名前付きペーストボードの使用は共有コンテナを優先しています。

  • iOS 10で導入されたUniversal Clipboard機能は、一般ペーストボードを介してデバイス間でコンテンツを共有することを可能にし、開発者がデータの有効期限を設定したり、自動コンテンツ転送を無効にしたりすることができます。

機密情報が誤ってグローバルペーストボードに保存されないようにすることが重要です。さらに、アプリケーションは、グローバルペーストボードデータの誤った操作を防ぐために設計されるべきであり、開発者は機密情報のクリップボードへのコピーを防ぐための対策を実装することが推奨されています。

静的解析

静的解析では、ソースコードまたはバイナリを検索して次のものを特定します:

  • systemwide general pasteboardの使用を特定するためのgeneralPasteboard

  • カスタムペーストボードの作成にpasteboardWithName:create:およびpasteboardWithUniqueNameを使用します。永続化が有効になっているかどうかを確認しますが、これは非推奨です。

動的解析

動的解析には、特定のメソッドのフックやトレースが含まれます:

  • システム全体の使用のためにgeneralPasteboardを監視します。

  • カスタム実装のためにpasteboardWithName:create:およびpasteboardWithUniqueNameをトレースします。

  • 永続化設定を確認するために非推奨のsetPersistent:メソッド呼び出しを観察します。

監視する主な詳細には次のものがあります:

  • ペーストボードの名前内容(たとえば、文字列、URL、画像のチェック)。

  • 標準およびカスタムデータ型のチェックを活用して、存在するアイテムの数データ型を確認します。

  • setItems:options:メソッドを検査して、有効期限ローカル専用オプションを確認します。

objectionのペーストボードモニターの使用例として、generalPasteboardを5秒ごとに監視して変更を出力するツールがあります。

以下は、objectionのアプローチに触発された、ペーストボードからの変更を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);

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

Last updated