# 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**](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 Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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 repo](https://github.com/carlospolop/hacktricks-cloud)**.
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](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple\_ref/doc/uid/TP40014214-CH2-SW13) que resume muito bem isso:
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQx9khfTwUwYuMti%2Fapp\_extensions\_communication.png?alt=media)
### **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 classe `NSExtensionContext`.
* 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":
![](<../../.gitbook/assets/image (496).png>)
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):
```bash
$ 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:
```bash
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:
```markup
NSExtensionAttributes
NSExtensionActivationRule
NSExtensionActivationSupportsImageWithMaxCount
10
NSExtensionActivationSupportsMovieWithMaxCount
1
NSExtensionActivationSupportsWebURLWithMaxCount
1
```
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](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) 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"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW19) e da API [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Veja esta figura do [Guia de Programação de Extensões de Aplicativos da Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW11):
![](../../mobile-apps-pentesting/ios-pentesting/broken-reference)
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:
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
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:
![](<../../.gitbook/assets/image (497).png>)
Se executarmos um trace, veremos a seguinte saída:
```bash
(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: (
" - userInfo:
{
NSExtensionItemAttachmentsKey = (
" {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 Framework `libxpc.dylib`.
* Os UTIs incluídos no `NSItemProvider` são `public.plain-text` e `public.file-url`, sendo este último incluído em `NSExtensionActivationRule` do [`Info.plist` da "Extensão de Compartilhamento" do Telegram](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
**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:
```bash
(0x1c0370200) NSExtension - _plugIn
RET:
(0x1c0372300) -[NSExtension _plugIn]
RET:
```
Como você pode ver, existem duas extensões de aplicativos 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`](https://www.frida.re/docs/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**](https://github.com/sponsors/carlospolop)!
- Descubra [**The PEASS Family**](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 repo](https://github.com/carlospolop/hacktricks-cloud)**.