hacktricks/mobile-pentesting/ios-pentesting/ios-universal-links.md
2023-07-07 23:42:27 +00:00

11 KiB
Raw Blame History

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

ユニバーサルリンクは、ユーザーをSafariを経由せずにアプリに直接リダイレクトすることができます。
ユニバーサルリンクは一意であり、他のアプリによってクレームされることはありません。これは、ウェブサイトとアプリが関連していることを確認するために、所有者がファイルをアップロードしたウェブサイトの標準的なHTTP(S)リンクを使用します。
これらのリンクはHTTP(S)スキームを使用しているため、アプリがインストールされていない場合、Safariがリンクを開き、ユーザーをページにリダイレクトします。これにより、アプリがインストールされていなくてもアプリと通信することができます

ユニバーサルリンクを作成するには、詳細を含むJSONファイルであるapple-app-site-associationというファイルを作成する必要があります。その後、このファイルをウェブサーバーのルートディレクトリにホストする必要があります(例:https://google.com/apple-app-site-association)。
ペンテスターにとって、このファイルは非常に興味深いものです。それはまだ公開されていないリリースのパスを公開することさえあります。

関連ドメインの権限を確認する

Xcodeで、Capabilitiesタブに移動し、Associated Domainsを検索します。または、.entitlementsファイルを調べてcom.apple.developer.associated-domainsを探します。各ドメインはapplinks:で始まる必要があります。例:applinks:www.mywebsite.com

Telegramの.entitlementsファイルの例です:

<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>

詳細な情報は、アーカイブされたApple Developerドキュメントで見つけることができます。

コンパイルされたアプリケーションしか持っていない場合は、次のガイドに従ってエンタイトルメントを抽出することができます:

{% content-ref url="extracting-entitlements-from-compiled-application.md" %} extracting-entitlements-from-compiled-application.md {% endcontent-ref %}

Apple App Site Associationファイルの取得

前のステップで取得した関連ドメインを使用して、サーバーからapple-app-site-associationファイルを取得してみてください。このファイルは、https://<domain>/apple-app-site-associationまたはhttps://<domain>/.well-known/apple-app-site-associationでHTTPS経由でアクセス可能である必要があります。

自分のブラウザで取得するか、Apple App Site Association (AASA) Validatorを使用することができます。

リンクレシーバーメソッドの確認

リンクを受け取り、適切に処理するためには、アプリデリゲートはapplication:continueUserActivity:restorationHandler:を実装する必要があります。元のプロジェクトがある場合は、このメソッドを検索してみてください。

なお、アプリがopenURL:options:completionHandler:を使用してアプリのウェブサイトへのユニバーサルリンクを開く場合、リンクはアプリ内で開かれません。呼び出し元がアプリから発生するため、ユニバーサルリンクとして処理されません。

  • webpageURLのスキームはHTTPまたはHTTPSである必要があります他のスキームは例外をスローするはずですURLComponents / NSURLComponentsschemeインスタンスプロパティを使用して、これを確認できます。

データハンドラーメソッドの確認

iOSがユニバーサルリンクの結果としてアプリを開くと、アプリはNSUserActivityTypeBrowsingWebというactivityType値を持つNSUserActivityオブジェクトを受け取ります。アクティビティオブジェクトのwebpageURLプロパティには、ユーザーがアクセスするHTTPまたはHTTPSのURLが含まれています。以下のSwiftの例では、URLを開く前にこれを正確に検証しています:

func application(_ application: UIApplication, continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// ...
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
application.open(url, options: [:], completionHandler: nil)
}

return true
}

さらに、URLにパラメータが含まれている場合は、信頼されたドメインからであっても、慎重にサニタイズおよび検証する必要があります。たとえば、それらは攻撃者によって改ざんされた可能性があるか、不正なデータが含まれている可能性があります。その場合、URL全体およびしたがってユニバーサルリンクのリクエスト全体を破棄する必要があります。

NSURLComponents APIは、URLのコンポーネントを解析および操作するために使用できます。これは、application:continueUserActivity:restorationHandler:メソッド自体の一部として行われる場合もありますし、それを呼び出す別のメソッドで行われる場合もあります。次のは、これを示しています。

func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL,
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
let path = components.path,
let params = components.queryItems else {
return false
}

if let albumName = params.first(where: { $0.name == "albumname" })?.value,
let photoIndex = params.first(where: { $0.name == "index" })?.value {
// Interact with album name and photo index

return true

} else {
// Handle when album and/or album name or photo index missing

return false
}
}

参考文献

{% 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 🎥