# Compartilhamento de UIActivity A partir do iOS 6, é possível para aplicativos de terceiros **compartilhar dados (itens)** por meio de mecanismos específicos [como o AirDrop, por exemplo](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple\_ref/doc/uid/TP40007072-CH6-SW3). Do ponto de vista do usuário, esse recurso é a conhecida _folha de atividade de compartilhamento_ do sistema que aparece após clicar no botão "Compartilhar". Uma lista completa dos mecanismos de compartilhamento integrados disponíveis pode ser encontrada em [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Se não considerado apropriado para o aplicativo, os **desenvolvedores têm a possibilidade de excluir alguns desses mecanismos de compartilhamento**. ## **Enviando itens** Ao testar o Compartilhamento de UIActivity, você deve prestar atenção especial em: * os dados (itens) sendo compartilhados, * as atividades personalizadas, * os tipos de atividade excluídos. O compartilhamento de dados via `UIActivity` funciona criando um `UIActivityViewController` e passando os itens desejados (URLs, texto, uma imagem) em [`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init). Se você tiver o código-fonte, deve dar uma olhada no `UIActivityViewController`: * Inspecione as atividades passadas para o método `init(activityItems:applicationActivities:)`. * Verifique se ele define atividades personalizadas (também sendo passadas para o método anterior). * Verifique os `excludedActivityTypes`, se houver. Se você só tem o aplicativo compilado/instalado, tente procurar pelo método e propriedade anterior, por exemplo: ```bash $ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems 0x1000df034 45 44 initWithActivityItems:applicationActivities: ``` ## **Recebendo itens** Ao receber itens, você deve verificar: * se o aplicativo **declara** _**tipos de documentos personalizados**_ olhando em **UTIs exportados/importados** ("Informações" na guia do projeto Xcode). A lista de todas as UTIs declaradas pelo sistema pode ser encontrada na [Documentação do Desenvolvedor da Apple arquivada](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple\_ref/doc/uid/TP40009259). * se o aplicativo especifica quais _**tipos de documentos que ele pode abrir**_ olhando em **Tipos de Documentos** ("Informações" na guia do projeto Xcode). Se presente, eles consistem em nome e uma ou mais UTIs que representam o tipo de dados (por exemplo, "public.png" para arquivos PNG). O iOS usa isso para determinar se o aplicativo é elegível para abrir um determinado documento (especificar UTIs exportados/importados não é suficiente). * se o aplicativo verifica corretamente os dados recebidos olhando para a implementação de [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) (ou sua versão obsoleta [`UIApplicationDelegate application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application?language=objc)) no delegado do aplicativo. Se não tiver o código-fonte, você ainda pode dar uma olhada no arquivo `Info.plist` e procurar por: * `UTExportedTypeDeclarations`/`UTImportedTypeDeclarations` se o aplicativo declara _tipos de documentos personalizados_ exportados/importados. * `CFBundleDocumentTypes` para ver se o aplicativo especifica quais _tipos de documentos que ele pode abrir_. Uma explicação muito completa sobre o uso dessas chaves pode ser encontrada [no Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i), mas aqui você tem um resumo: * `UTExportedTypeDeclarations`: Use-os para definir **suas próprias UTIs** que seu aplicativo deseja ensinar ao sistema em que está instalado. Uma **UTI descreve um pedaço de dados** (_não necessariamente dados localizados dentro de um arquivo!_) e requer pelo menos um **identificador** (`com.example.MyCoolDataType`). Além disso, pode ter um **nome** (`My Cool Data Type`), uma ou mais **extensões de nome de arquivo** (`.myCoolDataType`), um ou mais **tipos MIME** (`x-application/my-cool-data-type`), um ou mais **tipos de prancheta** (usados ao transferir dados desse tipo usando copiar e colar) e um ou mais **tipos de sistema operacional legado**. Geralmente, você também deseja que as UTIs se conformem às UTIs existentes (por exemplo, quando você diz que sua UTI se conforma com `public.data`, qualquer processo que possa lidar com dados genéricos também pode lidar com sua UTI). * por exemplo: você define seu próprio formato de dados de arquivo proprietário e deseja que esse formato de dados também seja conhecido por outros aplicativos, plug-ins, extensões, etc. * `UTImportedTypeDeclarations`: Você usa `UTImportedTypeDeclarations` para **ensinar o sistema sobre UTIs que você deseja que sejam conhecidas no sistema, mas que não são suas UTIs**. * por exemplo: seu aplicativo é capaz de ler o formato de dados proprietário de outro aplicativo, mas você não sabe se esse aplicativo está instalado no sistema. * `CFBundleDocumentTypes`: Você usa `CFBundleDocumentTypes` para informar ao sistema quais tipos de documentos seu aplicativo é capaz de abrir. A menos que você **também liste suas UTIs aqui**, essas UTIs não estão associadas ao seu aplicativo no Finder e seu aplicativo não aparecerá no menu `Abrir com >`. \ A única coisa que você sempre deve definir para um tipo de documento é o papel. O **papel** pode ser "**Visualizador**" (você pode exibir esse tipo de arquivo, mas não pode editá-lo), "**Editor**" (você pode exibir e editar esse tipo de arquivo) ou "**Nenhum**" (não é especificado o que você pode fazer com esse tipo de arquivo). * por exemplo: você deseja que seu **aplicativo seja associado a determinados tipos de arquivo**, identificados por extensão, tipo MIME ou identificador UTI. **Se você deseja que seu aplicativo seja associado a um tipo de UTI, o aplicativo deve importar ou exportar o tipo**, caso contrário, o tipo pode não ser conhecido pelo sistema e o registro em um tipo de UTI desconhecido não tem efeito algum. ## Teste Dinâmico Para **enviar atividades**, você pode: * Hook o método que vimos na análise estática ([`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init)) para obter os `activityItems` e `applicationActivities`. * Descobrir as atividades excluídas hookando a propriedade [`excludedActivityTypes`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622009-excludedactivitytypes). Para receber itens, você pode: * _Compartilhar_ um arquivo com o aplicativo de outro aplicativo ou enviá-lo via AirDrop ou e-mail. Escolha o arquivo para que ele acione o diálogo "Abrir com..." (ou seja, não há um aplicativo padrão que abrirá o arquivo, um PDF, por exemplo). * Hook `application:openURL:options:` e quaisquer outros métodos que foram identificados em uma análise estática anterior. * Observar o comportamento do aplicativo. * Além disso, você pode enviar arquivos específicos malformados e/ou usar uma técnica de fuzzing. **Leia mais** [**aqui**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#dynamic-analysis-8)**.**
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! - Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) - Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) - **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.