# Compartir UIActivity A partir de iOS 6, es posible que las aplicaciones de terceros **compartan datos (elementos)** a través de mecanismos específicos [como AirDrop, por ejemplo](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple\_ref/doc/uid/TP40007072-CH6-SW3). Desde la perspectiva del usuario, esta función es la conocida hoja de actividad de _compartir_ en todo el sistema que aparece después de hacer clic en el botón "Compartir". Una lista completa de los mecanismos de intercambio integrados disponibles se puede encontrar en [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Si no se considera apropiado para la aplicación, los **desarrolladores tienen la posibilidad de excluir algunos de estos mecanismos de intercambio**. ## **Envío de elementos** Al probar la Compartición de UIActivity, debe prestar especial atención a: * los datos (elementos) que se comparten, * las actividades personalizadas, * los tipos de actividad excluidos. El intercambio de datos a través de `UIActivity` funciona creando un `UIActivityViewController` y pasándole los elementos deseados (URL, texto, una imagen) en [`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init). Si tiene el código fuente, debe echar un vistazo al `UIActivityViewController`: * Inspeccione las actividades pasadas al método `init(activityItems:applicationActivities:)`. * Compruebe si define actividades personalizadas (que también se pasan al método anterior). * Verifique los `excludedActivityTypes`, si los hay. Si solo tiene la aplicación compilada/instalada, intente buscar el método y la propiedad anterior, por ejemplo: ```bash $ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems 0x1000df034 45 44 initWithActivityItems:applicationActivities: ``` ## **Recibiendo elementos** Al recibir elementos, debes verificar: * si la aplicación **declara** _**tipos de documentos personalizados**_ mirando en los UTI exportados/importados ("Información" en el proyecto Xcode). La lista de todos los UTI declarados por el sistema se puede encontrar en la [Documentación de desarrolladores de Apple archivada](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259). * si la aplicación especifica algún _**tipo de documento que puede abrir**_ mirando en los Tipos de documento ("Información" en el proyecto Xcode). Si está presente, consisten en un nombre y uno o más UTI que representan el tipo de datos (por ejemplo, "public.png" para archivos PNG). iOS utiliza esto para determinar si la aplicación es elegible para abrir un documento determinado (especificar UTI exportados/importados no es suficiente). * si la aplicación verifica adecuadamente los datos recibidos mirando en la implementación de [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) (o su versión obsoleta [`UIApplicationDelegate application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application?language=objc)) en el delegado de la aplicación. Si no tienes el código fuente, aún puedes echar un vistazo al archivo `Info.plist` y buscar: * `UTExportedTypeDeclarations`/`UTImportedTypeDeclarations` si la aplicación declara tipos de documentos personalizados exportados/importados. * `CFBundleDocumentTypes` para ver si la aplicación especifica algún tipo de documento que puede abrir. Una explicación muy completa sobre el uso de estas claves se puede encontrar [en Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i), pero aquí tienes un resumen: * `UTExportedTypeDeclarations`: Úsalos para definir **tus propios UTI** que tu aplicación quiere enseñar al sistema en el que está instalado. Un **UTI describe un fragmento de datos** (_¡no necesariamente datos ubicados dentro de un archivo!_) y requiere al menos un **identificador** (`com.example.MyCoolDataType`). Además, puede tener un **nombre** (`Mi tipo de datos genial`), una o más **extensiones de nombre de archivo** (`.myCoolDataType`), uno o más **tipos MIME** (`x-application/my-cool-data-type`), uno o más **tipos de portapapeles** (usados cuando se transfieren datos de ese tipo usando copiar y pegar), y uno o más **tipos de sistema operativo heredados**. Por lo general, también deseas que los UTI se ajusten a los UTI existentes (por ejemplo, cuando dices que tu UTI se ajusta a `public.data`, cualquier proceso que pueda manejar datos genéricos también puede manejar tu UTI). * por ejemplo: Definir tu propio formato de datos de archivo patentado y quieres que este formato de datos sea conocido también por otras aplicaciones, complementos, extensiones, etc. * `UTImportedTypeDeclarations`: Usas `UTImportedTypeDeclarations` para **enseñar al sistema sobre UTI que deseas que se conozcan en el sistema pero que no son tus UTI**. * por ejemplo: Tu aplicación puede leer el formato de datos patentado de otra aplicación, pero no sabes si esa aplicación está instalada en el sistema. * `CFBundleDocumentTypes`: Usas `CFBundleDocumentTypes` para decirle al sistema qué tipos de documentos puede abrir tu aplicación. A menos que **también listes tus UTI aquí**, estos UTI no están asociados con tu aplicación en Finder y tu aplicación no aparecerá en el menú `Abrir con >`. \ Lo único que siempre debes establecer para un tipo de documento es el rol. El **rol** puede ser "**Visor**" (puedes mostrar ese tipo de archivo pero no puedes editarlo), "**Editor**" (puedes mostrar y editar ese tipo de archivo), "**Ninguno**" (no se especifica lo que puedes hacer con ese archivo). * por ejemplo: Quieres que tu **aplicación se asocie con ciertos tipos de archivo**, identificados ya sea por extensión, por tipo MIME o por identificador UTI. **Si deseas que tu aplicación se asocie con un tipo de UTI, la aplicación debe importar o exportar el tipo**, de lo contrario, el tipo puede no ser conocido por el sistema y registrarse en un tipo de UTI desconocido no tiene ningún efecto en absoluto. ## Pruebas dinámicas Para **enviar actividades** puedes: * Enganchar el método que hemos visto en el análisis estático ([`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init)) para obtener los `activityItems` y `applicationActivities`. * Descubrir las actividades excluidas enganchando la propiedad [`excludedActivityTypes`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622009-excludedactivitytypes). Para recibir elementos puedes: * _Compartir_ un archivo con la aplicación desde otra aplicación o enviarlo por AirDrop o correo electrónico. Elije el archivo para que desencadene el diálogo "Abrir con..." (es decir, no hay una aplicación predeterminada que abra el archivo, un PDF, por ejemplo). * Enganchar `application:openURL:options:` y cualquier otro método que se haya identificado en un análisis estático anterior. * Observar el comportamiento de la aplicación. * Además, podrías enviar archivos específicos malformados y/o usar una técnica de fuzzing. **Lee cómo hacerlo** [**aquí**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#dynamic-analysis-8)**.**
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿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)! - Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family) - Consigue el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) - **Ú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 PRs al [repositorio hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.