- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
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:
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](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple\_ref/doc/uid/TP40014214-CH2-SW13) que resume bastante bien esto:
* 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).
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.
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:
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:
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](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) para obtener información más detallada sobre esto.
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`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Consulte esta figura de la [Guía de programación de extensiones de aplicaciones de Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW11):
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.
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).
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:
* 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](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
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`](https://www.frida.re/docs/frida-trace/) y luego profundizar en los métodos que encuentre más interesantes mediante la extensión de los stubs generados automáticamente.
- ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparta sus trucos de hacking enviando PR al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.