☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - 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** 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 [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
Le [`UIPasteboard`](https://developer.apple.com/documentation/uikit/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](https://forums.developer.apple.com/thread/13760), ce qui atténue la surveillance du pasteboard en arrière-plan. * [Apple met en garde contre les pasteboards nommés persistants](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc) 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`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), 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:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc) ou [`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc). 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:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc) 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](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275). * Obtenez le **nombre d'éléments** avec `numberOfItems`. * Vérifiez l'**existence de types de données standard** avec les [méthodes de commodité](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142), 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:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Vous pouvez inspecter des types de données plus concrets, tels qu'une image en tant que public.png et public.tiff ([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)) 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:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) 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](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)) lit les éléments du pasteboard toutes les 5 secondes, s'il y a quelque chose de nouveau, il l'imprime : ```javascript 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 🎥 - 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)**.