hacktricks/mobile-pentesting/ios-pentesting/ios-uiactivity-sharing.md

96 lines
10 KiB
Markdown
Raw Normal View History

<details>
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Autres moyens de soutenir HackTricks :
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
2023-06-03 13:10:46 +00:00
# Partage UIActivity
2022-04-28 16:01:33 +00:00
À partir d'iOS 6, il est possible pour les applications tierces de **partager des données (éléments)** via des mécanismes spécifiques [comme AirDrop, par exemple](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3). Du point de vue de l'utilisateur, cette fonctionnalité est la bien connue _feuille d'activité de partage_ accessible après avoir cliqué sur le bouton "Partager".
2022-04-28 16:01:33 +00:00
Une liste complète des mécanismes de partage intégrés disponibles peut être trouvée dans [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Si jugés inappropriés pour l'application, les **développeurs ont la possibilité d'exclure certains de ces mécanismes de partage**.
2023-06-03 13:10:46 +00:00
## **Envoi d'éléments**
Lors du test du partage `UIActivity`, vous devriez porter une attention particulière à :
2023-06-03 13:10:46 +00:00
* les données (éléments) partagées,
* les activités personnalisées,
* les types d'activités exclus.
Le partage de données via `UIActivity` fonctionne en créant un `UIActivityViewController` et en lui passant les éléments souhaités (URLs, texte, une image) sur [`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init).
Si vous avez le code source, vous devriez examiner le `UIActivityViewController` :
2023-06-03 13:10:46 +00:00
* Inspectez les activités passées à la méthode `init(activityItems:applicationActivities:)`.
* Vérifiez s'il définit des activités personnalisées (également passées à la méthode précédente).
* Vérifiez les `excludedActivityTypes`, le cas échéant.
2023-06-03 13:10:46 +00:00
Si vous n'avez que l'application compilée/installée, essayez de rechercher la méthode et la propriété précédentes, par exemple :
```bash
$ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
0x1000df034 45 44 initWithActivityItems:applicationActivities:
```
2023-06-03 13:10:46 +00:00
## **Réception d'éléments**
2023-06-03 13:10:46 +00:00
Lors de la réception d'éléments, vous devez vérifier :
* si l'application **déclare des _types de documents personnalisés_** en consultant les **UTIs Exportés/Importés** (onglet "Info" du projet Xcode). La liste de tous les UTIs déclarés par le système (Uniform Type Identifiers) est disponible dans la [documentation archivée d'Apple Developer](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259).
* si l'application spécifie des _types de documents qu'elle peut ouvrir_ en consultant les **Types de Documents** (onglet "Info" du projet Xcode). Si présents, ils se composent d'un nom et d'un ou plusieurs UTIs qui représentent le type de données (par exemple, "public.png" pour les fichiers PNG). iOS utilise cela pour déterminer si l'application est éligible pour ouvrir un document donné (spécifier des UTIs Exportés/Importés ne suffit pas).
* si l'application _vérifie correctement les données reçues_ en examinant l'implémentation de [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) (ou sa version obsolète [`UIApplicationDelegate application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application?language=objc)) dans le délégué de l'application.
Sans avoir le code source, vous pouvez toujours examiner le fichier `Info.plist` et rechercher :
* `UTExportedTypeDeclarations`/`UTImportedTypeDeclarations` si l'application déclare des _types de documents personnalisés_ exportés/importés.
* `CFBundleDocumentTypes` pour voir si l'application spécifie des _types de documents qu'elle peut ouvrir_.
Une explication très complète de l'utilisation de ces clés peut être trouvée [sur Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i) mais voici un résumé :
* `UTExportedTypeDeclarations` : Utilisez-les pour définir **vos propres UTIs** que votre application veut enseigner au système sur lequel elle est installée. Un **UTI décrit un morceau de données** (_pas nécessairement des données situées dans un fichier !_) et nécessite au moins un **identifiant** (`com.example.MyCoolDataType`). De plus, il peut avoir un **nom** (`My Cool Data Type`), une ou plusieurs **extensions** de nom de fichier (`.myCoolDataType`), un ou plusieurs **types MIME** (`x-application/my-cool-data-type`), un ou plusieurs **types de presse-papiers** (utilisés lors du transfert de données de ce type en utilisant copier\&coller), et un ou plusieurs **types OS hérités**. Généralement, vous voulez aussi que les UTIs se conforment à des UTIs existants (par exemple, lorsque vous dites que votre UTI se conforme à `public.data`, tout processus qui peut traiter des données génériques peut également traiter votre UTI).
* Exemple : Vous définissez votre propre format de données de fichier propriétaire et vous voulez que ce format de données soit également connu des autres applications, plugins, extensions, etc.
* `UTImportedTypeDeclarations` : Vous utilisez `UTImportedTypeDeclarations` pour **enseigner au système des UTIs que vous voulez être connus dans le système mais qui ne sont pas vos UTIs**.
* Exemple : Votre application est capable de lire le format de données propriétaire d'une autre application, mais vous ne savez pas si cette application est même installée sur le système.
* `CFBundleDocumentTypes` : Vous utilisez `CFBundleDocumentTypes` pour indiquer au système quels types de documents votre application est capable d'ouvrir. À moins que vous **ne listiez également vos UTIs ici**, ces UTIs ne sont pas associés à votre application dans le Finder et votre application n'apparaîtra pas dans le menu `Ouvrir avec >`. \
La seule chose que vous devez toujours définir pour un type de document est le rôle. Le **rôle** peut être "**Viewer**" (vous pouvez afficher ce type de fichier mais vous ne pouvez pas le modifier), "**Editor**" (vous pouvez afficher et modifier ce type de fichier), "**None**" (il n'est pas spécifié ce que vous pouvez faire avec ce fichier).
* Exemple : Vous voulez que votre **application soit associée à certains types de fichiers**, identifiés soit par extension, soit par type MIME, soit par identifiant UTI. **Si vous voulez que votre application soit associée à un type UTI, l'application doit soit importer soit exporter le type**, sinon le type peut ne pas être connu du système et l'enregistrement à un type UTI inconnu n'a tout simplement aucun effet.
## Test Dynamique
Pour les **activités d'envoi**, vous pouvez :
* Intercepter la méthode que nous avons vue dans l'analyse statique ([`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init)) pour obtenir les `activityItems` et `applicationActivities`.
* Découvrir les activités exclues en interceptant la propriété [`excludedActivityTypes`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622009-excludedactivitytypes).
Pour la réception d'éléments, vous pouvez :
* _Partager_ un fichier avec l'application depuis une autre application ou l'envoyer via AirDrop ou e-mail. Choisissez le fichier de manière à déclencher la boîte de dialogue "Ouvrir avec..." (c'est-à-dire qu'il n'y a pas d'application par défaut qui ouvrira le fichier, un PDF par exemple).
* Intercepter `application:openURL:options:` et toute autre méthode identifiée lors d'une analyse statique précédente.
2023-06-03 13:10:46 +00:00
* Observer le comportement de l'application.
* De plus, vous pourriez envoyer des fichiers spécifiquement malformés et/ou utiliser une technique de fuzzing.
2023-06-03 13:10:46 +00:00
**Lisez comment** [**ici**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#dynamic-analysis-8)**.**
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
Autres moyens de soutenir HackTricks :
2022-04-28 16:01:33 +00:00
* Si vous voulez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>