iOS Universal Links
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Introducci贸n
Los enlaces universales ofrecen una experiencia de redirecci贸n fluida a los usuarios al abrir directamente el contenido en la aplicaci贸n, evitando la necesidad de redirecci贸n a Safari. Estos enlaces son 煤nicos y seguros, ya que no pueden ser reclamados por otras aplicaciones. Esto se asegura al alojar un archivo JSON apple-app-site-association
en el directorio ra铆z del sitio web, estableciendo un enlace verificable entre el sitio web y la aplicaci贸n. En casos donde la aplicaci贸n no est谩 instalada, Safari tomar谩 el control y dirigir谩 al usuario a la p谩gina web, manteniendo la presencia de la aplicaci贸n.
Para los testers de penetraci贸n, el archivo apple-app-site-association
es de particular inter茅s ya que puede revelar rutas sensibles, potencialmente incluyendo aquellas relacionadas con caracter铆sticas no lanzadas.
Analizando el Derecho de Dominios Asociados
Los desarrolladores habilitan los enlaces universales configurando los Dominios Asociados en la pesta帽a de Capacidades de Xcode o inspeccionando el archivo .entitlements
. Cada dominio est谩 precedido por applinks:
. Por ejemplo, la configuraci贸n de Telegram podr铆a aparecer de la siguiente manera:
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>
Para obtener informaci贸n m谩s completa, consulta la documentaci贸n de desarrolladores de Apple archivada.
Si trabajas con una aplicaci贸n compilada, los derechos pueden ser extra铆dos como se detalla en esta gu铆a.
Recuperando el archivo de asociaci贸n de sitios de aplicaciones de Apple
El archivo apple-app-site-association
debe ser recuperado del servidor utilizando los dominios especificados en los derechos. Aseg煤rate de que el archivo sea accesible a trav茅s de HTTPS directamente en https://<domain>/apple-app-site-association
. Herramientas como el validador de asociaci贸n de sitios de aplicaciones de Apple (AASA) pueden ayudar en este proceso.
Manejando enlaces universales en la aplicaci贸n
La aplicaci贸n debe implementar m茅todos espec铆ficos para manejar enlaces universales correctamente. El m茅todo principal a buscar es application:continueUserActivity:restorationHandler:
. Es crucial que el esquema de las URL manejadas sea HTTP o HTTPS, ya que otros no ser谩n soportados.
Validando el m茅todo del manejador de datos
Cuando un enlace universal abre una aplicaci贸n, se pasa un objeto NSUserActivity
a la aplicaci贸n con la URL. Antes de procesar esta URL, es esencial validarla y sanearla para prevenir riesgos de seguridad. Aqu铆 hay un ejemplo en Swift que demuestra el proceso:
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
}
Las URLs deben ser analizadas y validadas cuidadosamente, especialmente si incluyen par谩metros, para protegerse contra posibles suplantaciones o datos mal formados. La API NSURLComponents
es 煤til para este prop贸sito, como se demuestra a continuaci贸n:
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
}
}
A trav茅s de una configuraci贸n y validaci贸n diligentes, los desarrolladores pueden asegurarse de que los enlaces universales mejoren la experiencia del usuario mientras mantienen los est谩ndares de seguridad y privacidad.
Herramientas
- GetUniversal.link: Ayuda a simplificar la prueba y gesti贸n de los Enlaces Universales de tu aplicaci贸n y el archivo AASA. Simplemente ingresa tu dominio para verificar la integridad del archivo AASA o utiliza el panel personalizado para probar f谩cilmente el comportamiento de los enlaces. Esta herramienta tambi茅n te ayuda a determinar cu谩ndo Apple indexar谩 por 煤ltima vez tu archivo AASA.
Referencias
- 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
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.