iOS Custom URI Handlers / Deeplinks / Custom Schemes

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Este es un resumen de la información relacionada en https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0075/

Información Básica

Los esquemas de URL personalizados permiten que las aplicaciones se comuniquen utilizando un protocolo personalizado, como se detalla en la Documentación para Desarrolladores de Apple. Estos esquemas deben ser declarados por la aplicación, la cual maneja las URL entrantes siguiendo esos esquemas. Es crucial validar todos los parámetros de la URL y descartar cualquier URL malformada para prevenir ataques a través de este vector.

Se da un ejemplo donde la URI myapp://hostname?data=123876123 invoca una acción específica de la aplicación. Se señaló una vulnerabilidad en la aplicación móvil de Skype, que permitía acciones de llamada no permitidas a través del protocolo skype://. Los esquemas registrados se pueden encontrar en el archivo Info.plist de la aplicación bajo CFBundleURLTypes. Aplicaciones maliciosas pueden explotar esto al volver a registrar URIs para interceptar información sensible.

Registro de Esquemas de Consulta de Aplicación

A partir de iOS 9.0, para verificar si una aplicación está disponible, canOpenURL: requiere declarar esquemas de URL en el archivo Info.plist bajo LSApplicationQueriesSchemes. Esto limita los esquemas que una aplicación puede consultar a 50, mejorando la privacidad al prevenir la enumeración de aplicaciones.

<key>LSApplicationQueriesSchemes</key>
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>

Prueba de Manejo y Validación de URL

Los desarrolladores deben inspeccionar métodos específicos en el código fuente para comprender la construcción y validación de la ruta de URL, como application:didFinishLaunchingWithOptions: y application:openURL:options:. Por ejemplo, Telegram emplea varios métodos para abrir URLs:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
annotation: Any) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
self.openUrl(url: url)
return true
}

Probando Solicitudes de URL a Otras Aplicaciones

Métodos como openURL:options:completionHandler: son cruciales para abrir URLs e interactuar con otras aplicaciones. Identificar el uso de tales métodos en el código fuente de la aplicación es clave para comprender las comunicaciones externas.

Pruebas de Métodos Obsoletos

Los métodos obsoletos que manejan la apertura de URLs, como application:handleOpenURL: y openURL:, deben ser identificados y revisados en busca de implicaciones de seguridad.

Fuzzing de Esquemas de URL

El fuzzing de esquemas de URL puede identificar errores de corrupción de memoria. Herramientas como Frida pueden automatizar este proceso abriendo URLs con cargas útiles variables para monitorear posibles bloqueos, como se ejemplifica con la manipulación de URLs en la aplicación iGoat-Swift:

$ frida -U SpringBoard -l ios-url-scheme-fuzzing.js
[iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}")
Watching for crashes from iGoat...
No logs were moved.
Opened URL: iGoat://?contactNumber=0&message=0

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización