iOS Custom URI Handlers / Deeplinks / Custom Schemes

Reading time: 7 minutes

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をサポートする

基本情報

カスタム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に制限され、アプリの列挙を防ぐことでプライバシーが向上します。

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

URL処理と検証のテスト

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

swift
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の操作によって示されます。

bash
$ 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スキームのハイジャック

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

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

参考文献

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をサポートする