iOS Universal Links

Reading time: 7 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Wprowadzenie

Universal links oferują bezproblemowe przekierowanie użytkowników, otwierając treści bezpośrednio w aplikacji, omijając potrzebę przekierowania do Safari. Te linki są unikalne i bezpieczne, ponieważ nie mogą być przejmowane przez inne aplikacje. Zapewnia to umieszczenie pliku apple-app-site-association w głównym katalogu witryny, co ustanawia weryfikowalny link między witryną a aplikacją. W przypadkach, gdy aplikacja nie jest zainstalowana, Safari przejmuje kontrolę i kieruje użytkownika na stronę internetową, utrzymując obecność aplikacji.

Dla testerów penetracyjnych plik apple-app-site-association jest szczególnie interesujący, ponieważ może ujawniać wrażliwe ścieżki, potencjalnie w tym te związane z niewydanymi funkcjami.

Analiza uprawnienia Associated Domains

Programiści włączają Universal Links, konfigurując Associated Domains w zakładce Capabilities w Xcode lub przeglądając plik .entitlements. Każda domena jest poprzedzona applinks:. Na przykład, konfiguracja Telegrama może wyglądać następująco:

xml
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>

Aby uzyskać bardziej szczegółowe informacje, zapoznaj się z archiwalną dokumentacją dewelopera Apple.

Jeśli pracujesz z skompilowaną aplikacją, uprawnienia można wyodrębnić zgodnie z tym przewodnikiem.

Pobieranie pliku Apple App Site Association

Plik apple-app-site-association powinien być pobrany z serwera przy użyciu domen określonych w uprawnieniach. Upewnij się, że plik jest dostępny przez HTTPS bezpośrednio pod adresem https://<domain>/apple-app-site-association (lub /.well-known/apple-app-site-association). Narzędzia takie jak Apple App Site Association (AASA) Validator mogą pomóc w tym procesie.

Szybka enumeracja z powłoki macOS/Linux

# zakładając, że wyodrębniłeś uprawnienia do 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 "[+] Pobieranie AASA dla $d";
  curl -sk "https://$d/.well-known/apple-app-site-association" | jq '.'
done

Obsługa linków uniwersalnych w aplikacji

Aplikacja musi zaimplementować określone metody, aby poprawnie obsługiwać linki uniwersalne. Główną metodą, na którą należy zwrócić uwagę, jest application:continueUserActivity:restorationHandler:. Ważne jest, aby schemat obsługiwanych adresów URL był HTTP lub HTTPS, ponieważ inne nie będą wspierane.

Walidacja metody obsługi danych

Gdy link uniwersalny otwiera aplikację, obiekt NSUserActivity jest przekazywany do aplikacji z adresem URL. Przed przetworzeniem tego adresu URL ważne jest, aby go zwalidować i oczyścić, aby zapobiec zagrożeniom bezpieczeństwa. Oto przykład w Swift, który ilustruje ten proces:

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
}

URL-e powinny być starannie analizowane i walidowane, szczególnie jeśli zawierają parametry, aby chronić przed potencjalnym fałszowaniem lub źle sformatowanymi danymi. API NSURLComponents jest przydatne w tym celu, jak pokazano poniżej:

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.

Common Vulnerabilities & Pentesting Checks

#WeaknessHow to testExploitation / Impact
1Zbyt szerokie paths / components w pliku AASA (np. "/": "*" lub znaki wieloznaczne takie jak "/a/*").• Sprawdź pobrany AASA i poszukaj *, ukośników na końcu lub reguł {"?": …}.
• Spróbuj zażądać nieznanych zasobów, które nadal pasują do reguły (https://domain.com/a/evil?_p_dp=1).
Przechwytywanie linków uniwersalnych: złośliwa aplikacja iOS, która rejestruje tę samą domenę, może przejąć wszystkie te linki i wyświetlić interfejs phishingowy. Przykładem z życia jest raport o bug-bounty z maja 2025 roku dotyczący Temu.com, gdzie atakujący mógł przekierować dowolną ścieżkę /a/* do swojej aplikacji.
2Brak walidacji po stronie serwera ścieżek deep-link.Po zidentyfikowaniu dozwolonych ścieżek, wydaj żądania curl/Burp do nieistniejących zasobów i obserwuj kody statusu HTTP. Wszystko inne niż 404 (np. 200/302) jest podejrzane.Atakujący może hostować dowolne treści za dozwoloną ścieżką i serwować je przez legalną domenę, zwiększając wskaźnik sukcesu phishingu lub kradzieży tokenów sesji.
3Obsługa URL po stronie aplikacji bez białej listy schematów/gospodarzy (CVE-2024-10474 – Mozilla Focus < 132).Szukaj bezpośrednich wywołań openURL:/open(_:options:) lub mostków JavaScript, które przekazują dowolne URL.Strony wewnętrzne mogą przemycać URL myapp:// lub https://, które omijają kontrole bezpieczeństwa paska adresu przeglądarki, prowadząc do oszustw lub niezamierzonych działań z uprawnieniami.
4Użycie subdomen wieloznacznych (*.example.com) w uprawnieniach.grep dla *. w uprawnieniach.Jeśli jakakolwiek subdomena zostanie przejęta (np. przez nieużywaną wiązkę S3), atakujący automatycznie zyskuje powiązanie z linkiem uniwersalnym.

Quick Checklist

  • Wyodrębnij uprawnienia i wymień każdy wpis applinks:.
  • Pobierz AASA dla każdego wpisu i sprawdź pod kątem znaków wieloznacznych.
  • Zweryfikuj, że serwer internetowy zwraca 404 dla nieokreślonych ścieżek.
  • W binarnym potwierdź, że tylko zaufane hosty/schematy są obsługiwane.
  • Jeśli aplikacja używa nowszej składni components (iOS 11+), fuzzuj reguły parametrów zapytania ({"?":{…}}).

Tools

  • GetUniversal.link: Pomaga uprościć testowanie i zarządzanie linkami uniwersalnymi oraz plikiem AASA Twojej aplikacji. Wystarczy wpisać swoją domenę, aby zweryfikować integralność pliku AASA lub skorzystać z niestandardowego pulpitu nawigacyjnego, aby łatwo testować zachowanie linków. To narzędzie pomaga również określić, kiedy Apple ponownie zindeksuje Twój plik AASA.
  • Knil: Narzędzie iOS typu open-source, które pobiera, analizuje i pozwala na testowanie dotykowe każdego linku uniwersalnego zadeklarowanego przez domenę bezpośrednio na urządzeniu.
  • universal-link-validator: Walidator CLI / webowy, który przeprowadza ścisłe kontrole zgodności AASA i podkreśla niebezpieczne znaki wieloznaczne.

References

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks