iOS Custom URI Handlers / Deeplinks / Custom Schemes

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

基本情報

カスタムURLスキームは、アプリがカスタムプロトコルを使用して通信することを可能にします。詳細はApple Developer Documentationに記載されています。これらのスキームはアプリによって宣言され、アプリはそのスキームに従って受信したURLを処理します。すべてのURLパラメータを検証し不正なURLを破棄することが重要です。このベクターを通じた攻撃を防ぐためです。

例として、URI myapp://hostname?data=123876123 が特定のアプリケーションアクションを呼び出します。注目すべき脆弱性は、Skype Mobileアプリにあり、skype://プロトコルを介して許可されていない通話アクションを可能にしました。登録されたスキームは、アプリのInfo.plistCFBundleURLTypesにあります。悪意のあるアプリケーションは、URIを再登録することで機密情報を傍受することができます。

アプリケーションクエリスキームの登録

iOS 9.0以降、アプリが利用可能かどうかを確認するために、canOpenURL:Info.plistLSApplicationQueriesSchemesにURLスキームを宣言する必要があります。これにより、アプリがクエリできるスキームは50に制限され、アプリの列挙を防ぐことでプライバシーが向上します。

<key>LSApplicationQueriesSchemes</key>
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>

URL処理と検証のテスト

開発者は、application:didFinishLaunchingWithOptions:application:openURL:options:など、URLパスの構築と検証を理解するためにソースコードの特定のメソッドを検査する必要があります。例えば、TelegramはURLを開くためにさまざまなメソッドを使用しています:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
annotation: Any) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
self.openUrl(url: url)
return true
}

他のアプリへのURLリクエストのテスト

openURL:options:completionHandler:のようなメソッドは、他のアプリと対話するためにURLを開くのに重要です。アプリのソースコード内でそのようなメソッドの使用を特定することは、外部通信を理解するための鍵です。

非推奨メソッドのテスト

application:handleOpenURL:openURL:のようなURLオープニングを扱う非推奨メソッドは、特定してセキュリティへの影響をレビューする必要があります。

URLスキームのファジング

URLスキームのファジングは、メモリ破損バグを特定できます。Fridaのようなツールは、さまざまなペイロードでURLを開いてクラッシュを監視することで、このプロセスを自動化できます。これは、iGoat-SwiftアプリでのURLの操作によって示されます:

$ frida -U SpringBoard -l ios-url-scheme-fuzzing.js
[iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}")
Watching for crashes from iGoat...
No logs were moved.
Opened URL: iGoat://?contactNumber=0&message=0

カスタムURLスキームのハイジャック

この投稿によると、悪意のあるアプリは他のアプリのカスタムスキームを登録することができ、その後、悪意のあるアプリはASWebAuthenticationSessionを使用して、Safariアプリのすべてのクッキーを持つブラウザを開くことができます。

ブラウザを使用して、悪意のあるアプリは攻撃者が制御するウェブページを読み込み、TCCはモバイルユーザーにそのアプリを開くための権限を求めます。次に、悪意のあるウェブページは、例えばprompt=noneパラメータを持つOAuthフローにリダイレクトすることができます。ユーザーがすでにOAuthフローにログインしている場合、OAuthフローは被害者アプリケーションに秘密をカスタムスキームを使用して送信します。 しかし、悪意のあるアプリもそれを登録しており、使用されるブラウザが悪意のあるアプリ内にあるため、この場合カスタムスキームは悪意のあるアプリによって処理され、OAuthトークンを盗むことが可能になります。

参考文献

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated