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

來源:互聯網
上載者:User

標籤:undle   .com   產生   data-   rac   etc   pivot   擷取   triple   

蒸米

-----------------

0x00 序

Ian [email protected]發布了CVE-2017-7047Triple_Fetch的exp和writeup[1],[email protected]也發表了關於Triple_Fetch的分析[2],但由於這個漏洞和exp有非常多的亮點,所以還剩很多可以深入挖掘的細節。因此,我們簡單分析一下漏洞形成的原因,並具體介紹一下漏洞利用的細節,以及如何利用這個漏洞做到iOS 10.3.2上的沙箱逃逸。

 

0x01 CVE-2017-7047 Triple_Fetch漏洞形成的原因

因為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:

 


 

0x02 Triple_FetchJOP &ROP&任意代碼執行

利用漏洞Triple_Fetch雖然可以控制pc,但是還不能控制棧,所以需要先做stack_pivot,好訊息是x0寄存器指向的xpc_uuid對象是我們可以控制的:

 


 

因此我們可以利用JOP跳轉到_longjmp函數作為來進行stack pivot,從而控制stack:

 


 

最終發送的用來做JOP的格式偽造的xpc_uuid對象如下:

 


 

控制了stack就可以很容易的寫rop了。但是beer目標不僅僅是執行rop,它還希望擷取目標進程的task port並且執行任意二進位檔案,因此除了exp,攻擊端還用mach msg發送了0x1000個帶有send right的port到目標進程中:

 


 

這些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 參考文獻

1、https://bugs.chromium.org/p/project-zero/issues/detail?id=1247

2、http://keenlab.tencent.com/zh/2017/08/02/CVE-2017-7047-Triple-Fetch-bug-and-vulnerability-analysis/

3、http://newosxbook.com/articles/PST2.html

 

英文版連結:https://jaq.alibaba.com/community/art/show?articleid=1020

------------------

* 蒸米,更多安全知識分享和熱點資訊,請關注阿里聚安全的官方部落格

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.