hacktricks/mobile-pentesting/ios-pentesting/ios-custom-uri-handlers-deeplinks-custom-schemes.md
2023-07-07 23:42:27 +00:00

198 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
- [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください**。
</details>
カスタムURLスキームは、アプリがカスタムプロトコルを介して通信することを可能にします。アプリはスキームを宣言し、それらのスキームを使用する着信URLを処理する必要があります。
> URLスキームは、アプリへの潜在的な攻撃経路を提供するため、**すべてのURLパラメータを検証**し、**形式が正しくないURLを破棄**するようにしてください。さらに、ユーザーのデータを危険にさらすことのない**利用可能なアクションを制限**してください。
例えば、URI `myapp://hostname?data=123876123` は、スキーム `mydata` を登録しているアプリケーション(`mydata` というアプリケーション)の、`hostname` に関連する**アクション**を呼び出し、値が `123876123` の**パラメータ** `data` を送信します。
脆弱な例として、2010年に発見されたSkype Mobileアプリの次の[バグ](http://www.dhanjani.com/blog/2010/11/insecure-handling-of-url-schemes-in-apples-ios.html)があります。Skypeアプリは `skype://` プロトコルハンドラを登録しており、他のアプリが他のSkypeユーザーや電話番号に対して通話をトリガーできるようにしていました。残念ながら、Skypeは通話を行う前にユーザーに許可を求めることなく、任意の番号に電話をかけることができました。攻撃者は、不可視の `<iframe src="skype://xxx?call"></iframe>``xxx` はプレミアム番号に置き換えられるを設置することで、誤って悪意のあるウェブサイトを訪れたSkypeユーザーはプレミアム番号に電話をかけてしまいました。
アプリケーションが登録した**スキーム**は、アプリの **`Info.plist`** ファイルで **`CFBundleURLTypes`** を検索することで見つけることができます([iGoat-Swift](https://github.com/OWASP/iGoat-Swift)の例)。
```markup
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.iGoat.myCompany</string>
<key>CFBundleURLSchemes</key>
<array>
<string>iGoat</string>
</array>
</dict>
</array>
```
ただし、**悪意のあるアプリケーションは、既に登録されているURIを再登録することができます**。したがって、URIを介して**機密情報を送信している場合**myapp://hostname?password=123456、**悪意のある**アプリケーションは**機密情報を傍受**することができます。
また、これらのURIの入力は、SQLインジェクション、XSS、CSRF、パストラバーサル、または他の可能な脆弱性を悪用しようとする**悪意のある****元**から来る可能性があるため、**チェックおよびサニタイズ**する必要があります。
## アプリケーションクエリスキームの登録
アプリは[`canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc)を呼び出して、**対象のアプリが利用可能かどうか**を確認できます。ただし、このメソッドは、悪意のあるアプリによる**インストールされたアプリの列挙**の手段として使用されていたため、[iOS 9.0以降では、それに渡されるURLスキームも宣言する必要があります](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc#discussion)。これは、アプリの`Info.plist`ファイルに`LSApplicationQueriesSchemes`キーと最大50個のURLスキームの配列を追加することで行います。
```markup
<key>LSApplicationQueriesSchemes</key>
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>
```
`canOpenURL`は、適切なアプリがインストールされているかどうかに関係なく、未宣言のスキームに対して常に`NO`を返します。ただし、この制限は`canOpenURL`にのみ適用されます。
## URLハンドリングと検証のテスト
URLパスがどのように構築され、検証されるかを判断するために、元のソースコードがある場合は、次のメソッドを検索できます
* `application:didFinishLaunchingWithOptions:`メソッドまたは`application:will-FinishLaunchingWithOptions:`決定がどのように行われ、URLに関する情報がどのように取得されるかを確認します。
* [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc):リソースがどのように開かれているか、つまりデータがどのように解析されているかを確認します。特に呼び出し元アプリケーション([`sourceApplication`](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey/1623128-sourceapplication)によるアクセスが許可または拒否されるかどうかを確認します。カスタムURLスキームを使用する場合、アプリはユーザーの許可も必要とする場合があります。
Telegramでは、[4つの異なるメソッドが使用されています](https://github.com/peter-iakovlev/Telegram-iOS/blob/87e0a33ac438c1d702f2a0b75bf21f26866e346f/Telegram-iOS/AppDelegate.swift#L1250)
```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:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc)メソッドと[非推奨の`UIApplication`の`openURL:`メソッド](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc)は、**URLを開く**責任を持っています(つまり、他のアプリにリクエストを送信/クエリを作成するためのURL。これは、現在のアプリにローカルな場合もあれば、別のアプリによって提供される必要がある場合もあります。元のソースコードがある場合は、これらのメソッドの使用法を直接検索できます。
さらに、特定のサービスやアプリをクエリしているかどうか、そしてアプリがよく知られている場合は、オンラインで一般的なURLスキームを検索し、**grepiOSアプリスキームのリスト**に含めることもできます。[**iOSアプリのURLスキーム名とパスの常に更新されたリスト**](https://ios.gadgethacks.com/how-to/always-updated-list-ios-app-url-scheme-names-paths-for-shortcuts-0184033/)を参照してください。
```bash
egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/
egrep -nr "openURL\(" ./Telegram-iOS/
egrep -nr "mt-encrypted-file://" ./Telegram-iOS/
egrep -nr "://" ./Telegram-iOS/
```
## 廃止予定のメソッドのテスト
以下のような廃止予定のメソッドを検索します:
* [`application:handleOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622964-application?language=objc)
* [`openURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc)
* [`application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application)
例えば、以下の3つが見つかります:
```bash
$ rabin2 -zzq Telegram\ X.app/Telegram\ X | grep -i "openurl"
0x1000d9e90 31 30 UIApplicationOpenURLOptionsKey
0x1000dee3f 50 49 application:openURL:sourceApplication:annotation:
0x1000dee71 29 28 application:openURL:options:
0x1000dee8e 27 26 application:handleOpenURL:
0x1000df2c9 9 8 openURL:
0x1000df766 12 11 canOpenURL:
0x1000df772 35 34 openURL:options:completionHandler:
...
```
## 任意のURLの呼び出し
* **Safari**: 1つのURLスキームを素早くテストするには、SafariでURLを開き、アプリの動作を観察します。たとえば、`tel://123456789`と書くと、Safariはその番号を呼び出そうとします。
* **Notes App**: カスタムURLスキームをテストするために、書いたリンクを長押しします。開くためには編集モードを終了する必要があります。アプリがインストールされていない場合、カスタムURLスキームを含むリンクをクリックまたは長押しすることはできません。
* [**IDB**](https://github.com/facebook/idb):
* IDBを起動し、デバイスに接続し、対象のアプリを選択します。詳細は[IDBのドキュメント](https://www.idbtool.com/documentation/setup.html)を参照してください。
* **URL Handlers**セクションに移動します。**URL schemes**で、**Refresh**をクリックすると、テスト対象のアプリで定義されているすべてのカスタムスキームのリストが左側に表示されます。これらのスキームは、右側の**Open**をクリックして読み込むことができます。単に空のURIスキームたとえば、`myURLscheme://`を開くことで、隠された機能(たとえば、デバッグウィンドウ)を発見したり、ローカル認証をバイパスしたりすることができます。
* **Frida**:
URLスキームを単純に開きたい場合は、Fridaを使用して次のように行うことができます:
```javascript
$ frida -U iGoat-Swift
[iPhone::iGoat-Swift]-> function openURL(url) {
var UIApplication = ObjC.classes.UIApplication.sharedApplication();
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
return UIApplication.openURL_(toOpen);
}
[iPhone::iGoat-Swift]-> openURL("tel://234234234")
true
```
この[Frida CodeShare](https://codeshare.frida.re/@dki/ios-url-scheme-fuzzing/)の例では、作者は非公開のAPI `LSApplicationWorkspace.openSensitiveURL:withOptions:` を使用してURLを開きますSpringBoardアプリから:
```javascript
function openURL(url) {
var w = ObjC.classes.LSApplicationWorkspace.defaultWorkspace();
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
return w.openSensitiveURL_withOptions_(toOpen, null);
}
```
> 非公開のAPIの使用はApp Storeでは許可されていません。そのため、これらをテストすることはありませんが、動的解析には使用することができます。
## URLスキームのファジング
アプリがURLの一部を解析する場合、メモリの破損バグを検出するために入力ファジングを実行することもできます。
上記で学んだことを利用して、自分の選んだ言語たとえばPythonで独自のファズツールを構築し、[FridaのRPC](https://www.frida.re/docs/javascript-api/#rpc)を使用して`openURL`を呼び出すことができます。そのファズツールは以下のことを行う必要があります:
* ペイロードを生成する。
* それぞれのペイロードに対して`openURL`を呼び出す。
* アプリが`/private/var/mobile/Library/Logs/CrashReporter`にクラッシュレポート(`.ips`)を生成するかどうかを確認する。
[FuzzDB](https://github.com/fuzzdb-project/fuzzdb)プロジェクトは、ペイロードとして使用できるファジング辞書を提供しています。
## Fridaを使用したファジング
Fridaを使用してこれを行うのは非常に簡単です。[このブログ記事](https://grepharder.github.io/blog/0x03\_learning\_about\_universal\_links\_and\_fuzzing\_url\_schemes\_on\_ios\_with\_frida.html)を参照して、iOS 11.1.2で動作するiGoat-Swiftアプリをファジングする例をご覧ください。
ファズツールを実行する前に、入力としてURLスキームが必要です。静的解析から、iGoat-Swiftアプリが以下のURLスキームとパラメータをサポートしていることがわかっています: `iGoat://?contactNumber={0}&message={0}`.
```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
```
# 参考文献
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- **サイバーセキュリティ企業で働いていますか?** **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
- [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で私を**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
</details>