iOS Universal Links
Reading time: 7 minutes
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
Introdução
Universal links oferecem uma experiência de redirecionamento sem interrupções para os usuários, abrindo diretamente o conteúdo no aplicativo, evitando a necessidade de redirecionamento para o Safari. Esses links são únicos e seguros, pois não podem ser reivindicados por outros aplicativos. Isso é garantido ao hospedar um arquivo JSON apple-app-site-association no diretório raiz do site, estabelecendo um link verificável entre o site e o aplicativo. Nos casos em que o aplicativo não está instalado, o Safari assume e direciona o usuário para a página da web, mantendo a presença do aplicativo.
Para testadores de penetração, o arquivo apple-app-site-association é de particular interesse, pois pode revelar caminhos sensíveis, potencialmente incluindo aqueles relacionados a recursos não lançados.
Analisando a Permissão de Domínios Associados
Desenvolvedores habilitam Universal Links configurando os Domínios Associados na aba Capabilities do Xcode ou inspecionando o arquivo .entitlements. Cada domínio é prefixado com applinks:. Por exemplo, a configuração do Telegram pode aparecer da seguinte forma:
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>
Para obter insights mais abrangentes, consulte a documentação do desenvolvedor da Apple arquivada.
Se estiver trabalhando com um aplicativo compilado, as permissões podem ser extraídas conforme descrito neste guia.
Recuperando o Arquivo de Associação do Site do Aplicativo da Apple
O arquivo apple-app-site-association deve ser recuperado do servidor usando os domínios especificados nas permissões. Certifique-se de que o arquivo esteja acessível via HTTPS diretamente em https://<domain>/apple-app-site-association (ou /.well-known/apple-app-site-association). Ferramentas como o Validador de Associação de Site de Aplicativo da Apple (AASA) podem ajudar nesse processo.
Enumeração rápida a partir de um shell macOS/Linux
# assumindo que você extraiu as permissões para 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 "[+] Buscando AASA para $d"; curl -sk "https://$d/.well-known/apple-app-site-association" | jq '.' done
Tratando Links Universais no Aplicativo
O aplicativo deve implementar métodos específicos para lidar corretamente com links universais. O método principal a ser procurado é application:continueUserActivity:restorationHandler:. É crucial que o esquema das URLs tratadas seja HTTP ou HTTPS, pois outros não serão suportados.
Validando o Método de Manipulação de Dados
Quando um link universal abre um aplicativo, um objeto NSUserActivity é passado para o aplicativo com a URL. Antes de processar essa URL, é essencial validá-la e sanitizá-la para evitar riscos de segurança. Aqui está um exemplo em Swift que demonstra o processo:
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
}
As URLs devem ser cuidadosamente analisadas e validadas, especialmente se incluírem parâmetros, para se proteger contra possíveis falsificações ou dados malformados. A API NSURLComponents é útil para esse propósito, como demonstrado abaixo:
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
}
}
Através de configuração e validação diligentes, os desenvolvedores podem garantir que os links universais melhorem a experiência do usuário enquanto mantêm padrões de segurança e privacidade.
Vulnerabilidades Comuns & Verificações de Pentesting
| # | Fraqueza | Como testar | Exploração / Impacto | 
|---|---|---|---|
| 1 | paths / components excessivamente amplos no arquivo AASA (por exemplo, "/": "*" ou curingas como "/a/*"). | • Inspecione o AASA baixado e procure por *, barras finais ou regras {"?": …}.• Tente solicitar recursos desconhecidos que ainda correspondam à regra ( https://domain.com/a/evil?_p_dp=1). | Sequestro de link universal: um aplicativo iOS malicioso que registra o mesmo domínio poderia reivindicar todos esses links e apresentar uma interface de phishing. Um exemplo do mundo real é o relatório de bug-bounty da Temu.com de maio de 2025, onde um atacante poderia redirecionar qualquer caminho /a/* para seu próprio aplicativo. | 
| 2 | Validação do lado do servidor ausente dos caminhos de deep-link. | Após identificar os caminhos permitidos, emita solicitações curl/Burp para recursos inexistentes e observe os códigos de status HTTP. Qualquer coisa diferente de 404 (por exemplo, 200/302) é suspeita. | Um atacante pode hospedar conteúdo arbitrário atrás de um caminho permitido e servi-lo através do domínio legítimo, aumentando a taxa de sucesso de phishing ou roubo de token de sessão. | 
| 3 | Manipulação de URL do lado do aplicativo sem lista branca de esquema/host (CVE-2024-10474 – Mozilla Focus < 132). | Procure por chamadas diretas openURL:/open(_:options:) ou pontes JavaScript que encaminham URLs arbitrárias. | Páginas internas podem contrabandear URLs myapp:// ou https:// que ignoram as verificações de segurança da barra de URL do navegador, levando a falsificações ou ações privilegiadas não intencionais. | 
| 4 | Uso de subdomínios curingas (*.example.com) na concessão. | grep por *. nas concessões. | Se algum subdomínio for tomado (por exemplo, via um bucket S3 não utilizado), o atacante ganha automaticamente a vinculação do Link Universal. | 
Lista de Verificação Rápida
- 
Extraia concessões e enumere cada entrada 
applinks:. - Baixe o AASA para cada entrada e audite em busca de curingas.
 - Verifique se o servidor web retorna 404 para caminhos indefinidos.
 - No binário, confirme que apenas hosts/esquemas confiáveis são tratados.
 - 
Se o aplicativo usar a nova sintaxe 
components(iOS 11+), teste regras de parâmetros de consulta ({"?":{…}}). 
Ferramentas
- GetUniversal.link: Ajuda a simplificar o teste e a gestão dos Links Universais do seu aplicativo e do arquivo AASA. Basta inserir seu domínio para verificar a integridade do arquivo AASA ou usar o painel personalizado para testar facilmente o comportamento do link. Esta ferramenta também ajuda a determinar quando a Apple indexará seu arquivo AASA na próxima vez.
 - Knil: Utilitário iOS de código aberto que busca, analisa e permite que você teste cada Link Universal declarado por um domínio diretamente no dispositivo.
 - universal-link-validator: Validador CLI / web que realiza verificações rigorosas de conformidade do AASA e destaca curingas perigosos.
 
Referências
- 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
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
HackTricks