14 KiB
Extensiones de Aplicaciones iOS
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF, consulta los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de github de HackTricks y HackTricks Cloud.
Contenido copiado de https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions
Las extensiones de aplicaciones permiten que las apps ofrezcan funcionalidad y contenido personalizados a los usuarios mientras interactúan con otras aplicaciones o el sistema. Algunas notables son:
- Teclado Personalizado: reemplaza el teclado del sistema iOS con un teclado personalizado para su uso en todas las aplicaciones.
- Compartir: publicar en un sitio web de compartición o compartir 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 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 notar que:
- Una extensión de aplicación nunca se comunica directamente con su aplicación contenedora (típicamente, ni siquiera está en ejecución mientras la extensión de aplicación contenida está funcionando).
- Una extensión de aplicación y la aplicación anfitriona se comunican a través de comunicación entre procesos.
- La aplicación contenedora de una extensión de aplicación y la aplicación anfitriona no se comunican en absoluto.
- Un widget 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 claseNSExtensionContext
. - 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 APIs, por ejemplo, HealthKit.
- No pueden recibir datos usando AirDrop pero sí pueden enviar datos.
- No se permiten tareas de fondo de larga duración pero se pueden iniciar subidas 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
Verificando si la Aplicación Contiene Extensiones de Aplicaciones
Si tienes el código fuente original puedes buscar todas las ocurrencias de NSExtensionPointIdentifier
con Xcode (cmd+shift+f) o echar un vistazo en "Build Phases / Embed App extensions":
Allí puedes encontrar los nombres de todas las extensiones de aplicaciones embebidas seguidas de .appex
, ahora puedes navegar a las extensiones de aplicaciones individuales en el proyecto.
Si no tienes el código fuente original:
Busca 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 todo dentro de PlugIns (están colocados 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
Podemos ver ahora las mismas cuatro extensiones de aplicación 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 de 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 la compartición de datos a través de UIActivity
, donde tuvimos que definir los tipos de documentos, también utilizando UTIs. Una aplicación no necesita tener una extensión para eso. Es posible compartir datos utilizando solamente UIActivity
.
Inspecciona el archivo Info.plist
de la extensión de la aplicación y busca NSExtensionActivationRule
. Esa clave especifica los datos que se soportan así como, por ejemplo, el máximo de elementos soportados. 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 los tipos de datos presentes aquí y que no tengan 0
como MaxCount
serán compatibles. Sin embargo, es posible realizar un filtrado más complejo utilizando una cadena de predicados que evaluará los UTIs dados. Consulte la Guía de Programación de Extensiones de Aplicaciones de Apple para obtener información más detallada sobre esto.
Verificación de Compartición de Datos con la Aplicación Contenedora
Recuerde que las extensiones de aplicaciones y sus aplicaciones contenedoras no tienen acceso directo a los contenedores de cada uno. Sin embargo, se puede habilitar la compartición de datos. Esto se hace a través de "App Groups" y la API NSUserDefaults
. Vea 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, de modo 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 extensiones de aplicaciones de "teclado personalizado" (y debe verificarse al probar aplicaciones que manejan datos sensibles a través del teclado como, por ejemplo, aplicaciones bancarias).
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 están compartiendo
- Identificar las extensiones de aplicaciones involucradas
Inspeccionar los Elementos que se Están Compartiendo
Para esto deberíamos 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 de Notas con él:
Si ejecutamos un rastreo, veríamos 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 mediante una
NSXPCConnection
que utiliza el Frameworklibxpc.dylib
. - Los UTIs incluidos en el
NSItemProvider
sonpublic.plain-text
ypublic.file-url
, este último incluido enNSExtensionActivationRule
delInfo.plist
de la "Share Extension" de Telegram.
Identificando las App Extensions Involucradas
También puedes averiguar qué app extension se está encargando de tus solicitudes y respuestas al interceptar 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 puedes ver, hay dos extensiones de aplicación involucradas:
Share.appex
está enviando el archivo de texto (public.plain-text
ypublic.file-url
).com.apple.mobilenotes.SharingExtension.appex
que está recibiendo y procesará el archivo de texto.
Si quieres 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, puedes usar frida-trace
y luego profundizar en los métodos que encuentres más interesantes extendiendo los stubs generados automáticamente.
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF Consulta los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de github de HackTricks y HackTricks Cloud.