hacktricks/mobile-pentesting/ios-pentesting/ios-uiactivity-sharing.md
2023-06-06 18:56:34 +00:00

9.2 KiB

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. 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. 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:).

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:

$ 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.
  • 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: (ou sua versão obsoleta UIApplicationDelegate application:openURL:sourceApplication:annotation:) 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, 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:

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.

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