iOS Custom URI Handlers / Deeplinks / Custom Schemes

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

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

これは関連情報からの要約です https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0075/

基本情報

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

例として、URI myapp://hostname?data=123876123 が特定のアプリケーションアクションを呼び出すとします。注目すべき脆弱性は、Skypeモバイルアプリで、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スキームのFuzzing

URLスキームのFuzzingを行うことで、メモリ破損のバグを特定することができます。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

参考文献

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

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

Last updated