# iOS Universal Links
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** ЁЯТм [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** ЁЯРж [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
## Introduction
рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ **рд╕рд╣рдЬ рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди** рдЕрдиреБрднрд╡ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реАрдзреЗ рдРрдк рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдЦреЛрд▓рддреЗ рд╣реИрдВ, рд╕рдлрд╛рд░реА рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рд▓рд┐рдВрдХ **рд╡рд┐рд╢рд┐рд╖реНрдЯ** рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдРрдк рджреНрд╡рд╛рд░рд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ `apple-app-site-association` JSON рдлрд╝рд╛рдЗрд▓ рд╣реЛ, рдЬреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдФрд░ рдРрдк рдХреЗ рдмреАрдЪ рдПрдХ рд╕рддреНрдпрд╛рдкрд┐рдд рд▓рд┐рдВрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИред рдпрджрд┐ рдРрдк рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдлрд╛рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡реЗрдмрдкреЗрдЬ рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧреА, рдРрдк рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдПред
рдкреЗрдирдЯреЗрд╕реНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП, `apple-app-site-association` рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХреА рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ **рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдкрдереЛрдВ** рдХреЛ рдкреНрд░рдХрдЯ рдХрд░ рд╕рдХрддреА рд╣реИ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдкрдереЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред
### **Associated Domains Entitlement рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛**
рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдХреЛ Xcode рдХреЗ Capabilities рдЯреИрдм рдореЗрдВ **Associated Domains** рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ рдпрд╛ `.entitlements` рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдХреЗ рдЖрдЧреЗ `applinks:` рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ:
```xml
com.apple.developer.associated-domains
applinks:telegram.me
applinks:t.me
```
For more comprehensive insights, refer to the [archived Apple Developer Documentation](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
If working with a compiled application, entitlements can be extracted as outlined in [this guide](extracting-entitlements-from-compiled-application.md).
### **рдПрдкреНрдкрд▓ рдРрдк рд╕рд╛рдЗрдЯ рдПрд╕реЛрд╕рд┐рдПрд╢рди рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛**
`apple-app-site-association` рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЙрди рдбреЛрдореЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓ HTTPS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ `https:///apple-app-site-association` рдкрд░ рд╕реБрд▓рдн рд╣реИред [Apple App Site Association (AASA) Validator](https://branch.io/resources/aasa-validator/) рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
### **рдРрдк рдореЗрдВ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛**
рдРрдк рдХреЛ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рд╡рд┐рдзрд┐ [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application) рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд▓реЗ рдЧрдП URLs рдХрд╛ рд╕реНрдХреАрдо 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
}
}
```
Through **diligent configuration and validation**, developers can ensure that universal links enhance user experience while maintaining security and privacy standards.
## Tools
* [GetUniversal.link](https://getuniversal.link/): рдЖрдкрдХреА рдРрдк рдХреЗ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдФрд░ AASA рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред AASA рдлрд╝рд╛рдЗрд▓ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЕрдкрдирд╛ рдбреЛрдореЗрди рджрд░реНрдЬ рдХрд░реЗрдВ рдпрд╛ рд▓рд┐рдВрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдбреИрд╢рдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рдпрд╣ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ Apple рдЕрдЧрд▓реА рдмрд╛рд░ рдЖрдкрдХреА AASA рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрдм рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░реЗрдЧрд╛ред
## References
* [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)
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** ЁЯТм [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** ЁЯРж [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}