hacktricks/mobile-pentesting/ios-pentesting/ios-app-extensions.md

14 KiB

Extensões de Aplicativos iOS

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Conteúdo copiado de https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions

As extensões de aplicativos permitem que os apps ofereçam funcionalidades e conteúdos personalizados aos usuários enquanto eles interagem com outros aplicativos ou o sistema. Algumas notáveis incluem:

  • Teclado Personalizado: substitui o teclado do sistema iOS por um teclado personalizado para uso em todos os aplicativos.
  • Compartilhar: publicar em um site de compartilhamento ou compartilhar conteúdo com outros.
  • Hoje: também chamados de widgets, oferecem conteúdo ou realizam tarefas rápidas na visualização de Hoje do Centro de Notificações.

Por exemplo, o usuário seleciona texto no aplicativo hospedeiro, clica no botão "Compartilhar" e seleciona um "aplicativo" ou ação da lista. Isso aciona a extensão do aplicativo do aplicativo contenedor. A extensão do aplicativo exibe sua visualização dentro do contexto do aplicativo hospedeiro e usa os itens fornecidos pelo aplicativo hospedeiro, o texto selecionado neste caso, para realizar uma tarefa específica (postá-lo em uma rede social, por exemplo). Veja esta imagem do Guia de Programação de Extensões de Aplicativos da Apple que resume muito bem isso:

Considerações de Segurança

Do ponto de vista da segurança, é importante notar que:

  • Uma extensão de aplicativo nunca se comunica diretamente com seu aplicativo contenedor (tipicamente, nem está em execução enquanto a extensão do aplicativo contida está em execução).
  • Uma extensão de aplicativo e o aplicativo hospedeiro comunicam-se via comunicação entre processos.
  • Um aplicativo contenedor de uma extensão de aplicativo e o aplicativo hospedeiro não se comunicam de forma alguma.
  • Um widget Hoje (e nenhum outro tipo de extensão de aplicativo) pode pedir ao sistema para abrir seu aplicativo contenedor chamando o método openURL:completionHandler: da classe NSExtensionContext.
  • Qualquer extensão de aplicativo e seu aplicativo contenedor podem acessar dados compartilhados em um contêiner compartilhado privadamente definido.
  • Extensões de aplicativos não podem acessar algumas APIs, por exemplo, HealthKit.
  • Elas não podem receber dados usando AirDrop, mas podem enviar dados.
  • Não são permitidas tarefas de fundo de longa duração, mas podem ser iniciados uploads ou downloads.
  • Extensões de aplicativos não podem acessar a câmera ou o microfone em um dispositivo iOS (exceto para extensões de aplicativos iMessage).

Análise Estática

Verificando se o Aplicativo Contém Extensões de Aplicativos

Se você tem o código-fonte original, pode procurar por todas as ocorrências de NSExtensionPointIdentifier com o Xcode (cmd+shift+f) ou dar uma olhada em "Build Phases / Embed App extensions":

Lá você pode encontrar os nomes de todas as extensões de aplicativos embutidas seguidas por .appex, agora você pode navegar até as extensões de aplicativos individuais no projeto.

Se não tiver o código-fonte original:

Grep por NSExtensionPointIdentifier entre todos os arquivos dentro do pacote do aplicativo (IPA ou aplicativo instalado):

$ 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

Você também pode acessar via SSH, encontrar o pacote do aplicativo e listar todos os PlugIns internos (eles são colocados lá por padrão) ou fazer isso com 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

Determinando os Tipos de Dados Suportados

Isso é importante para dados sendo compartilhados com aplicativos hospedeiros (por exemplo, via Extensões de Compartilhamento ou Ação). Quando o usuário seleciona algum tipo de dado em um aplicativo hospedeiro e ele corresponde aos tipos de dados definidos aqui, o aplicativo hospedeiro oferecerá a extensão. Vale a pena notar a diferença entre isso e o compartilhamento de dados via UIActivity, onde tivemos que definir os tipos de documentos, também usando UTIs. Um aplicativo não precisa ter uma extensão para isso. É possível compartilhar dados usando apenas UIActivity.

Inspecione o arquivo Info.plist da extensão do aplicativo e procure por NSExtensionActivationRule. Essa chave especifica os dados sendo suportados, bem como, por exemplo, o máximo de itens suportados. Por exemplo:

<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>

Apenas os tipos de dados presentes aqui e que não têm 0 como MaxCount serão suportados. No entanto, é possível um filtro mais complexo usando uma chamada string de predicado que avaliará os UTIs dados. Por favor, consulte o Guia de Programação de Extensões de Aplicativos da Apple para mais informações detalhadas sobre isso.

Verificando o Compartilhamento de Dados com o Aplicativo Contenedor

Lembre-se de que as extensões de aplicativos e seus aplicativos contenedores não têm acesso direto aos contêineres um do outro. No entanto, o compartilhamento de dados pode ser habilitado. Isso é feito por meio de "Grupos de Aplicativos" e a API NSUserDefaults. Veja esta figura do Guia de Programação de Extensões de Aplicativos da Apple:

Como também mencionado no guia, o aplicativo deve configurar um contêiner compartilhado se a extensão do aplicativo usar a classe NSURLSession para realizar um upload ou download em segundo plano, para que tanto a extensão quanto seu aplicativo contenedor possam acessar os dados transferidos.

Verificando se o Aplicativo Restringe o Uso de Extensões de Aplicativos

É possível rejeitar um tipo específico de extensão de aplicativo usando o seguinte método:

No entanto, atualmente isso é possível apenas para extensões de aplicativos de "teclado personalizado" (e deve ser verificado ao testar aplicativos que lidam com dados sensíveis pelo teclado, como por exemplo, aplicativos bancários).

Análise Dinâmica

Para a análise dinâmica, podemos fazer o seguinte para obter conhecimento sem ter o código-fonte:

  • Inspecionando os itens sendo compartilhados
  • Identificando as extensões de aplicativos envolvidas

Inspecionando os Itens Sendo Compartilhados

Para isso, devemos interceptar NSExtensionContext - inputItems no aplicativo de origem dos dados.

Seguindo o exemplo anterior do Telegram, agora usaremos o botão "Compartilhar" em um arquivo de texto (que foi recebido de um chat) para criar uma nota no aplicativo Notas com ele:

Se executarmos um rastreamento, veríamos a seguinte saída:

(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)}"
);
}"
)

Aqui podemos observar que:

  • Isso ocorreu sob o capô via XPC, concretamente é implementado através de uma NSXPCConnection que usa o Framework libxpc.dylib.
  • Os UTIs incluídos no NSItemProvider são public.plain-text e public.file-url, sendo este último incluído na NSExtensionActivationRule do Info.plist da "Share Extension" do Telegram.

Identificando as App Extensions Envolvidas

Você também pode descobrir qual app extension está cuidando das suas solicitações e respostas ao interceptar NSExtension - _plugIn:

Executamos o mesmo exemplo novamente:

(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 você pode ver, há duas extensões de aplicativo envolvidas:

  • Share.appex está enviando o arquivo de texto (public.plain-text e public.file-url).
  • com.apple.mobilenotes.SharingExtension.appex que está recebendo e processará o arquivo de texto.

Se você quiser aprender mais sobre o que está acontecendo nos bastidores em termos de XPC, recomendamos dar uma olhada nas chamadas internas de "libxpc.dylib". Por exemplo, você pode usar frida-trace e depois investigar mais a fundo os métodos que achar mais interessantes, estendendo os stubs gerados automaticamente.

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks: