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

10 KiB

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :

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 bien connue feuille d'activité de partage accessible 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 jugés inappropriés 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 du partage UIActivity, vous devriez porter 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 (URLs, texte, une image) sur init(activityItems:applicationActivities:).

Si vous avez le code source, vous devriez examiner le 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, le cas échéant.

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 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.
  • 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: (ou sa version obsolète UIApplicationDelegate application:openURL:sourceApplication:annotation:) 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 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 :

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.
  • Observer le comportement de l'application.
  • De plus, vous pourriez envoyer des fichiers spécifiquement malformés et/ou utiliser une technique de fuzzing.

Lisez comment ici.

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :