iOS Custom URI Handlers / Deeplinks / Custom Schemes

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 μ§€μ›ν•˜κΈ°

Basic Information

μ»€μŠ€ν…€ URL μŠ€ν‚΄μ€ 앱이 μ»€μŠ€ν…€ ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ 톡신할 수 μžˆλ„λ‘ ν•˜λ©°, μ΄λŠ” Apple Developer Documentationμ—μ„œ μžμ„Ένžˆ μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μŠ€ν‚΄μ€ μ•±μ—μ„œ μ„ μ–Έν•΄μ•Ό ν•˜λ©°, 이후 ν•΄λ‹Ή μŠ€ν‚΄μ— 따라 λ“€μ–΄μ˜€λŠ” URL을 μ²˜λ¦¬ν•©λ‹ˆλ‹€. λͺ¨λ“  URL λ§€κ°œλ³€μˆ˜λ₯Ό κ²€μ¦ν•˜κ³  ν˜•μ‹μ΄ 잘λͺ»λœ URL은 νκΈ°ν•˜λŠ” 것이 μ€‘μš”ν•˜μ—¬, 이λ₯Ό 톡해 곡격을 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

URI myapp://hostname?data=123876123κ°€ νŠΉμ • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ™μž‘μ„ ν˜ΈμΆœν•˜λŠ” μ˜ˆκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μ£Όλͺ©ν•  λ§Œν•œ 취약점은 Skype Mobile μ•±μ—μ„œ λ°œκ²¬λ˜μ—ˆμœΌλ©°, μ΄λŠ” skype:// ν”„λ‘œν† μ½œμ„ 톡해 ν—ˆκ°€λ˜μ§€ μ•Šμ€ 톡화 λ™μž‘μ„ ν—ˆμš©ν–ˆμŠ΅λ‹ˆλ‹€. λ“±λ‘λœ μŠ€ν‚΄μ€ μ•±μ˜ Info.plist의 CFBundleURLTypesμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ•…μ˜μ μΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ URIλ₯Ό μž¬λ“±λ‘ν•˜μ—¬ λ―Όκ°ν•œ 정보λ₯Ό κ°€λ‘œμ±Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

Application Query Schemes Registration

iOS 9.0λΆ€ν„°, 앱이 μ‚¬μš© κ°€λŠ₯ν•œμ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ canOpenURL:λŠ” Info.plist의 LSApplicationQueriesSchemes에 URL μŠ€ν‚΄μ„ μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” 앱이 쿼리할 수 μžˆλŠ” μŠ€ν‚΄μ„ 50개둜 μ œν•œν•˜μ—¬ μ•± μ—΄κ±°λ₯Ό λ°©μ§€ν•˜κ³  개인 정보λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.

<key>LSApplicationQueriesSchemes</key>
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>

URL 처리 및 검증 ν…ŒμŠ€νŠΈ

κ°œλ°œμžλŠ” application:didFinishLaunchingWithOptions: 및 application:openURL:options:와 같은 μ†ŒμŠ€ μ½”λ“œμ˜ νŠΉμ • λ©”μ„œλ“œλ₯Ό κ²€μ‚¬ν•˜μ—¬ URL 경둜 ꡬ성 및 검증을 이해해야 ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Telegram은 URL을 μ—¬λŠ” λ‹€μ–‘ν•œ 방법을 μ‚¬μš©ν•©λ‹ˆλ‹€:

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:와 같은 λ©”μ„œλ“œλŠ” λ‹€λ₯Έ μ•±κ³Ό μƒν˜Έμž‘μš©ν•˜κΈ° μœ„ν•΄ URL을 μ—¬λŠ” 데 μ€‘μš”ν•©λ‹ˆλ‹€. μ•±μ˜ μ†ŒμŠ€ μ½”λ“œμ—μ„œ μ΄λŸ¬ν•œ λ©”μ„œλ“œμ˜ μ‚¬μš©μ„ μ‹λ³„ν•˜λŠ” 것은 μ™ΈλΆ€ 톡신을 μ΄ν•΄ν•˜λŠ” 데 ν•΅μ‹¬μž…λ‹ˆλ‹€.

μ‚¬μš© μ€‘λ‹¨λœ λ©”μ„œλ“œ ν…ŒμŠ€νŠΈ

application:handleOpenURL: 및 openURL:와 같은 URL μ—΄κΈ°λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ‚¬μš© μ€‘λ‹¨λœ λ©”μ„œλ“œλŠ” μ‹λ³„ν•˜κ³  λ³΄μ•ˆ 영ν–₯을 κ²€ν† ν•΄μ•Ό ν•©λ‹ˆλ‹€.

URL μŠ€ν‚΄ 퍼징

URL μŠ€ν‚΄ 퍼징은 λ©”λͺ¨λ¦¬ 손상 버그λ₯Ό 식별할 수 μžˆμŠ΅λ‹ˆλ‹€. Frida와 같은 λ„κ΅¬λŠ” λ‹€μ–‘ν•œ νŽ˜μ΄λ‘œλ“œλ‘œ URL을 μ—΄μ–΄ μΆ©λŒμ„ λͺ¨λ‹ˆν„°λ§ν•˜μ—¬ 이 과정을 μžλ™ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” iGoat-Swift μ•±μ—μ„œ URL μ‘°μž‘μ˜ 예둜 μ„€λͺ…λ©λ‹ˆλ‹€:

$ 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

μ»€μŠ€ν…€ URL μŠ€ν‚΄ ν•˜μ΄μž¬ν‚Ή

이 κ²Œμ‹œλ¬Όμ— λ”°λ₯΄λ©΄, μ•…μ„± 앱은 λ‹€λ₯Έ μ•±μ˜ μ»€μŠ€ν…€ μŠ€ν‚΄μ„ 등둝할 수 있으며, 그러면 μ•…μ„± 앱은 ASWebAuthenticationSession을 μ‚¬μš©ν•˜μ—¬ Safari μ•±μ˜ λͺ¨λ“  μΏ ν‚€κ°€ μžˆλŠ” λΈŒλΌμš°μ €λ₯Ό μ—΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•…μ„± 앱은 λΈŒλΌμš°μ €λ₯Ό 톡해 κ³΅κ²©μžκ°€ μ œμ–΄ν•˜λŠ” μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‘œλ“œν•  수 있으며, TCCλŠ” λͺ¨λ°”일 μ‚¬μš©μžμ—κ²Œ ν•΄λ‹Ή 앱을 μ—΄κΈ° μœ„ν•œ κΆŒν•œμ„ μš”μ²­ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ, μ•…μ„± μ›Ή νŽ˜μ΄μ§€λŠ” ν”Όν•΄μž νŽ˜μ΄μ§€λ‘œ λ¦¬λ””λ ‰μ…˜ν•  수 있으며, 예λ₯Ό λ“€μ–΄ prompt=none λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§„ OAuth νλ¦„μœΌλ‘œ λ¦¬λ””λ ‰μ…˜λ©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 이미 OAuth 흐름에 λ‘œκ·ΈμΈν•œ 경우, OAuth 흐름은 ν”Όν•΄μž μ•±μ˜ μ»€μŠ€ν…€ μŠ€ν‚΄μ„ μ‚¬μš©ν•˜μ—¬ 비밀을 ν”Όν•΄μž μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ λ‹€μ‹œ λ³΄λƒ…λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ μ•…μ„± 앱도 이λ₯Ό λ“±λ‘ν–ˆκΈ° λ•Œλ¬Έμ—, μ‚¬μš©λœ λΈŒλΌμš°μ €κ°€ μ•…μ„± μ•± 내에 있기 λ•Œλ¬Έμ—, 이 경우 μ»€μŠ€ν…€ μŠ€ν‚΄μ€ μ•…μ„± 앱에 μ˜ν•΄ μ²˜λ¦¬λ˜μ–΄ OAuth 토큰을 ν›”μΉ  수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έμ‘°

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 μ§€μ›ν•˜κΈ°