iOS UIPasteboard

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Le partage de données au sein et entre les applications sur les appareils iOS est facilité par le mécanisme UIPasteboard, qui est divisé en deux catégories principales :

  • Presse-papiers général à l'échelle du système : Il est utilisé pour partager des données avec n'importe quelle application et est conçu pour persister les données à travers les redémarrages de l'appareil et les désinstallations d'applications, une fonctionnalité disponible depuis iOS 10.

  • Presse-papiers personnalisés / nommés : Ceux-ci sont spécifiquement pour le partage de données au sein d'une application ou avec une autre application partageant le même ID d'équipe, et ne sont pas conçus pour persister au-delà de la durée de vie du processus d'application qui les crée, suite aux changements introduits dans iOS 10.

Les considérations de sécurité jouent un rôle significatif lors de l'utilisation des presse-papiers. Par exemple :

  • Il n'existe aucun mécanisme permettant aux utilisateurs de gérer les autorisations d'application pour accéder au presse-papiers.

  • Pour atténuer le risque de surveillance non autorisée en arrière-plan du presse-papiers, l'accès est restreint lorsque l'application est à l'avant-plan (depuis iOS 9).

  • L'utilisation de presse-papiers nommés persistants est déconseillée au profit des conteneurs partagés en raison de préoccupations de confidentialité.

  • La fonctionnalité Presse-papiers universel introduite avec iOS 10, permettant le partage de contenu entre les appareils via le presse-papiers général, peut être gérée par les développeurs pour définir l'expiration des données et désactiver le transfert automatique de contenu.

Il est crucial de s'assurer que les informations sensibles ne sont pas stockées involontairement sur le presse-papiers général. De plus, les applications doivent être conçues pour empêcher l'utilisation abusive des données du presse-papiers général pour des actions non intentionnelles, et les développeurs sont encouragés à mettre en place des mesures pour empêcher la copie d'informations sensibles dans le presse-papiers.

Analyse statique

Pour l'analyse statique, recherchez le code source ou binaire pour :

  • generalPasteboard pour identifier l'utilisation du presse-papiers général à l'échelle du système.

  • pasteboardWithName:create: et pasteboardWithUniqueName pour la création de presse-papiers personnalisés. Vérifiez si la persistance est activée, bien que cela soit obsolète.

Analyse dynamique

L'analyse dynamique implique l'accrochage ou le traçage de méthodes spécifiques :

  • Surveillez generalPasteboard pour une utilisation à l'échelle du système.

  • Tracez pasteboardWithName:create: et pasteboardWithUniqueName pour des implémentations personnalisées.

  • Observez les appels de méthode setPersistent: obsolètes pour vérifier les paramètres de persistance.

Les détails clés à surveiller comprennent :

  • Les noms des presse-papiers et contenus (par exemple, vérification des chaînes, des URL, des images).

  • Le nombre d'éléments et les types de données présents, en utilisant des vérifications de types de données standard et personnalisées.

  • Les options d'expiration et de local uniquement en inspectant la méthode setItems:options:.

Un exemple d'utilisation d'outil de surveillance est le moniteur de presse-papiers d'objection, qui interroge le presse-papiers général toutes les 5 secondes pour les changements et affiche les nouvelles données.

Voici un exemple de script JavaScript simple, inspiré de l'approche d'objection, pour lire et enregistrer les changements du presse-papiers toutes les 5 secondes :

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

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

Autres façons de soutenir HackTricks:

Dernière mise à jour