tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

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秒ごとに読み取り、ログに記録します:

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)

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする