2014SyScan360--盤古如何實現完美越獄
原創作為中國本土技術團隊,時隔半年后,6月24日,盤古團隊發布了iOS7.1.1完美越獄工具,這款工具在一片質疑聲中得到了國外知名的越獄大神iH8sn0w的中肯評價:“除了帶有盜版商店的可選安裝之外以及企業認證之外,Pangu并沒有附帶任何惡意軟件。也就是說,用戶在安裝之后不會有安全方面的問題,盤古是一個非常成熟的越獄工具。”
而根據來自盤古數據的統計,從完美越獄工具發布到上周六,這短短的18天,盤古網站瀏覽量達到500萬,后成功越獄的設備數量達到300萬,來自中國與美國的iPhone是真正的主力。
來自盤古團隊的獨立安全研究員Windknown與我們分享盤古團隊如何發現并用來實現完美越獄的漏洞。Windknown介紹了代碼簽名繞過、內核信息泄漏、內核內存覆蓋三個漏洞的細節,并且演示如何針對這些漏洞編寫溢出,從而使得盤古越獄能在iOS設備上存活。
代碼簽名繞過
繞過代碼簽名的思路很簡單,這是蘋果的特性,可以利用其重新導出而迫使它加載。完美越獄,希望能夠在手機重啟過程當中,找到機會執行盤古的代碼,然后去溢出內核,把內核當中的簽名、檢查、沙盒等保護去掉。這當中我們要做到兩點,一個要有內核的漏洞,并且在比較早的時候觸發這個漏洞。第二是找到未簽名的代碼,我們要繞過未簽名的漏洞。
盤古通過Launchd的代碼加載所有的Plist配置服務的。它通過這個文件定位文件當中的XPCD文件,這里面需要注意XPCD是需要認證的。蘋果把所有的DYLIB放在緩存文件中,這可以通過這個標志位,構造的一個加載但仍然需要有簽名檢查的,還是需要繞過它簽名檢查的機制。
內核信息泄漏
Early_random對于64位的,它通過簡單的暴力猜解就可以獲取所有的值。對于32位,需要知道一個輸入值才可以恢復剩余的值。32位的Output中返回32個指針,62位的Output中返回16個指針,這是非常簡單的代碼。
這里面關鍵的一個東西就是這個參數,叫OutputCount。真正功能的處理調用,是在對應的ExternalMethod時,你會重寫ExternalMethod。在調用ExternalMethod的時候,它首先在站中準備了一個OutputCount,準備了16個數據的長度,然后它把這個參數再傳遞給,反映給上層,這就是一個正常的行為。
可以看到如果大家通過ID一分析的話,可以看到ID驅動在重載externalMethod的話有兩種方式。一種方式是它在自己類的成員中有一個對象,有一個成員是method的數組。如果不這樣調用的情況下,在代碼實現的過程中,他可能根本沒有關心需要設置初參,就像Outputcount,Outputcount里面,給了16個數據的長度,并告知16個數據長度,如果沒有做,那就是零,它在調用數據過程當中會把這16個數據調用給用戶。到目前為止,盤古在使用的數據,可以把那些所有的隨機值全部的恢復。
內核內存覆蓋
最后的漏洞,可以利用它來達到寫任何內核內存的目的。首先要觸發漏洞,打開一個IOHIDEventService服務,設置一個通知端口,映射隊列內存,在映射隊列內存的結尾可以找到mach-msg-header-t結構,修改mach-msg-header-t指向我們的虛假port,等待隊列有數據后向虛假port發送消息。
代碼執行其實有很多種不同的思路,一個最簡單的思路就是覆蓋一個內核對象的指針,這個很簡單,首先你有任意讀,我可以就把整個內核對象的內容讀出來,然后僅僅修改vtable指針,再覆蓋整個內核對象,將對象放在連續的代碼之間。
最后,Windknown表示“三個漏洞都是目前都沒有被修補的,完美越獄至少4-5個漏洞,exploit對兼容性要求比較高,任何正常軟件都很難做到一夜之間下載到百萬,而越獄就可以,這也就是它的魅力所在。”我們也希望作為中國最頂尖的技術團隊之一,盤古能繼續保持佳績,并在國際上打開影響力!