iOS Universal Links

Reading time: 6 minutes

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 지원하기

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의 구성은 다음과 같이 나타날 수 있습니다:

xml
<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 예제입니다:

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
}
}

부지런한 구성 및 검증을 통해 개발자는 유니버설 링크가 사용자 경험을 향상시키면서 보안 및 개인 정보 보호 기준을 유지하도록 할 수 있습니다.

일반적인 취약점 및 펜테스팅 점검

#약점테스트 방법악용 / 영향
1AASA 파일의 과도한 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 / 웹 검증기입니다.

참고자료

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 지원하기