iOS Universal Links

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Introduzione

I link universali offrono un esperienza di reindirizzamento senza soluzione di continuità per gli utenti aprendo direttamente il contenuto nell'app, bypassando la necessità di reindirizzamento a Safari. Questi link sono unici e sicuri, poiché non possono essere rivendicati da altre app. Ciò è garantito ospitando un file JSON apple-app-site-association nella directory radice del sito web, stabilendo un collegamento verificabile tra il sito web e l'app. Nei casi in cui l'app non sia installata, Safari prenderà il controllo e dirigerà l'utente alla pagina web, mantenendo la presenza dell'app.

Per i tester di penetrazione, il file apple-app-site-association è di particolare interesse poiché potrebbe rivelare percorsi sensibili, potenzialmente inclusi quelli relativi a funzionalità non rilasciate.

Analisi del diritto ai domini associati

Gli sviluppatori abilitano i link universali configurando i Domini Associati nella scheda Capacità di Xcode o ispezionando il file .entitlements. Ogni dominio è preceduto da applinks:. Ad esempio, la configurazione di Telegram potrebbe apparire come segue:

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

Per ulteriori approfondimenti, fare riferimento alla documentazione Apple Developer archiviata.

Se si lavora con un'applicazione compilata, le autorizzazioni possono essere estratte come descritto in questa guida.

Recupero del file Apple App Site Association

Il file apple-app-site-association deve essere recuperato dal server utilizzando i domini specificati nelle autorizzazioni. Assicurarsi che il file sia accessibile tramite HTTPS direttamente a https://<domain>/apple-app-site-association (o /.well-known/apple-app-site-association). Strumenti come il Validator Apple App Site Association (AASA) possono aiutare in questo processo.

Enumerazione rapida da una shell macOS/Linux

# assumendo di aver estratto le autorizzazioni in 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 "[+] Recupero AASA per $d";
  curl -sk "https://$d/.well-known/apple-app-site-association" | jq '.'
done

L'app deve implementare metodi specifici per gestire correttamente i link universali. Il metodo principale da cercare è application:continueUserActivity:restorationHandler:. È fondamentale che lo schema degli URL gestiti sia HTTP o HTTPS, poiché altri non saranno supportati.

Validazione del metodo gestore dei dati

Quando un link universale apre un'app, un oggetto NSUserActivity viene passato all'app con l'URL. Prima di elaborare questo URL, è essenziale convalidarlo e sanificarlo per prevenire rischi per la sicurezza. Ecco un esempio in Swift che dimostra il processo:

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
}

Gli URL devono essere analizzati e convalidati con attenzione, specialmente se includono parametri, per proteggere contro potenziali spoofing o dati malformati. L'API NSURLComponents è utile a questo scopo, come dimostrato di seguito:

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

Attraverso una configurazione e validazione diligente, gli sviluppatori possono garantire che i link universali migliorino l'esperienza dell'utente mantenendo standard di sicurezza e privacy.

Vulnerabilità Comuni & Controlli di Pentesting

#VulnerabilitàCome testareSfruttamento / Impatto
1paths / components troppo ampi nel file AASA (ad es. "/": "*" o caratteri jolly come "/a/*").• Ispezionare l'AASA scaricato e cercare *, barre finali o regole {"?": …}.
• Provare a richiedere risorse sconosciute che corrispondono ancora alla regola (https://domain.com/a/evil?_p_dp=1).
Hijacking del link universale: un'app iOS malevola che registra lo stesso dominio potrebbe rivendicare tutti quei link e presentare un'interfaccia di phishing. Un esempio reale è il rapporto di bug bounty di Temu.com di maggio 2025, dove un attaccante poteva reindirizzare qualsiasi percorso /a/* alla propria app.
2Mancanza di validazione lato server dei percorsi deep-link.Dopo aver identificato i percorsi consentiti, emettere richieste curl/Burp a risorse non esistenti e osservare i codici di stato HTTP. Qualsiasi cosa diversa da 404 (ad es. 200/302) è sospetta.Un attaccante può ospitare contenuti arbitrari dietro un percorso consentito e servirli tramite il dominio legittimo, aumentando il tasso di successo di phishing o furto di token di sessione.
3Gestione degli URL lato app senza whitelist di schema/host (CVE-2024-10474 – Mozilla Focus < 132).Cercare chiamate dirette openURL:/open(_:options:) o ponti JavaScript che inoltrano URL arbitrari.Le pagine interne possono contrabbandare URL myapp:// o https:// che bypassano i controlli di sicurezza della barra degli URL del browser, portando a spoofing o azioni privilegiate non intenzionali.
4Uso di sottodomini wildcard (*.example.com) nell'entitlement.grep per *. negli entitlement.Se un sottodominio viene preso (ad es. tramite un bucket S3 non utilizzato), l'attaccante guadagna automaticamente il binding del Link Universale.

Checklist Rapida

  • Estrarre gli entitlement e enumerare ogni voce applinks:.
  • Scaricare l'AASA per ogni voce e controllare i caratteri jolly.
  • Verificare che il server web restituisca 404 per i percorsi non definiti.
  • Nel binario, confermare che siano gestiti solo host/schemi fidati.
  • Se l'app utilizza la nuova sintassi components (iOS 11+), fuzzare le regole dei parametri di query ({"?":{…}}).

Strumenti

  • GetUniversal.link: Aiuta a semplificare il testing e la gestione dei Link Universali e del file AASA della tua app. Basta inserire il tuo dominio per verificare l'integrità del file AASA o utilizzare il dashboard personalizzato per testare facilmente il comportamento dei link. Questo strumento ti aiuta anche a determinare quando Apple indicizzerà nuovamente il tuo file AASA.
  • Knil: Utility iOS open-source che recupera, analizza e ti consente di testare ogni Link Universale dichiarato da un dominio direttamente sul dispositivo.
  • universal-link-validator: Validatore CLI / web che esegue controlli rigorosi di conformità AASA e evidenzia caratteri jolly pericolosi.

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks