華文網

關於iOS 10.3.1 ziVA內核漏洞利用的簡單分析

Zimperium放出了iOS 10.3.1的內核漏洞的利用,配合P0的過沙箱漏洞可以做到內核的任意讀寫。

作者:@蒸米spark

先回答吃瓜群眾的幾個關鍵的問題:

1. 這是越獄麼?不是。但離越獄已經很近了,大概66%,對非 iphone7的用戶已經90%以上了。

2. iOS 10.3.2和iOS 10.3.3可以用麼?不可以,並且蘋果已經關閉了10.3.1的簽名伺服器,現在已經無法刷10.3.1版本了。

OK,吃瓜群眾可以撤了,下面要講的是這個漏洞利用的簡單分析。

這次放出的代碼不是一個POC,而是一個完整的內核利用exp。研究價值是非常巨大的。EXP 的下載地址是:

https://github.com/doadam/ziVA

這個漏洞利用所做的事情就是在沙箱外,利用三個內核驅動的漏洞獲取內核任意讀寫的能力,並將自己的進程提權為root。

整個EXP的流程如下:

exp 流程

1. 首先執行system("id");表明自己是普通的 mobile 用戶。

2. 然後調用offsets_init()獲取一些偏移量,這裡只獲取了iPhone 6 10.2的偏移量,想要其他的機型和版本的話,還要自己去計算。

3. initialize_iokit_connections()所做的是初始化一些 iokit userclient,包括AppleAVEDriver以及IOSurfaceRoot。

4. heap_spray_init()是堆噴前的準備,這裡用到了一種新的堆風水姿勢:利用偽造的sysctl buffer和 IOSurface的external method來進行堆噴。

5. kernel_read_leak_kernel_base()首先利用了AppleAVE.kext的CVE-2017-6989內核資訊洩露洞獲取了IOSurface物件在內核堆上的位址,然後利用IOSurface的一個race condition漏洞(貌似是CVE-2017-6979)獲取了IOFence的vtable,從而計算出kernel slide。

6. offsets_set_kernel_base()和heap_spray_start_spraying()分別設置了kernel base和並根據計算出來的 kernel slide構造rop並進行了堆噴。

7. apple_ave_pwn_use_fake_iosurface()利用了AppleAVE.kext的CVE-2017-6995類型混淆漏洞來偽造 iosurface物件控制pc,做到內核記憶體的任意讀寫。

8. test_rw_and_get_root()利用內核記憶體的任意讀寫修改內核堆中的credentials資訊,並將自己的進程提升為 root 許可權。

9. 最後再執行一次 system("id");證明exp成功獲取了 root 許可權。

總結

雖然這個exp的利用需要在沙箱外才行,但因為 PJ0已經發佈了一個沙箱外代碼執行的 exp,所以這兩個 exp 配合即可做到iOS 10.3.1上的內核任意讀寫。隨後繞過kpp並給kernel打補丁後,即可完成非完美越獄。可以說目前越獄的進度已經達到了66% (Sandbox Escape 33% + Kernel RW 33%)。