hacktricks/mobile-pentesting/ios-pentesting/ios-app-extensions.md
2023-06-03 01:46:23 +00:00

15 KiB

Extensiones de aplicaciones iOS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Las extensiones de aplicaciones permiten a las aplicaciones ofrecer funcionalidades y contenido personalizados a los usuarios mientras interactúan con otras aplicaciones o el sistema. Algunas de las más notables son:

  • Teclado personalizado: reemplaza el teclado del sistema iOS con un teclado personalizado para su uso en todas las aplicaciones.
  • Compartir: publica en un sitio web de intercambio o comparte contenido con otros.
  • Hoy: también llamados widgets, ofrecen contenido o realizan tareas rápidas en la vista Hoy del Centro de Notificaciones.

Por ejemplo, el usuario selecciona texto en la aplicación anfitriona, hace clic en el botón "Compartir" y selecciona una "aplicación" o acción de la lista. Esto activa la extensión de la aplicación de la aplicación contenedora. La extensión de la aplicación muestra su vista dentro del contexto de la aplicación anfitriona y utiliza los elementos proporcionados por la aplicación anfitriona, el texto seleccionado en este caso, para realizar una tarea específica (publicarlo en una red social, por ejemplo). Vea esta imagen de la Guía de programación de extensiones de aplicaciones de Apple que resume bastante bien esto:

Consideraciones de seguridad

Desde el punto de vista de la seguridad, es importante tener en cuenta que:

  • Una extensión de aplicación nunca se comunica directamente con su aplicación contenedora (por lo general, ni siquiera se está ejecutando mientras se ejecuta la extensión de la aplicación contenida).
  • Una extensión de aplicación y la aplicación anfitriona se comunican a través de la comunicación entre procesos.
  • La aplicación contenedora de una extensión y la aplicación anfitriona no se comunican en absoluto.
  • Un widget de Hoy (y ningún otro tipo de extensión de aplicación) puede pedir al sistema que abra su aplicación contenedora llamando al método openURL:completionHandler: de la clase NSExtensionContext.
  • Cualquier extensión de aplicación y su aplicación contenedora pueden acceder a datos compartidos en un contenedor compartido definido de forma privada.
  • Las extensiones de aplicaciones no pueden acceder a algunas API, por ejemplo, HealthKit.
  • No pueden recibir datos usando AirDrop, pero sí pueden enviar datos.
  • No se permiten tareas en segundo plano de larga duración, pero se pueden iniciar cargas o descargas.
  • Las extensiones de aplicaciones no pueden acceder a la cámara o al micrófono en un dispositivo iOS (excepto las extensiones de aplicaciones de iMessage).

Análisis estático

Verificación de si la aplicación contiene extensiones de aplicaciones

Si tiene el código fuente original, puede buscar todas las ocurrencias de NSExtensionPointIdentifier con Xcode (cmd+shift+f) o echar un vistazo a "Build Phases / Embed App extensions":

Allí puede encontrar los nombres de todas las extensiones de aplicaciones incrustadas seguidas de .appex, ahora puede navegar a las extensiones de aplicaciones individuales en el proyecto.

Si no tiene el código fuente original:

Busque NSExtensionPointIdentifier entre todos los archivos dentro del paquete de la aplicación (IPA o aplicación instalada):

$ grep -nr NSExtensionPointIdentifier Payload/Telegram\ X.app/
Binary file Payload/Telegram X.app//PlugIns/SiriIntents.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Share.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/NotificationContent.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Widget.appex/Info.plist matches
Binary file Payload/Telegram X.app//Watch/Watch.app/PlugIns/Watch Extension.appex/Info.plist matches

También puedes acceder por SSH, encontrar el paquete de la aplicación y listar todos los PlugIns internos (que se colocan allí por defecto) o hacerlo con objection:

ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # cd PlugIns
    /var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
    Telegram X.app/PlugIns

ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # ls
NSFileType      Perms  NSFileProtection    Read    Write     Name
------------  -------  ------------------  ------  -------   -------------------------
Directory         493  None                True    False     NotificationContent.appex
Directory         493  None                True    False     Widget.appex
Directory         493  None                True    False     Share.appex
Directory         493  None                True    False     SiriIntents.appex

Ahora podemos ver las mismas cuatro extensiones de aplicaciones que vimos en Xcode antes.

Determinando los tipos de datos soportados

Esto es importante para los datos que se comparten con aplicaciones anfitrionas (por ejemplo, a través de extensiones de Compartir o Acción). Cuando el usuario selecciona algún tipo de dato en una aplicación anfitriona y coincide con los tipos de datos definidos aquí, la aplicación anfitriona ofrecerá la extensión. Vale la pena notar la diferencia entre esto y el intercambio de datos a través de UIActivity, donde teníamos que definir los tipos de documentos, también usando UTIs. Una aplicación no necesita tener una extensión para eso. Es posible compartir datos usando solo UIActivity.

Inspeccione el archivo Info.plist de la extensión de la aplicación y busque NSExtensionActivationRule. Esa clave especifica los datos que se admiten, así como, por ejemplo, el máximo de elementos admitidos. Por ejemplo:

<key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>10</integer>
            <key>NSExtensionActivationSupportsMovieWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>1</integer>
        </dict>
    </dict>

Solo se admitirán los tipos de datos presentes aquí y que no tengan 0 como MaxCount. Sin embargo, es posible realizar filtrados más complejos utilizando una cadena de predicado llamada "predicate string" que evaluará los UTI proporcionados. Consulte la Guía de programación de extensiones de aplicaciones de Apple para obtener información más detallada sobre esto.

Comprobación del intercambio de datos con la aplicación contenedora

Recuerde que las extensiones de aplicaciones y sus aplicaciones contenedoras no tienen acceso directo a los contenedores del otro. Sin embargo, se puede habilitar el intercambio de datos. Esto se hace a través de los "Grupos de aplicaciones" y la API NSUserDefaults. Consulte esta figura de la Guía de programación de extensiones de aplicaciones de Apple:

Como también se menciona en la guía, la aplicación debe configurar un contenedor compartido si la extensión de la aplicación utiliza la clase NSURLSession para realizar una carga o descarga en segundo plano, para que tanto la extensión como su aplicación contenedora puedan acceder a los datos transferidos.

Verificación de si la aplicación restringe el uso de extensiones de aplicaciones

Es posible rechazar un tipo específico de extensión de aplicación utilizando el siguiente método:

Sin embargo, actualmente solo es posible para las extensiones de aplicaciones de "teclado personalizado" (y debe verificarse al probar aplicaciones que manejen datos sensibles a través del teclado, como aplicaciones bancarias, por ejemplo).

Análisis dinámico

Para el análisis dinámico, podemos hacer lo siguiente para obtener conocimiento sin tener el código fuente:

  • Inspeccionar los elementos que se comparten
  • Identificar las extensiones de aplicaciones involucradas

Inspeccionar los elementos que se comparten

Para esto, debemos enganchar NSExtensionContext - inputItems en la aplicación de origen de los datos.

Siguiendo el ejemplo anterior de Telegram, ahora usaremos el botón "Compartir" en un archivo de texto (que se recibió de un chat) para crear una nota en la aplicación Notas con él:

Si ejecutamos un rastreo, veremos la siguiente salida:

(0x1c06bb420) NSExtensionContext - inputItems
0x18284355c Foundation!-[NSExtension _itemProviderForPayload:extensionContext:]
0x1828447a4 Foundation!-[NSExtension _loadItemForPayload:contextIdentifier:completionHandler:]
0x182973224 Foundation!__NSXPCCONNECTION_IS_CALLING_OUT_TO_EXPORTED_OBJECT_S3__
0x182971968 Foundation!-[NSXPCConnection _decodeAndInvokeMessageWithEvent:flags:]
0x182748830 Foundation!message_handler
0x181ac27d0 libxpc.dylib!_xpc_connection_call_event_handler
0x181ac0168 libxpc.dylib!_xpc_connection_mach_event
...
RET: (
"<NSExtensionItem: 0x1c420a540> - userInfo:
{
    NSExtensionItemAttachmentsKey =     (
    "<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
    );
}"
)

Aquí podemos observar que:

  • Esto ocurrió bajo el capó a través de XPC, concretamente se implementa a través de una NSXPCConnection que utiliza el marco libxpc.dylib.
  • Los UTI incluidos en NSItemProvider son public.plain-text y public.file-url, este último se incluye en NSExtensionActivationRule del Info.plist de la "Extensión de Compartir" de Telegram.

Identificación de las Extensiones de Aplicaciones Involucradas

También puede descubrir qué extensión de aplicación se encarga de sus solicitudes y respuestas enganchando NSExtension - _plugIn:

Ejecutamos el mismo ejemplo de nuevo:

(0x1c0370200) NSExtension - _plugIn
RET: <PKPlugin: 0x1163637f0 ph.telegra.Telegraph.Share(5.3) 5B6DE177-F09B-47DA-90CD-34D73121C785
1(2) /private/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35
/Telegram X.app/PlugIns/Share.appex>

(0x1c0372300)  -[NSExtension _plugIn]
RET: <PKPlugin: 0x10bff7910 com.apple.mobilenotes.SharingExtension(1.5) 73E4F137-5184-4459-A70A-83
F90A1414DC 1(2) /private/var/containers/Bundle/Application/5E267B56-F104-41D0-835B-F1DAB9AE076D
/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex>

Como se puede ver, hay dos extensiones de aplicaciones involucradas:

  • Share.appex está enviando el archivo de texto (public.plain-text y public.file-url).
  • com.apple.mobilenotes.SharingExtension.appex que está recibiendo y procesará el archivo de texto.

Si desea aprender más sobre lo que está sucediendo bajo el capó en términos de XPC, recomendamos echar un vistazo a las llamadas internas de "libxpc.dylib". Por ejemplo, puede usar frida-trace y luego profundizar en los métodos que encuentre más interesantes mediante la extensión de los stubs generados automáticamente.

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥