mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
196 lines
15 KiB
Markdown
196 lines
15 KiB
Markdown
# Extensions d'application iOS
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
|
|
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
|
|
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
|
|
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
|
|
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|
|
|
|
Les extensions d'application permettent aux applications d'offrir des fonctionnalités et du contenu personnalisés aux utilisateurs lorsqu'ils interagissent avec d'autres applications ou le système. Voici quelques exemples notables :
|
|
|
|
* **Clavier personnalisé** : remplace le clavier système iOS par un clavier personnalisé pour une utilisation dans toutes les applications.
|
|
* **Partager** : publier sur un site de partage ou partager du contenu avec d'autres.
|
|
* **Aujourd'hui** : également appelés **widgets**, ils offrent du contenu ou effectuent des tâches rapides dans la vue Aujourd'hui du Centre de notification.
|
|
|
|
Par exemple, l'utilisateur sélectionne du texte dans l'_application hôte_, clique sur le bouton "Partager" et sélectionne une "application" ou une action dans la liste. Cela déclenche l'_extension d'application_ de l'_application conteneur_. L'extension d'application affiche sa vue dans le contexte de l'application hôte et utilise les éléments fournis par l'application hôte, le texte sélectionné dans ce cas, pour effectuer une tâche spécifique (le publier sur un réseau social, par exemple). Cette image du [Guide de programmation des extensions d'application Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple\_ref/doc/uid/TP40014214-CH2-SW13) résume assez bien cela :
|
|
|
|
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQx9khfTwUwYuMti%2Fapp\_extensions\_communication.png?alt=media)
|
|
|
|
### **Considérations de sécurité**
|
|
|
|
Du point de vue de la sécurité, il est important de noter que :
|
|
|
|
* Une **extension d'application ne communique jamais directement avec son application conteneur** (généralement, elle ne fonctionne même pas pendant que l'extension d'application contenue est en cours d'exécution).
|
|
* Une **extension d'application** et l'**application hôte communiquent** via une **communication inter-processus**.
|
|
* L'**application conteneur de l'extension** et l'**application hôte ne communiquent pas** du tout.
|
|
* Un **widget Aujourd'hui** (et aucun autre type d'extension d'application) peut demander au système d'ouvrir son application conteneur en appelant la méthode `openURL:completionHandler:` de la classe `NSExtensionContext`.
|
|
* Toute **extension d'application** et son **application conteneur** peuvent **accéder à des données partagées dans un conteneur partagé défini de manière privée**.
|
|
* Les extensions d'application **ne peuvent pas accéder à certaines API**, par exemple, HealthKit.
|
|
* Elles **ne peuvent pas recevoir de données via AirDrop**, mais peuvent envoyer des données.
|
|
* **Aucune tâche de fond de longue durée** n'est autorisée, mais des téléchargements ou des téléversements peuvent être initiés.
|
|
* Les extensions d'application **ne peuvent pas accéder à la caméra ou au microphone d'un appareil iOS** (sauf pour les extensions d'application iMessage).
|
|
|
|
### Analyse statique
|
|
|
|
#### **Vérification si l'application contient des extensions d'application**
|
|
|
|
Si vous avez le code source original, vous pouvez rechercher toutes les occurrences de `NSExtensionPointIdentifier` avec Xcode (cmd+shift+f) ou jeter un coup d'œil dans "Build Phases / Embed App extensions" :
|
|
|
|
![](<../../.gitbook/assets/image (496).png>)
|
|
|
|
Vous pouvez y trouver les noms de toutes les extensions d'application intégrées suivies de `.appex`, vous pouvez maintenant accéder aux extensions d'application individuelles dans le projet.
|
|
|
|
Si vous n'avez pas le code source original :
|
|
|
|
Recherchez `NSExtensionPointIdentifier` parmi tous les fichiers à l'intérieur du bundle de l'application (IPA ou application installée) :
|
|
```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
|
|
```
|
|
Vous pouvez également y accéder via SSH, trouver le bundle de l'application et lister tous les PlugIns à l'intérieur (ils y sont placés par défaut) ou le faire avec 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
|
|
```
|
|
Nous pouvons maintenant voir les mêmes quatre extensions d'application que nous avons vues dans Xcode auparavant.
|
|
|
|
#### **Détermination des types de données pris en charge**
|
|
|
|
Ceci est important pour les données partagées avec des applications hôtes (par exemple via des extensions de partage ou d'action). Lorsque l'utilisateur sélectionne un type de données dans une application hôte et qu'il correspond aux types de données définis ici, l'application hôte proposera l'extension. Il convient de noter la différence entre cela et le partage de données via `UIActivity` où nous devions définir les types de documents, également en utilisant des UTI. Une application n'a pas besoin d'avoir une extension pour cela. Il est possible de partager des données en utilisant uniquement `UIActivity`.
|
|
|
|
Inspectez le fichier `Info.plist` de l'extension d'application et recherchez `NSExtensionActivationRule`. Cette clé spécifie les données prises en charge ainsi que, par exemple, le nombre maximal d'éléments pris en charge. Par exemple:
|
|
```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>
|
|
```
|
|
Seuls les types de données présents ici et n'ayant pas `0` comme `MaxCount` seront pris en charge. Cependant, un filtrage plus complexe est possible en utilisant une chaîne de prédicats appelée qui évaluera les UTI donnés. Veuillez vous référer au [Guide de programmation des extensions d'application Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple\_ref/doc/uid/TP40014214-CH21-SW8) pour plus d'informations détaillées à ce sujet.
|
|
|
|
**Vérification du partage de données avec l'application conteneur**
|
|
|
|
Rappelez-vous que les extensions d'application et leurs applications conteneurs n'ont pas un accès direct aux conteneurs de l'autre. Cependant, le partage de données peut être activé. Cela se fait via les ["Groupes d'applications"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple\_ref/doc/uid/TP40011195-CH4-SW19) et l'API [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Voir cette figure du [Guide de programmation des extensions d'application 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)
|
|
|
|
Comme mentionné dans le guide, l'application doit configurer un conteneur partagé si l'extension d'application utilise la classe `NSURLSession` pour effectuer un téléchargement ou un téléversement en arrière-plan, afin que l'extension et son application conteneur puissent accéder aux données transférées.
|
|
|
|
**Vérification si l'application restreint l'utilisation des extensions d'application**
|
|
|
|
Il est possible de rejeter un type spécifique d'extension d'application en utilisant la méthode suivante:
|
|
|
|
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
|
|
|
|
Cependant, il est actuellement possible uniquement pour les extensions d'application "clavier personnalisé" (et doit être vérifié lors des tests d'applications manipulant des données sensibles via le clavier comme les applications bancaires, par exemple).
|
|
|
|
### Analyse dynamique
|
|
|
|
Pour l'analyse dynamique, nous pouvons faire ce qui suit pour acquérir des connaissances sans avoir le code source:
|
|
|
|
* Inspection des éléments partagés
|
|
* Identification des extensions d'application impliquées
|
|
|
|
**Inspection des éléments partagés**
|
|
|
|
Pour cela, nous devons accrocher `NSExtensionContext - inputItems` dans l'application d'origine des données.
|
|
|
|
En suivant l'exemple précédent de Telegram, nous allons maintenant utiliser le bouton "Partager" sur un fichier texte (qui a été reçu d'un chat) pour créer une note dans l'application Notes avec celui-ci:
|
|
|
|
![](<../../.gitbook/assets/image (497).png>)
|
|
|
|
Si nous exécutons une trace, nous verrons la sortie suivante:
|
|
```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)}"
|
|
);
|
|
}"
|
|
)
|
|
```
|
|
Ici, nous pouvons observer que :
|
|
|
|
* Cela s'est produit sous le capot via XPC, concrètement, il est implémenté via une `NSXPCConnection` qui utilise le framework `libxpc.dylib`.
|
|
* Les UTI inclus dans le `NSItemProvider` sont `public.plain-text` et `public.file-url`, ce dernier étant inclus dans `NSExtensionActivationRule` du [`Info.plist` de l'extension "Share" de Telegram](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
|
|
|
|
**Identification des extensions d'application impliquées**
|
|
|
|
Vous pouvez également découvrir quelle extension d'application s'occupe de vos demandes et réponses en accrochant `NSExtension - _plugIn` :
|
|
|
|
Nous exécutons à nouveau le même exemple :
|
|
```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>
|
|
```
|
|
Comme vous pouvez le voir, il y a deux extensions d'application impliquées :
|
|
|
|
* `Share.appex` envoie le fichier texte (`public.plain-text` et `public.file-url`).
|
|
* `com.apple.mobilenotes.SharingExtension.appex` qui reçoit et traitera le fichier texte.
|
|
|
|
Si vous voulez en savoir plus sur ce qui se passe sous le capot en termes de XPC, nous vous recommandons de jeter un coup d'œil aux appels internes de "libxpc.dylib". Par exemple, vous pouvez utiliser [`frida-trace`](https://www.frida.re/docs/frida-trace/) et approfondir les méthodes qui vous semblent les plus intéressantes en étendant les stubs générés automatiquement.
|
|
|
|
###
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
|
|
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
|
|
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
|
|
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
|
|
- **Partagez vos astuces de piratage en soumettant des PR au repo [hacktricks](https://github.com/carlospolop/hacktricks) et [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|