hacktricks/mobile-pentesting/ios-pentesting/ios-uiactivity-sharing.md
2023-06-03 13:10:46 +00:00

9.7 KiB

Partage UIActivity

À 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. Du point de vue de l'utilisateur, cette fonctionnalité est la feuille d'activité de partage système bien connue qui apparaît après avoir cliqué sur le bouton "Partager".

Une liste complète des mécanismes de partage intégrés disponibles peut être trouvée dans UIActivity.ActivityType. Si elle n'est pas considérée comme appropriée pour l'application, les développeurs ont la possibilité d'exclure certains de ces mécanismes de partage.

Envoi d'éléments

Lors du test de partage UIActivity, vous devez prêter une attention particulière à :

  • 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 (URL, texte, une image) sur init(activityItems:applicationActivities:).

Si vous avez le code source, vous devriez jeter un coup d'œil au UIActivityViewController :

  • 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, s'il y en a.

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 :

$ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
0x1000df034 45 44 initWithActivityItems:applicationActivities:

Réception d'éléments

Lors de la réception d'éléments, vous devez vérifier :

  • si l'application déclare des types de documents personnalisés en regardant dans les UTI exportés/importés ("Info" onglet du projet Xcode). La liste de tous les UTI déclarés par le système peut être trouvée dans la documentation archivée des développeurs Apple.
  • si l'application spécifie des types de documents qu'elle peut ouvrir en regardant dans les Types de documents ("Info" onglet du projet Xcode). S'ils sont présents, ils consistent en un nom et un ou plusieurs UTI 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 les UTI exportés/importés ne suffit pas).
  • si l'application vérifie correctement les données reçues en regardant dans la mise en œuvre de application:openURL:options: (ou sa version obsolète UIApplicationDelegate application:openURL:sourceApplication:annotation:) dans le délégué de l'application.

Si vous n'avez pas le code source, vous pouvez toujours regarder dans 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 sur l'utilisation de ces clés peut être trouvée sur Stackoverflow, mais voici un résumé :

  • UTExportedTypeDeclarations : Utilisez-les pour définir vos propres UTI que votre application veut enseigner au système sur lequel elle est installée. Un UTI décrit une pièce de données (pas nécessairement des données situées à l'intérieur d'un fichier !) et nécessite au moins un identificateur (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 de système d'exploitation hérités. Habituellement, vous voulez également que les UTI se conforment aux UTI 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).
    • par 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 UTI que vous voulez qu'il connaisse dans le système mais qui ne sont pas vos UTI.
    • par 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 les types de documents que votre application est capable d'ouvrir. À moins que vous ne listiez également vos UTI ici, ces UTI ne sont pas associés à votre application dans 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 l'éditer), "Editor" (vous pouvez afficher et éditer ce type de fichier), "None" (il n'est pas spécifié ce que vous pouvez faire avec ce fichier).
    • par exemple : Vous voulez que votre application soit associée à certains types de fichiers, identifiés soit par extension, par type MIME, soit par identificateur 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 d'un type UTI inconnu n'a tout simplement aucun effet du tout.

Test dynamique

Pour envoyer des activités, vous pouvez :

Pour recevoir des é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 sorte qu'il déclenche le 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).
  • Accrocher application:openURL:options: et toutes les autres méthodes qui ont été identifiées dans une analyse statique précédente.
  • Observer le comportement de l'application.
  • En outre, vous pourriez envoyer des fichiers spécifiques mal formés et/ou utiliser une technique de fuzzing.

Lisez comment ici.

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥