# iOS Universal Links
{{#include ../../banners/hacktricks-training.md}}
## Introduction
ユニバーサルリンクは、ユーザーに**シームレスなリダイレクション**体験を提供し、Safariのリダイレクションをバイパスしてアプリ内のコンテンツを直接開きます。これらのリンクは**ユニーク**で安全であり、他のアプリによって主張されることはありません。これは、ウェブサイトのルートディレクトリに`apple-app-site-association` JSONファイルをホスティングすることで保証され、ウェブサイトとアプリの間に検証可能なリンクが確立されます。アプリがインストールされていない場合、Safariが引き継ぎ、ユーザーをウェブページに誘導し、アプリの存在を維持します。
ペネトレーションテスターにとって、`apple-app-site-association`ファイルは特に興味深いものであり、**機密パス**を明らかにする可能性があり、未発表の機能に関連するものが含まれることもあります。
### **関連ドメイン権限の分析**
開発者は、XcodeのCapabilitiesタブで**関連ドメイン**を設定するか、`.entitlements`ファイルを検査することでユニバーサルリンクを有効にします。各ドメインは`applinks:`で始まります。例えば、Telegramの設定は次のように表示されるかもしれません:
```xml
com.apple.developer.associated-domains
applinks:telegram.me
applinks:t.me
```
より包括的な洞察については、[アーカイブされたApple Developer Documentation](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2)を参照してください。
コンパイルされたアプリケーションを使用している場合、[このガイド](extracting-entitlements-from-compiled-application.md)に従って権限を抽出できます。
### **Apple App Site Associationファイルの取得**
`apple-app-site-association`ファイルは、権限に指定されたドメインを使用してサーバーから取得する必要があります。このファイルは、`https:///apple-app-site-association`でHTTPS経由で直接アクセスできることを確認してください。[Apple App Site Association (AASA) Validator](https://branch.io/resources/aasa-validator/)のようなツールがこのプロセスを支援できます。
### **アプリ内のユニバーサルリンクの処理**
アプリは、ユニバーサルリンクを正しく処理するために特定のメソッドを実装する必要があります。探すべき主なメソッドは[`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application)です。処理されるURLのスキームはHTTPまたはHTTPSであることが重要であり、他のスキームはサポートされません。
#### **データハンドラーメソッドの検証**
ユニバーサルリンクがアプリを開くと、`NSUserActivity`オブジェクトがURLと共にアプリに渡されます。このURLを処理する前に、セキュリティリスクを防ぐために検証およびサニタイズすることが重要です。以下は、プロセスを示すSwiftの例です:
```swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// Check for web browsing activity and valid URL
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
application.open(url, options: [:], completionHandler: nil)
}
return true
}
```
URLsは慎重に解析され、検証されるべきです。特にパラメータが含まれている場合、潜在的なスプーフィングや不正なデータから守るためです。`NSURLComponents` APIはこの目的に役立ちます。以下に示します:
```swift
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 {
// Process the URL with album name and photo index
return true
} else {
// Handle invalid or missing parameters
return false
}
}
```
開発者は、**勤勉な構成と検証**を通じて、ユニバーサルリンクがユーザーエクスペリエンスを向上させると同時に、セキュリティとプライバシー基準を維持することを確実にできます。
## ツール
- [GetUniversal.link](https://getuniversal.link/): アプリのユニバーサルリンクとAASAファイルのテストと管理を簡素化するのに役立ちます。ドメインを入力するだけでAASAファイルの整合性を確認したり、カスタムダッシュボードを使用してリンクの動作を簡単にテストできます。このツールは、Appleが次にAASAファイルをインデックスする時期を判断するのにも役立ちます。
## 参考文献
- [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0070/#static-analysis](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0070/#static-analysis)
- [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8)
{{#include ../../banners/hacktricks-training.md}}