再談CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸

做者:蒸米

0x00 序
Ian Beer@google發佈了CVE-2017-7047Triple_Fetch的exp和writeup[1],chenliang@keenlab也發表了關於Triple_Fetch的分析[2],但因爲這個漏洞和exp有很是多的亮點,因此還剩不少能夠深刻挖掘的細節。所以,咱們簡單分析一下漏洞造成的緣由,並具體介紹一下漏洞利用的細節,以及如何利用這個漏洞作到iOS 10.3.2上的沙盒逃逸。html

0x01 CVE-2017-7047 Triple_Fetch漏洞造成的緣由
圖片描述spring

由於chenliang對漏洞成因的分析很是詳細,這裏我就簡單描述一下,由於使用XPC服務傳輸大塊內存的話很影響效率,蘋果爲了減小傳輸時間,對大於0x4000的OS_xpc_data數據會經過mach_vm_map的方式映射這塊內存,而後將這塊數據的send right以port的方式發送到另外一方。但這段內存的共享是基於共享物理頁的方式,也就是說發送方和接收方會共享同一塊內存,所以咱們將數據發送之後再在發送端對數據進行修改,接收方的數據也會發生變化。安全

所以經過race condition,可讓接收端獲得不一樣的數據(接收端認爲是相同的數據),若是接收端沒有考慮到這一點的話就可能會出現漏洞。好比咱們剛開始讓接收端獲取的字符串是@」ABCD」(包括@和」),那麼接收端會爲這個字符串分配7個字節的空間。隨後在進行字符串拷貝的時候,咱們將字符串變爲@"ABCDOVERFLOW_OVERFLOW_OVERFLOW",接收端會一直拷貝到遇到」符號爲止,這樣就形成了溢出。服務器

Triple_Fetch攻擊所選擇的函數是CoreFoundation裏的___NSMS1()函數,這個函數會對咱們構造的惡意字符串進行屢次讀取操做,若是在讀取的間隙快速對字符串進行三次修改,就會讓函數讀取到不一樣的字符串,讓函數產生判斷失誤,從而形成溢出並讓咱們控制pc,這也是爲何把這個漏洞稱爲Triple_Fetch的緣由。下圖就是攻擊所使用的三組不一樣的字符串:
圖片描述併發

攻擊所選擇的NSXPC服務是「com.apple.CoreAuthentication.daemon」。對應的二進制文件是/System/Library/Frameworks/LocalAuthentication.framework/Support/coreauthd。緣由是這個進程是root權限而且能夠調用processor_set_tasks() API從而獲取系統其餘進程的send right[3]。下圖是控制了pc後的crash report:
圖片描述app

0x02 Triple_FetchJOP &ROP&任意代碼執行
利用漏洞Triple_Fetch雖然能夠控制pc,可是還不能控制棧,因此須要先作stack_pivot,好消息是x0寄存器指向的xpc_uuid對象是咱們能夠控制的:
圖片描述函數

所以咱們能夠利用JOP跳轉到_longjmp函數做爲來進行stack pivot,從而控制stack:
圖片描述
圖片描述post

最終發送的用來作JOP的格式僞造的xpc_uuid對象以下:
圖片描述ui

控制了stack就能夠很容易的寫rop了。可是beer目標不只僅是執行rop,它還但願獲取目標進程的task port而且執行任意二進制文件,所以除了exp,攻擊端還用mach msg發送了0x1000個帶有send right的port到目標進程中:
圖片描述google

這些port的mach msg在內存中的位置和內容以下(msgh_id都爲0x12344321):
圖片描述

隨後,exp採用rop的方法對這些port進行遍歷而且發送回發送端:
圖片描述

隨後,攻擊端會接收mach msg,若是獲取到的msgh_id爲0x12344321的消息,說明咱們成果獲得了目標進程的task port:
圖片描述

獲得了task_port後,sploit()函數就結束了,開始進入do_post_exploit()。do_post_exploit()也作了很是多的事情,首先是利用coreauthd的task port以及processor_set_tasks()獲取全部進程的task port。這是怎麼作到的呢?

利用coreauthd的task port咱們能夠利用mach_vm_* API任意的修改coreauthd的內存以及寄存器,因此咱們須要先開闢一段內存做爲stack,而後將sp指向這段內存,再將pc指向咱們想要執行的函數地址就可讓目標進程執行任意的函數了,具體實如今call_remote()中:
圖片描述

隨後咱們控制coreauthd依次執行task_get_special_port(), processor_set_default(), host_processor_set_priv(),processor_set_tasks()等函數,來得到全部進程的task port並返回給攻擊端(具體實如今get_task_ports())中。接着,攻擊端會遍歷這個列表並篩選出amfid,launchd,installd,springboard這四個進程的task port。而後利用以前patch amfid的技巧,對amfid打補丁。最後再啓動debugserver。

其實這個exp不但能夠執行debugserver,還能夠用來在沙盒外執行任意的二進制文件。只要把pocs文件夾下的hello_world二進制文件替換成你本身的想要執行的二進制文件,編譯安裝後,點擊ui中的exec bundle binary便可:
圖片描述

具體怎麼作到的呢?祕密在spawn_bundle_binary()函數中,先在目標進程中調用chmod將bin改成0777,而後經過一系列的posix_spawn API(相似fork())在目標進程中執行該bin文件。

沙盒外的代碼執行提供了更多能夠攻擊內核的接口。而且能夠讀取甚至修改其餘應用或者系統上的文件。好比,漏洞能夠讀取一些我的隱私數據(好比,短信,聊天記錄和照片等)併發送到黑客的服務器上:
圖片描述

因此建議你們早日更新iOS系統到最新版本。

0x03 總結
本文介紹了beer發現的通用NSXPC漏洞。另外,還分析了iOS用戶態上,用JOP作stack pivot以及利用ROP作到任意代碼執行的攻擊技術。固然,這些漏洞只是作到了沙盒外的代碼執行,想要控制內核還須要一個或兩個XNU或者IOKit的漏洞才行,而且蘋果已經修復了yalu102越獄用的kpp繞過方法,所以,即便有了Triple_Fetch漏洞,離完成所有越獄還有很大一段距離。

0x04 參考文獻
一、https://bugs.chromium.org/p/p...
二、http://keenlab.tencent.com/zh...
三、http://newosxbook.com/article...

英文版連接https://jaq.alibaba.com/commu...

* 做者:蒸米,更多安全知識分享和熱點信息,請關注阿里聚安全的官方博客

相關文章
相關標籤/搜索