0
本文作者: 李勤 | 2018-08-13 20:41 |
雷鋒網(wǎng)編者按:蘋果公司在 macOS 和 iOS 中都采用了沙盒機(jī)制保護(hù)系統(tǒng)不受惡意軟件的攻擊。在世界著名的黑客大會 DEFCON 的這次演講中,來自阿里安全的安全研究員分析了最新版的 iOS 中的沙盒機(jī)制和以及如何獲取沙盒配置文件。然后,討論了 iOS 上的 IPC 機(jī)制,并回顧幾個經(jīng)典的沙盒逃逸漏洞。隨后,安全研究員展示了 iOS 11.4 上的兩個沙箱逃逸 0day 漏洞。
該文由阿里安全投稿,作者:蒸米,白小龍
蘋果公司在macOS 10.5中把沙盒作為“SeatBelt”引入,它提供了MACF策略的第一個全面實(shí)現(xiàn)。在macOS上成功試用后,蘋果公司又將沙盒機(jī)制應(yīng)用于iOS 6中。隨著新的系統(tǒng)的發(fā)布或新的威脅出現(xiàn),沙盒的鉤子數(shù)量一直在穩(wěn)步的增長。如下是iOS/macOS每個版本中鉤子的數(shù)量:
一開始,蘋果的沙盒使用黑名單方式,這意味著蘋果將已知的危險API整合在一起,并阻止它們,默認(rèn)情況下允許所有其他人使用。隨著蘋果沙盒的發(fā)展,它采用了一種白名單的方式,拒絕所有的API,只允許蘋果信任的安全接口。
在MacOS中,配置文件可見并存儲在/System/Library/Sandbox/Profiles中。在iOS中,配置文件被硬編譯到了/usr/libexec/sandboxd中。解碼沙箱配置文件很困難,但我們可以遍歷所有Mach服務(wù)根據(jù)返回值獲取mach-lookup列表(例如,通過Jonathan Levin的sbtool)。
為了找到漏洞,我們需要反匯編和分析包含相關(guān)Mach服務(wù)的處理函數(shù)的二進(jìn)制文件。/System/Library/ LaunchDaemons包含了大多數(shù)Mach服務(wù)的配置plist。在plist文件中,“ProgramArguments”字段顯示了二進(jìn)制文件的路徑,“MachServices”顯示了相關(guān)的mach服務(wù)。
Mach消息包含類型化數(shù)據(jù),可以包括端口權(quán)限和對大內(nèi)存區(qū)域的引用。XPC消息建立在Mach消息之上,NSXPC消息建立在XPC消息之上。通過Mach消息,沙盒應(yīng)用程序可以與未被沙盒的Mach(MIG)服務(wù),XPC服務(wù)和NSXPC服務(wù)進(jìn)行通信。
bluetoothd的“com.apple.server.bluetooth”Mach服務(wù)中有132個函數(shù)(從0xFA300開始)。 藍(lán)牙通過“com.apple.server.Bluetooth”與沙盒應(yīng)用程序和其他非沙盒的進(jìn)程(例如,SpringBoard)進(jìn)行通信。進(jìn)程可以使用BTSessionAttach為bluetoothd創(chuàng)建session_token,然后使用BTLocalDeviceAddCallbacks 為事件通知注冊回調(diào)。
但是,Bluetoothd僅使用會話令牌來識別進(jìn)程,這意味著我們可以使用沙盒應(yīng)用程序通過會話令牌來劫持藍(lán)牙和沙盒外的進(jìn)程之間的通信(CVE-2018-4087)。
漏洞形成的原因是ses_token太容易被暴力破解了。它只有0x10000(0x0000 - 0xFFFF)個可能的值。Apple通過向每個會話添加user_id (= arc4random()) 來修復(fù)此問題,只有進(jìn)程本身知道user_id,并且bluetoothd將檢查map[ses_token] == user_id。
如前所述,user_id = arc4random()= [0x00000000-0xFFFFFFFF]。如果我們知道session_token,我們?nèi)匀豢梢酝ㄟ^user_id暴力劫持通信。 但這需要很長時間(約12小時)。如果沒有user_id驗(yàn)證的話,還有沒有其他的回調(diào)注冊函數(shù)呢?答對了!0xFA365 BTAccessoryManagerAddCallbacks()!
但是,通過BTAccessoryManagerAddCallbacks()向bluetoothd發(fā)送消息后,沒有任何反應(yīng)! 最后,我發(fā)現(xiàn)了這個問題。 僅當(dāng)iOS設(shè)備連接到新設(shè)備時才會觸發(fā)回調(diào)事件,這意味著我們需要通過手動單擊藍(lán)牙設(shè)備來觸發(fā)回調(diào)。
CallBacks 1(需要的時間很長),CallBacks 2(很難觸發(fā)),再來一次CallBacks 3! 這次,我們又發(fā)現(xiàn)了一個可以注冊回調(diào)函數(shù)的新函數(shù),并且它很容易觸發(fā)!
0xFA329 BTDiscoveryAgentCreate()可以為發(fā)現(xiàn)代理創(chuàng)建回調(diào),然后我們可以使用0xFA32B BTDiscoveryAgentStartScan()來觸發(fā)回調(diào)而無需手動點(diǎn)擊!
我們的目標(biāo)不僅是控制PC指針,還控制要控制整個進(jìn)程。下一步是創(chuàng)建ROP鏈并對目標(biāo)進(jìn)程執(zhí)行堆噴射。在這種情況下,我們使用MACH_MSGH_BITS_COMPLEX Mach消息以及MACH_MSG_OOL_DESCRIPTOR格式。如果我們發(fā)送消息并且沒有接收消息,則ROP鏈將持續(xù)保留在目標(biāo)的內(nèi)存空間中。經(jīng)過多次測試,我們可以找到一個MAGIC_ADDR 在 0x105400000這個地址。
我們可控制的寄存器:X3,X4,X5,X19,X20。 最后一個BR是X4。到目前為止,我們只能做BOP(JOP)。但是這樣的話,我們很難控制程序流程。因此,我們需要一個stack pivot來控制堆棧并且從BOP 轉(zhuǎn)換為 ROP。
在libsystem_platform.dylib中可以找到一個很棒的stack pivot gadget。如果我們可以控制x0,那么我們就可以控制sp。
端口為IPC提供了端點(diǎn)。消息可以發(fā)送到端口或從端口接收。端口可以包含權(quán)限,并且端口權(quán)限可以在消息中傳遞。一個進(jìn)程最重要的端口是mach_task_self()。可以通過其任務(wù)端口來控制進(jìn)程的內(nèi)存和所有寄存器。
我們可以使用mach_vm_allocate(target_task_port,&remote_addr,remote_size,1)在遠(yuǎn)程進(jìn)程中分配內(nèi)存。mach_vm_write(target_task_port,remote_address,local_address,length)可用于將數(shù)據(jù)復(fù)制到遠(yuǎn)程進(jìn)程中。 thread_create_running(target_task_port,ARM_THREAD_STATE64,&thread_state,stateCnt和thread_port)可用于在遠(yuǎn)程進(jìn)程中創(chuàng)建新線程。因此,如果我們可以獲得一個進(jìn)程的任務(wù)端口。 我們可以通過mach msg輕松控制整個過程。
1. 我們可以使用mach_port_insert_right(mach_task_self(),port,port,MACH_MSG_TYPE_MAKE_SEND)向端口插入發(fā)送權(quán)限。此類端口可以通過具有MACH_MSG_PORT_DESCRIPTOR類型的OOL消息發(fā)送。
2. 在大多數(shù)情況下,mach_task_self()返回0x103,所以我們可以在不使用ROP的情況下使用0x103(調(diào)用mach_task_self())。
3. 為了將任務(wù)端口發(fā)送到我們的pwn應(yīng)用程序,我們需要知道我們的pwn應(yīng)用程序的端口號。但是我們不能用launchd來幫助我們。幸運(yùn)的是,端口號可以通過(0x103 + 0x100 * N)猜測。這就是我們向遠(yuǎn)程進(jìn)程發(fā)送0x1000端口的原因(為了提高成功率)。
但是在iOS 11中,蘋果加入了一個新的緩解機(jī)制用來控制沙盒中的app獲取task port:
雖然我們無法很容易的獲取task port,但是我們可以利用下面的ROP gadget來調(diào)用任意函數(shù):
使用這些ROP,我們可以打開更多的攻擊面并進(jìn)一步的攻擊內(nèi)核。
1. MacOS and *OS Internals http://newosxbook.com/
2. Pangu 9 Internals https://www.blackhat.com/docs/us-16/materials/us-16-Wang-Pangu-9-Internals.pdf
3. triple_fetch https://bugs.chromium.org/p/project-zero/issues/detail?id=1247
4. https://blog.zimperium.com/cve-2018-4087-poc-escaping-sandbox-misleading-bluetoothd/
5. Mach portal https://bugs.chromium.org/p/project-zero/issues/detail?id=965
在6月份的時候,文章中提到的兩個“0day”漏洞被我們提交給了蘋果,在iOS 11.4.1和iOS 12 beta中被修復(fù)了 (CVE-2018-4330和CVE-2018-4327)。但是在iOS 11.4以及之前版本中都可以被利用,請盡快升級您的iOS以避免潛在的攻擊。
via 雷鋒網(wǎng),雷鋒網(wǎng),雷鋒網(wǎng),重要的事情說三遍。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。