tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

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 : Ceci 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 destinés au partage de données au sein d'une application ou avec une autre application qui partage le même ID d'équipe, et ne sont pas conçus pour persister au-delà de la durée du processus d'application qui les crée, suivant les 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 des applications 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 aux moments où l'application est au premier plan (depuis iOS 9).
  • L'utilisation de presse-papiers nommés persistants est découragée au profit de conteneurs partagés en raison de préoccupations en matière de confidentialité.
  • La fonctionnalité Universal Clipboard introduite avec iOS 10, permettant de partager du 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 par inadvertance sur le presse-papiers global. De plus, les applications doivent être conçues pour empêcher l'utilisation abusive des données du presse-papiers global pour des actions non intentionnelles, et les développeurs sont encouragés à mettre en œuvre des mesures pour empêcher la copie d'informations sensibles dans le presse-papiers.

Analyse statique

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

  • generalPasteboard pour identifier l'utilisation du presse-papiers général à l'échelle du système.
  • pasteboardWithName:create: et pasteboardWithUniqueName pour créer des presse-papiers personnalisés. Vérifiez si la persistance est activée, bien que cela soit obsolète.

Analyse dynamique

L'analyse dynamique implique de hook ou de tracer des 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 obsolètes setPersistent: pour vérifier les paramètres de persistance.

Les détails clés à surveiller incluent :

  • Noms de presse-papiers et contenus (par exemple, vérifier les chaînes, les URL, les images).
  • Nombre d'éléments et types de données présents, en utilisant des vérifications de types de données standard et personnalisés.
  • Options d'expiration et locales 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 generalPasteboard toutes les 5 secondes pour détecter les changements et affiche les nouvelles données.

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

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

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks