mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-24 20:13:37 +00:00
192 lines
14 KiB
Markdown
192 lines
14 KiB
Markdown
# Extensões de Aplicativos iOS
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras formas de apoiar o HackTricks:
|
|
|
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
|
|
|
</details>
|
|
|
|
**Conteúdo copiado de** [**https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions**](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](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 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":
|
|
|
|
![](<../../.gitbook/assets/image (496).png>)
|
|
|
|
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):
|
|
```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 (eles são colocados lá por padrão) ou fazer isso com 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
|
|
```
|
|
#### **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:
|
|
```markup
|
|
<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](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) 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"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW19) e a 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 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:
|
|
|
|
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
|
|
|
|
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:
|
|
|
|
![](<../../.gitbook/assets/image (497).png>)
|
|
|
|
Se executarmos um rastreamento, veríamos 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: (
|
|
"<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](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
|
|
|
|
**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:
|
|
```bash
|
|
(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`](https://www.frida.re/docs/frida-trace/) e depois investigar mais a fundo os métodos que achar mais interessantes, estendendo os stubs gerados automaticamente.
|
|
|
|
###
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras formas de apoiar o HackTricks:
|
|
|
|
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|