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

11 KiB

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

Le UIPasteboard permet de partager des données au sein d'une application et entre une application et d'autres applications. Il existe deux types de pasteboards :

  • pasteboard général à l'échelle du système : pour partager des données avec n'importe quelle application. Persistant par défaut après le redémarrage de l'appareil et la désinstallation de l'application (depuis iOS 10).
  • pasteboards personnalisés / nommés : pour partager des données avec une autre application (ayant le même ID d'équipe que l'application à partir de laquelle partager) ou avec l'application elle-même (ils ne sont disponibles que dans le processus qui les crée). Non persistant par défaut (depuis iOS 10), c'est-à-dire qu'il n'existe que jusqu'à ce que l'application propriétaire (créatrice) se ferme.

Quelques considérations de sécurité :

  • Les utilisateurs ne peuvent pas accorder ou refuser l'autorisation aux applications de lire le pasteboard.
  • Depuis iOS 9, les applications ne peuvent pas accéder au pasteboard en arrière-plan, ce qui atténue la surveillance du pasteboard en arrière-plan.
  • Apple met en garde contre les pasteboards nommés persistants et déconseille leur utilisation. À la place, des conteneurs partagés doivent être utilisés.
  • À partir d'iOS 10, il existe une nouvelle fonctionnalité Handoff appelée Presse-papiers universel qui est activée par défaut. Elle permet le transfert automatique du contenu du pasteboard général entre les appareils. Cette fonctionnalité peut être désactivée si le développeur choisit de le faire et il est également possible de définir une date et une heure d'expiration pour les données copiées.

Il est donc important de vérifier que des informations sensibles ne sont pas enregistrées dans le pasteboard général.
Il est également important de vérifier qu'une application n'utilise pas les données du pasteboard général pour effectuer des actions, car une application malveillante pourrait altérer ces données.

Une application peut également empêcher ses utilisateurs de copier des données sensibles dans le presse-papiers (ce qui est recommandé).

Analyse statique

Le pasteboard général à l'échelle du système peut être obtenu en utilisant generalPasteboard, recherchez dans le code source ou le binaire compilé cette méthode. L'utilisation du pasteboard général à l'échelle du système doit être évitée lorsqu'il s'agit de données sensibles.

Des pasteboards personnalisés peuvent être créés avec pasteboardWithName:create: ou pasteboardWithUniqueName. Vérifiez si les pasteboards personnalisés sont définis comme persistants car cela est déconseillé depuis iOS 10. Un conteneur partagé doit être utilisé à la place.

Analyse dynamique

Accrochez ou tracez les éléments suivants :

  • generalPasteboard pour le pasteboard général à l'échelle du système.
  • pasteboardWithName:create: et pasteboardWithUniqueName pour les pasteboards personnalisés.

Vous pouvez également accrocher ou tracer la méthode dépréciée setPersistent: et vérifier si elle est appelée.

Lors de la surveillance des pasteboards, plusieurs détails peuvent être récupérés de manière dynamique :

  • Obtenez le nom du pasteboard en accrochant pasteboardWithName:create: et en inspectant ses paramètres d'entrée ou pasteboardWithUniqueName et en inspectant sa valeur de retour.
  • Obtenez le premier élément de pasteboard disponible : par exemple, pour les chaînes, utilisez la méthode string. Ou utilisez l'une des autres méthodes pour les types de données standard.
  • Obtenez le nombre d'éléments avec numberOfItems.
  • Vérifiez l'existence de types de données standard avec les méthodes de commodité, par exemple hasImages, hasStrings, hasURLs (à partir d'iOS 10).
  • Vérifiez les autres types de données (généralement des UTI) avec containsPasteboardTypes:inItemSet:. Vous pouvez inspecter des types de données plus concrets, tels qu'une image en tant que public.png et public.tiff (UTIs) ou des données personnalisées telles que com.mycompany.myapp.mytype. N'oubliez pas que, dans ce cas, seules les applications qui déclarent leur connaissance du type sont capables de comprendre les données écrites dans le pasteboard. Récupérez-les à l'aide de itemSetWithPasteboardTypes: et en définissant les UTI correspondants.
  • Vérifiez les éléments exclus ou expirants en accrochant setItems:options: et en inspectant ses options pour UIPasteboardOptionLocalOnly ou UIPasteboardOptionExpirationDate.

Si vous ne recherchez que des chaînes, vous pouvez utiliser la commande objection ios pasteboard monitor :

Se connecte à la classe UIPasteboard d'iOS et interroge le pasteboard général toutes les 5 secondes pour obtenir des données. Si de nouvelles données sont trouvées, différentes de la précédente interrogation, ces données seront affichées à l'écran.

Vous pouvez également créer votre propre moniteur de pasteboard qui surveille des informations spécifiques comme indiqué ci-dessus.

Par exemple, ce script (inspiré du script derrière le moniteur de pasteboard d'objection) lit les éléments du pasteboard toutes les 5 secondes, s'il y a quelque chose de nouveau, il l'imprime :

const UIPasteboard = ObjC.classes.UIPasteboard;
    const Pasteboard = UIPasteboard.generalPasteboard();
    var items = "";
    var count = Pasteboard.changeCount().toString();

setInterval(function () {
      const currentCount = Pasteboard.changeCount().toString();
      const currentItems = Pasteboard.items().toString();

      if (currentCount === count) { return; }

      items = currentItems;
      count = currentCount;

      console.log('[* Pasteboard changed] count: ' + count +
      ' hasStrings: ' + Pasteboard.hasStrings().toString() +
      ' hasURLs: ' + Pasteboard.hasURLs().toString() +
      ' hasImages: ' + Pasteboard.hasImages().toString());
      console.log(items);

    }, 1000 * 5);

Références

{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}

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