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

16 KiB
Raw Blame History

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

カスタムURLスキームは、アプリがカスタムプロトコルを介して通信することを可能にします。アプリはスキームを宣言し、それらのスキームを使用する着信URLを処理する必要があります。

URLスキームは、アプリへの潜在的な攻撃経路を提供するため、すべてのURLパラメータを検証し、形式が正しくないURLを破棄するようにしてください。さらに、ユーザーのデータを危険にさらすことのない利用可能なアクションを制限してください。

例えば、URI myapp://hostname?data=123876123 は、スキーム mydata を登録しているアプリケーション(mydata というアプリケーション)の、hostname に関連するアクションを呼び出し、値が 123876123パラメータ data を送信します。

脆弱な例として、2010年に発見されたSkype Mobileアプリの次のバグがあります。Skypeアプリは skype:// プロトコルハンドラを登録しており、他のアプリが他のSkypeユーザーや電話番号に対して通話をトリガーできるようにしていました。残念ながら、Skypeは通話を行う前にユーザーに許可を求めることなく、任意の番号に電話をかけることができました。攻撃者は、不可視の <iframe src="skype://xxx?call"></iframe>xxx はプレミアム番号に置き換えられるを設置することで、誤って悪意のあるウェブサイトを訪れたSkypeユーザーはプレミアム番号に電話をかけてしまいました。

アプリケーションが登録したスキームは、アプリの Info.plist ファイルで CFBundleURLTypes を検索することで見つけることができます(iGoat-Swiftの例)。

<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:を呼び出して、対象のアプリが利用可能かどうかを確認できます。ただし、このメソッドは、悪意のあるアプリによるインストールされたアプリの列挙の手段として使用されていたため、iOS 9.0以降では、それに渡されるURLスキームも宣言する必要があります。これは、アプリのInfo.plistファイルにLSApplicationQueriesSchemesキーと最大50個のURLスキームの配列を追加することで行います。

<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::リソースがどのように開かれているか、つまりデータがどのように解析されているかを確認します。特に呼び出し元アプリケーション(sourceApplicationによるアクセスが許可または拒否されるかどうかを確認します。カスタムURLスキームを使用する場合、アプリはユーザーの許可も必要とする場合があります。

Telegramでは、4つの異なるメソッドが使用されています

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:メソッドと非推奨のUIApplicationopenURL:メソッドは、URLを開く責任を持っています(つまり、他のアプリにリクエストを送信/クエリを作成するためのURL。これは、現在のアプリにローカルな場合もあれば、別のアプリによって提供される必要がある場合もあります。元のソースコードがある場合は、これらのメソッドの使用法を直接検索できます。

さらに、特定のサービスやアプリをクエリしているかどうか、そしてアプリがよく知られている場合は、オンラインで一般的なURLスキームを検索し、**grepiOSアプリスキームのリスト**に含めることもできます。iOSアプリのURLスキーム名とパスの常に更新されたリストを参照してください。

egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/
egrep -nr "openURL\(" ./Telegram-iOS/
egrep -nr "mt-encrypted-file://" ./Telegram-iOS/
egrep -nr "://" ./Telegram-iOS/

廃止予定のメソッドのテスト

以下のような廃止予定のメソッドを検索します:

例えば、以下の3つが見つかります:

$ 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:
  • IDBを起動し、デバイスに接続し、対象のアプリを選択します。詳細はIDBのドキュメントを参照してください。
  • URL Handlersセクションに移動します。URL schemesで、Refreshをクリックすると、テスト対象のアプリで定義されているすべてのカスタムスキームのリストが左側に表示されます。これらのスキームは、右側のOpenをクリックして読み込むことができます。単に空のURIスキームたとえば、myURLscheme://を開くことで、隠された機能(たとえば、デバッグウィンドウ)を発見したり、ローカル認証をバイパスしたりすることができます。
  • Frida:

URLスキームを単純に開きたい場合は、Fridaを使用して次のように行うことができます:

$ 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の例では、作者は非公開のAPI LSApplicationWorkspace.openSensitiveURL:withOptions: を使用してURLを開きますSpringBoardアプリから:

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を使用してopenURLを呼び出すことができます。そのファズツールは以下のことを行う必要があります:

  • ペイロードを生成する。
  • それぞれのペイロードに対してopenURLを呼び出す。
  • アプリが/private/var/mobile/Library/Logs/CrashReporterにクラッシュレポート(.ips)を生成するかどうかを確認する。

FuzzDBプロジェクトは、ペイロードとして使用できるファジング辞書を提供しています。

Fridaを使用したファジング

Fridaを使用してこれを行うのは非常に簡単です。このブログ記事を参照して、iOS 11.1.2で動作するiGoat-Swiftアプリをファジングする例をご覧ください。

ファズツールを実行する前に、入力としてURLスキームが必要です。静的解析から、iGoat-Swiftアプリが以下のURLスキームとパラメータをサポートしていることがわかっています: iGoat://?contactNumber={0}&message={0}.

$ 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" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥