歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

深入探索在野外發現的iOS漏洞利用鏈(六)

來源:本站整理 作者:佚名 時間:2019-09-17 TAG: 我要投稿

在這篇文章中,我們會分析在iOS設備上獲得普通權限shell的WebKit漏洞利用方法,這里的所有漏洞都可以在iOS上的沙盒渲染器進程(WebContent)中實現shellcode代碼執行。雖然iOS上的Chrome也會受到這些瀏覽器漏洞的攻擊,但攻擊者只是使用它們來定位Safari和iPhone的位置。
這篇文章首先會簡要介紹每個被利用的WebKit漏洞以及攻擊者是如何從中構建內存讀/寫原語的,然后概述了用于進行shellcode代碼執行的技術以及是如何繞過現有的JIT代碼注入緩解措施的。
有意思的是,這些漏洞中沒有一個漏洞繞過了在A12設備上啟用的基于PAC的JIT強化緩解措施。漏洞利用會按漏洞支持的最新iOS版本進行,如果漏洞利用中缺少該版本檢查,則會根據修復日期和之前的漏洞猜測支持的版本范圍。
沙盒渲染器進程利用首先獲得內存讀/寫功能,然后將shellcode注入JIT的區域來獲得本機的代碼執行權限。看起來似乎每次爆出新的重大可利用漏洞,新的漏洞就會被加入框架進行利用來做讀/寫檢查,然后插入到現有的漏洞利用框架中。對漏洞的利用使用的也是常見的漏洞利用技術,例如首先創建addrof和fakeobj原語,然后偽造JS對象以實現讀/寫。
對于許多漏洞利用程序,目前還不清楚它們是否已經在一些0day或1day上進行過成功的利用。現在也還不知道攻擊者是如何首先獲得這些漏洞信息的。通常,他們都是使用修復完發布后的公共漏洞來利用的。WebKit在將修復版本發送給用戶之前會發布漏洞的詳細信息。CVE-2019-8518是在2019年2月9日的WebKit HEAD中公開修復的,提交時為4a23c92e6883。此提交包含一個測試用例,該測試用例觸發了漏洞并導致對JSArray的越界訪問,這種情況通常很容易被利用。但是,該修復程序僅在2019年3月25日發布iOS 12.2的用戶中發布,是在有關漏洞的詳細信息公開后一個半月才發布的。技術能力突出的利用者可以在幾天時間內替換底層漏洞,從而獲得利用最新設備的能力,而無需自行挖掘新漏洞。這可能至少發生在以下某些漏洞中。
為了做比較,以下列出了其他瀏覽器供應商是如何處理這種漏洞窗口問題的:
Google與Chromium存在同樣的問題(例如,提交的52a9e67a477b修復了CVE-2018-17463)。但是,似乎最近的一些漏洞發布不再包含JavaScript測試用例。例如,我們的團隊成員Sergey Glazunov報告的以下兩個針對漏洞的修復:aa00ee22f8f7(針對漏洞1784)和4edcc8605461(針對漏洞1793)。
Microsoft將開源Chakra引擎中的安全修復程序保密處理,直到修復程序已發送給用戶才公開。然后發布修復后的程序并發布CVE編號。有關此示例,請參閱commit 7f0d390ad77d。但是,應該注意的是Chakra將很快被Edge中的V8(Chromium的JavaScript引擎)所取代。
Mozilla直接禁止了公共存儲庫中的安全修復,他們會直接發布下一個版本。此外,也不會公開用于觸發漏洞的JavaScript測試用例。
但是,值得注意的是,即使拿不到JavaScript測試用例,仍然可以通過代碼補丁中編寫PoC并最終利用漏洞。
 
0x01 漏洞利用1:iOS 10.0~10.3.2
此漏洞利用的目標是CVE-2017-2505,最初由lokihardt報告為Project Zero issue 1137,并于2017年3月11日在WebKit HEAD中通過提交4a23c92e6883修復。該修復程序隨后于5月15日發布給iOS 10.3.2用戶。有趣的是,漏洞利用exp幾乎與WebKit存儲庫中的漏洞報告和測試文件完全相同。可以在下圖中看到,左邊的圖像顯示在WebKit代碼存儲庫中發布的測試用例,右邊顯示了觸發漏洞的在野漏洞利用代碼的一部分。

該漏洞會導致使用受控數據寫入會實現JSC堆越界。攻擊者利用破壞受控JSObject的第一個QWord,改變其結構ID(將運行時類型信息與JSCell相關聯)來使其顯示為Uint32Array。這樣,它們實際上創建了一個假的TypedArray,會直接允許它們構造一個內存讀/寫原語。
 
0x02 漏洞利用2:iOS 10.3~10.3.3
該漏洞是針對CVE-2017-7064或者其變體的,其最初由lokihardt發現并報告為問題1236。該漏洞已于2017年4月18日在WebKit HEAD中通過提交ad6d74945b13修復,并在2017年7月19日發布給了iOS 10.3.3的用戶。 該漏洞會導致未初始化的內存被視為JS數組的內容,通過堆操作技術,可以控制未初始化的數據,此時可以通過雙精度和JSValues之間的類型混淆構造addrof和fakeobj原語,從而通過構造偽造的TypedArray獲得內存讀/寫。
 
0x03 漏洞利用3:iOS 11.0~11.3
此漏洞利用是WebKit漏洞181867,CVE編號可能是CVE-2018-4122。它于2018年1月19日在WebKit HEAD中修復,并且在2018年3月29日發布給了iOS 11.3用戶。該漏洞是典型的JIT side-effect問題。目前還不清楚攻擊者是否在2018年初就知道了這個漏洞。該漏洞通過混淆未初始化的double和JSValue數組構建addrof和fakeobj原語,然后通過再次偽造獲得內存讀/寫一個類型化的數組對象。
 
0x04 漏洞利用4:iOS 11.3~11.4.1
此漏洞利用是針對2018年5月16日提交中b4e567d371fd中修復的漏洞,并對應于WebKit漏洞報告185694。不幸的是,我們無法確定分配給此問題的CVE,但似乎該補丁程序在2018年7月9日發布給了iOS 11.4.1的用戶。這是另一個JIT side-effect問題,類似于前一個漏洞,再次構造fakeobj原語來偽造JS對象。但是,現在已經發布了Gigacage緩解措施。因此,構造偽ArrayBuffers / TypedArrays不再有用了。
該漏洞利用構造了一個fake unboxed double Array,并獲得了一個初始的,有限的內存讀/寫原語。然后使用該初始原語來禁用Gigacage緩解措施,然后繼續使用TypedArrays來執行后面的的漏洞利用。
 
0x05 漏洞利用5:iOS 11.4.1
該漏洞利用是針對CVE-2018-4438漏洞的,lokihardt報告為1649。這個漏洞是在2018年10月26日使用commit 8deb8bd96f4a修復的,并在2018年12月5日發布給了iOS 12.1.1用戶。該錯漏洞可以構建一個具有代理原型的數組,然后,可以通過在JIT編譯代碼中觸發更改,將此漏洞轉換為JIT side-effect問題。該漏洞與之前的漏洞非常相似,首先使用有限的JS陣列讀/寫禁用Gigacage緩解措施,然后通過TypedArrays執行完全讀/寫的shellcode進行注入。

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.nkppsz.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        秒速时时彩骗局