iOS Universal Links
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
Introduction
Universal linksλ μ¬μ©μκ° Safari 리λλ μ
μμ΄ μ±μμ μ§μ μ½ν
μΈ λ₯Ό μ΄ μ μλλ‘ νλ λ§€λλ¬μ΄ 리λλ μ
κ²½νμ μ 곡ν©λλ€. μ΄λ¬ν λ§ν¬λ κ³ μ νκ³ μμ νμ¬ λ€λ₯Έ μ±μ΄ μ£Όμ₯ν μ μμ΅λλ€. μ΄λ μΉμ¬μ΄νΈμ λ£¨νΈ λλ ν 리μ apple-app-site-association JSON νμΌμ νΈμ€ν
ν¨μΌλ‘μ¨ λ³΄μ₯λλ©°, μΉμ¬μ΄νΈμ μ± κ°μ κ²μ¦ κ°λ₯ν λ§ν¬λ₯Ό μ€μ ν©λλ€. μ±μ΄ μ€μΉλμ§ μμ κ²½μ°, Safariκ° μ¬μ©μμκ² μΉνμ΄μ§λ‘ μλ΄νμ¬ μ±μ μ‘΄μ¬λ₯Ό μ μ§ν©λλ€.
μΉ¨ν¬ ν
μ€ν°μκ² apple-app-site-association νμΌμ λ―Όκ°ν κ²½λ‘λ₯Ό λλ¬λΌ μ μκΈ° λλ¬Έμ νΉν κ΄μ¬μ΄ μμ΅λλ€. μ¬κΈ°μλ μΆμλμ§ μμ κΈ°λ₯κ³Ό κ΄λ ¨λ κ²½λ‘κ° ν¬ν¨λ μ μμ΅λλ€.
Associated Domains Entitlement λΆμνκΈ°
κ°λ°μλ Xcodeμ Capabilities νμμ Associated Domainsλ₯Ό ꡬμ±νκ±°λ .entitlements νμΌμ κ²μ¬νμ¬ Universal Linksλ₯Ό νμ±νν©λλ€. κ° λλ©μΈμ applinks:λ‘ μ λμ¬κ° λΆμ΅λλ€. μλ₯Ό λ€μ΄, Telegramμ ꡬμ±μ λ€μκ³Ό κ°μ΄ λνλ μ μμ΅λλ€:
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>
λ ν¬κ΄μ μΈ ν΅μ°°λ ₯μ μνμλ©΄ 보κ΄λ Apple Developer Documentationμ μ°Έμ‘°νμΈμ.
μ»΄νμΌλ μ ν리μΌμ΄μ μ μ¬μ©νλ κ²½μ°, μ΄ κ°μ΄λμ μ€λͺ λ λλ‘ κΆνμ μΆμΆν μ μμ΅λλ€.
Apple App Site Association νμΌ κ°μ Έμ€κΈ°
apple-app-site-association νμΌμ κΆνμ μ§μ λ λλ©μΈμ μ¬μ©νμ¬ μλ²μμ κ°μ ΈμμΌ ν©λλ€. νμΌμ΄ https://<domain>/apple-app-site-association (λλ /.well-known/apple-app-site-association)μμ HTTPSλ₯Ό ν΅ν΄ μ§μ μ κ·Ό κ°λ₯ν΄μΌ ν©λλ€. Apple App Site Association (AASA) Validatorμ κ°μ λκ΅¬κ° μ΄ κ³Όμ μ λμμ΄ λ μ μμ΅λλ€.
macOS/Linux μ Έμμμ λΉ λ₯Έ μ΄κ±°
# ent.xmlμ κΆνμ μΆμΆνλ€κ³ κ°μ doms=$(plutil -extract com.apple.developer.associated-domains xml1 -o - ent.xml | \ grep -oE 'applinks:[^<]+' | cut -d':' -f2) for d in $doms; do echo "[+] $dμ λν AASA κ°μ Έμ€λ μ€"; curl -sk "https://$d/.well-known/apple-app-site-association" | jq '.' done
μ±μμμ μ λλ²μ€ λ§ν¬ μ²λ¦¬
μ±μ μ λλ²μ€ λ§ν¬λ₯Ό μ¬λ°λ₯΄κ² μ²λ¦¬νκΈ° μν΄ νΉμ λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€. μ°ΎμμΌ ν μ£Όμ λ©μλλ application:continueUserActivity:restorationHandler:μ
λλ€. μ²λ¦¬λλ URLμ μ€ν΄μ΄ HTTP λλ HTTPSμ¬μΌ νλ©°, λ€λ₯Έ μ€ν΄μ μ§μλμ§ μμ΅λλ€.
λ°μ΄ν° νΈλ€λ¬ λ©μλ κ²μ¦
μ λλ²μ€ λ§ν¬κ° μ±μ μ΄λ©΄, NSUserActivity κ°μ²΄κ° URLκ³Ό ν¨κ» μ±μ μ λ¬λ©λλ€. μ΄ URLμ μ²λ¦¬νκΈ° μ μ 보μ μνμ λ°©μ§νκΈ° μν΄ μ΄λ₯Ό κ²μ¦νκ³ μ 리νλ κ²μ΄ μ€μν©λλ€. λ€μμ μ΄ κ³Όμ μ 보μ¬μ£Όλ 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λ μ΄λ₯Ό μν΄ μ μ©νλ©°, μλμ μ€λͺ
λμ΄ μμ΅λλ€:
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
}
}
λΆμ§λ°ν κ΅¬μ± λ° κ²μ¦μ ν΅ν΄ κ°λ°μλ μ λλ²μ€ λ§ν¬κ° μ¬μ©μ κ²½νμ ν₯μμν€λ©΄μ 보μ λ° κ°μΈ μ 보 λ³΄νΈ κΈ°μ€μ μ μ§νλλ‘ ν μ μμ΅λλ€.
μΌλ°μ μΈ μ·¨μ½μ λ° νν μ€ν μ κ²
| # | μ½μ | ν μ€νΈ λ°©λ² | μ μ© / μν₯ |
|---|---|---|---|
| 1 | AASA νμΌμ κ³Όλν paths / components (μ: "/": "*" λλ "/a/*"μ κ°μ μμΌλμΉ΄λ). | β’ λ€μ΄λ‘λν AASAλ₯Ό κ²μ¬νκ³ *, νν μ¬λμ λλ {"?": β¦} κ·μΉμ μ°Ύμ΅λλ€.β’ μ¬μ ν κ·μΉκ³Ό μΌμΉνλ μλ €μ§μ§ μμ 리μμ€λ₯Ό μμ²ν΄ 보μΈμ ( https://domain.com/a/evil?_p_dp=1). | μ λλ²μ€ λ§ν¬ νμ΄μ¬νΉ: λμΌν λλ©μΈμ λ±λ‘ν μ
μ± iOS μ±μ΄ μ΄λ¬ν λ§ν¬λ₯Ό μ£Όμ₯νκ³ νΌμ± UIλ₯Ό νμν μ μμ΅λλ€. μ€μ μ¬λ‘λ‘λ 2025λ
5μ Temu.com λ²κ·Έ λ°μ΄ν° λ³΄κ³ μμμ 곡격μκ° /a/* κ²½λ‘λ₯Ό μμ μ μ±μΌλ‘ 리λλ μ
ν μ μμμ΅λλ€. |
| 2 | λ₯ λ§ν¬ κ²½λ‘μ λν μλ² μΈ‘ κ²μ¦ λλ½. | νμ©λ κ²½λ‘λ₯Ό μλ³ν ν, μ‘΄μ¬νμ§ μλ 리μμ€μ λν΄ curl/Burp μμ²μ λ°ννκ³ HTTP μν μ½λλ₯Ό κ΄μ°°ν©λλ€. 404 μ΄μΈμ λͺ¨λ κ²(μ: 200/302)μ μμ¬μ€λ½μ΅λλ€. | 곡격μλ νμ©λ κ²½λ‘ λ€μ μμμ μ½ν μΈ λ₯Ό νΈμ€ν νκ³ μ΄λ₯Ό ν©λ²μ μΈ λλ©μΈμ ν΅ν΄ μ 곡νμ¬ νΌμ± λλ μΈμ ν ν° λλμ μ±κ³΅λ₯ μ λμΌ μ μμ΅λλ€. |
| 3 | μ€ν΄/νΈμ€νΈ νμ΄νΈλ¦¬μ€νΈ μμ΄ μ± μΈ‘ URL μ²λ¦¬ (CVE-2024-10474 β Mozilla Focus < 132). | μ§μ openURL:/open(_:options:) νΈμΆ λλ μμμ URLμ μ λ¬νλ JavaScript λΈλ¦¬μ§λ₯Ό μ°Ύμ΅λλ€. | λ΄λΆ νμ΄μ§λ λΈλΌμ°μ μ URL λ° μμ κ²μ¬λ₯Ό μ°ννλ myapp:// λλ https:// URLμ λ°λ°μ
ν μ μμ΄ μ€νΈν λλ μλνμ§ μμ κΆν μλ μμ
μΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. |
| 4 | κΆνμμ μμΌλμΉ΄λ μλΈλλ©μΈ μ¬μ© (*.example.com). | κΆνμμ *.λ₯Ό grepν©λλ€. | μλΈλλ©μΈμ΄ μΈμλλ©΄(μ: μ¬μ©λμ§ μλ S3 λ²ν·μ ν΅ν΄) 곡격μλ μλμΌλ‘ μ λλ²μ€ λ§ν¬ λ°μΈλ©μ νλν©λλ€. |
λΉ λ₯Έ 체ν¬λ¦¬μ€νΈ
- κΆνμ μΆμΆνκ³ λͺ¨λ
applinks:νλͺ©μ λμ΄ν©λλ€. - κ° νλͺ©μ λν΄ AASAλ₯Ό λ€μ΄λ‘λνκ³ μμΌλμΉ΄λλ₯Ό κ°μ¬ν©λλ€.
- μΉ μλ²κ° μ μλμ§ μμ κ²½λ‘μ λν΄ 404λ₯Ό λ°ννλμ§ νμΈν©λλ€.
- λ°μ΄λ리μμ μ€μ§ μ λ’°ν μ μλ νΈμ€νΈ/μ€ν΄λ§ μ²λ¦¬λλμ§ νμΈν©λλ€.
- μ±μ΄ μλ‘μ΄
componentsꡬ문(iOS 11+)μ μ¬μ©νλ κ²½μ° μΏΌλ¦¬ λ§€κ°λ³μ κ·μΉ({"?":{β¦}})μ νΌμ¦ν©λλ€.
λꡬ
- GetUniversal.link: μ±μ μ λλ²μ€ λ§ν¬ λ° AASA νμΌμ ν μ€νΈ λ° κ΄λ¦¬λ₯Ό λ¨μννλ λ° λμμ μ€λλ€. λλ©μΈμ μ λ ₯νμ¬ AASA νμΌ λ¬΄κ²°μ±μ νμΈνκ±°λ μ¬μ©μ μ μ λμ보λλ₯Ό μ¬μ©νμ¬ λ§ν¬ λμμ μ½κ² ν μ€νΈν μ μμ΅λλ€. μ΄ λꡬλ Appleμ΄ λ€μμ AASA νμΌμ μΈλ±μ±ν μκΈ°λ₯Ό κ²°μ νλ λ°λ λμμ΄ λ©λλ€.
- Knil: λλ©μ΄μ μν΄ μ μΈλ λͺ¨λ μ λλ²μ€ λ§ν¬λ₯Ό μ§μ μ₯μΉμμ κ°μ Έμ€κ³ , ꡬ문 λΆμνλ©° ν ν μ€νΈλ₯Ό ν μ μλ μ€ν μμ€ iOS μ νΈλ¦¬ν°μ λλ€.
- universal-link-validator: μ격ν AASA μ ν©μ± κ²μ¬λ₯Ό μννκ³ μνν μμΌλμΉ΄λλ₯Ό κ°μ‘°νλ CLI / μΉ κ²μ¦κΈ°μ λλ€.
μ°Έκ³ μλ£
- 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://medium.com/@m.habibgpi/universal-link-hijacking-via-misconfigured-aasa-file-on-temu-com-eadfcb745e4e
- https://nvd.nist.gov/vuln/detail/CVE-2024-10474
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


