15 KiB
Extensões de aplicativos iOS
☁️ 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? Verifique os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.
As extensões de aplicativos permitem que os aplicativos ofereçam funcionalidades e conteúdo personalizados aos usuários enquanto eles estão interagindo com outros aplicativos ou com o sistema. Algumas notáveis são:
- Teclado personalizado: substitui o teclado do sistema iOS por um teclado personalizado para uso em todos os aplicativos.
- Compartilhar: postar em um site de compartilhamento ou compartilhar conteúdo com outras pessoas.
- Hoje: também chamados de widgets, eles oferecem conteúdo ou realizam tarefas rápidas na visualização 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 de aplicativo do aplicativo contido. 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 de segurança, é importante observar que:
- Uma extensão de aplicativo nunca se comunica diretamente com seu aplicativo contido (geralmente, nem mesmo está em execução enquanto a extensão de aplicativo contida está em execução).
- Uma extensão de aplicativo e o aplicativo hospedeiro se comunicam por meio de comunicação interprocessual.
- O aplicativo contido da 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 solicitar ao sistema que abra seu aplicativo contido chamando o método
openURL:completionHandler:
da classeNSExtensionContext
. - Qualquer extensão de aplicativo e seu aplicativo contido podem acessar dados compartilhados em um contêiner compartilhado definido privadamente.
- As extensões de aplicativos não podem acessar algumas APIs, por exemplo, HealthKit.
- Eles não podem receber dados usando o AirDrop, mas podem enviar dados.
- Nenhuma tarefa de segundo plano de longa duração é permitida, mas uploads ou downloads podem ser iniciados.
- As extensões de aplicativos não podem acessar a câmera ou o microfone em um dispositivo iOS (exceto as extensões de aplicativos do iMessage).
Análise estática
Verificando se o aplicativo contém extensões de aplicativos
Se você tiver o código-fonte original, poderá pesquisar 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 incorporadas 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:
Procure 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 (que são colocados lá por padrão) ou fazer isso com o 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
Agora podemos ver as mesmas quatro extensões de aplicativos que vimos no Xcode antes.
Determinando os tipos de dados suportados
Isso é importante para os dados que são compartilhados com aplicativos hospedeiros (por exemplo, por meio de extensões de compartilhamento ou de 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 ressaltar 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 que são suportados, bem como 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 fazer filtragens mais complexas usando uma string de predicado, que avaliará os UTIs fornecidos. Consulte o Guia de Programação de Extensões de Aplicativos da Apple para obter informações mais 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 da 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 o 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 só é possível para extensões de aplicativos de "teclado personalizado" (e deve ser verificado ao testar aplicativos que lidam com dados sensíveis por meio do teclado, como aplicativos bancários, por exemplo).
Análise Dinâmica
Para a análise dinâmica, podemos fazer o seguinte para obter conhecimento sem ter o código-fonte:
- Inspeção dos itens sendo compartilhados
- Identificação das extensões de aplicativos envolvidas
Inspeção dos Itens Sendo Compartilhados
Para isso, devemos fazer hook em 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 trace, veremos 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 nos bastidores via XPC, concretamente é implementado via
NSXPCConnection
que usa o Frameworklibxpc.dylib
. - Os UTIs incluídos no
NSItemProvider
sãopublic.plain-text
epublic.file-url
, sendo este último incluído emNSExtensionActivationRule
doInfo.plist
da "Extensão de Compartilhamento" do Telegram.
Identificando as Extensões de Aplicativos Envolvidas
Você também pode descobrir qual extensão de aplicativo está cuidando de suas solicitações e respostas conectando NSExtension - _plugIn
:
Executamos novamente o mesmo exemplo:
(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, existem duas extensões de aplicativos envolvidas:
Share.appex
está enviando o arquivo de texto (public.plain-text
epublic.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, em seguida, aprofundar-se nos métodos que você achar mais interessantes, estendendo os stubs gerados automaticamente.
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
-
Descubra The PEASS Family, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.