前言

Sentinel value(又名flag value/trip value/rogue value/signal value/dummy data)是算法中的一個特殊值,通常在循環或遞歸算法中作為終止條件的特殊值存在。 Chrome源碼中有很多Sentinel value。 from-leaking-thehole-to-chrome-renderer-rce和TheHole New World - how a small leak will sink a great browser (CVE-2021-38003)中,都介紹瞭如何通過洩露TheHole對象實現CVE-2021-38003和CVE-2022–1364的沙箱內任意代碼執行。在我們發文闡述該緩解繞過大概一周後,谷歌團隊也迅速把這兩個在野CVE同步更新到了github上。時間節點如下:

獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect

我們從Chrome源碼中可以看到對TheHole對象導致任意代碼執行的緩解修復。但實際上,除了TheHole對像外,v8中還有很多其他的原生對象,不應該洩漏到JS中。本文要討論的對像是:Uninitialized Oddball,該繞過方法的完整代碼最先出現在Issue1352549中,由Project0成員tiszka在exp中完整給出,值得一提的是,目前該方法目前仍可用於最新版V8,谷歌尚未針對該緩解繞過進行修復。

為引起廠商注意,這裡我們不得不提一下該方法的通用性:

01-glazunov在提交Issue1216437(CVE-2021-30551)中首先給出的poc便是洩露internal uninitialized oddball,雖然第二個poc給出是類型混淆,但是結合本文方法僅有第一個poc即可輕鬆完成RCE;

02-Issue1314616(CVE-2022-1486)中,p0成員btiszka在給出的poc中也是直接洩露UninitializedOddball,雖然當時從洩漏UninitializedOddball到RCE的利用尚未完全清晰,但也足以說明安全問題,作者在Issue中如下陳述:

"Exploitability Notes: Currently, I'm not sure if this primitive can lead to more than an infoleak. Exploitation is not as straightforward as ..."

03-Issue1352549(NoCVE) 請注意該PatchGap的影響!

我相信這三點就足以給我們充分的理由去複核下可能受PatchGap影響的軟件。截至目前,Skype尚未修復該漏洞。

Sentinel value in V8

我們可以在文件v8/src/roots/roots.h中看到v8的大部分原生對象。這些對像在內存中依次相鄰排布。

獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect

漏洞觸發後,一旦將不應該洩露到Javascript中的原生對象洩露了出去,即可實現沙箱內任意代碼執行。上一篇文章中TheHole對象的洩露也恰好說明了該問題。這裡我們也再次重申,該方法在最新版V8中尚未修復。

為了在最新版V8中驗證該方法,我們可以通過修改v8的native函數,將Uninitialized Oddball洩漏到JavaScript中,這裡我們直接對%TheHole()函數中相對isolate偏移(索引)進行修改即可實現返回值為Uninitialized Oddball。 ida對Runtime_TheHole函數反編譯後代碼如下所示:

獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect

調用%DebugPrint(%TheHole())如下輸出所示:

獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect

Bypass HardenType

該方法在Issue1352549中直接給出了所有源碼,我們直接對其進行提取和簡化即可,如下代碼所示:

獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect

我們對上述代碼在v8-11.0.0中測試,當%TheHole()返回UninitializedOddball時,仍舊可以實現相對任意讀。

獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect

對優化後的JavaScript的read函數去掉Prologue,留下關鍵反彙編如下所示:

獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect

在0x558b2000407c處,檢查了read函數的obj,確定其prop屬性正確,但沒有檢查以obj.prop為key的Value,而是直接按照JavaScript語義計算偏移,求取數組的數值。如此導致我們在計算的時造成類型混淆,實現任意讀。

如上彙編所示,當我們傳入uninitialized_oddball時,從0x558b20004086開始以obj為起點計算,最終在vmovsd xmm0,[r9+r11*8+0x7]指令中完成任意讀,數據保存在xmm0寄存器中。類似TheHole對象,由於uninitialized_oddball在v8內存中排序靠前,且對象內容更加原始,偽造更加容易,在TheHole緩解繞過修復後,該方法不失為繞過首選。同理,任意寫我們可以參考Issue1352549進行構造分析。由於原理雷同,這裡不再贅述。

這裡修復建議是,對優化後的函數返回數組元素時,添加對數組map的檢查,避免直接計算偏移返回數組數值。

PatchGap Alert

在我們談論PatchGap時,實際上我們不僅僅需要關注曾經出現的歷史漏洞,我們還要關注廠商在基礎組件中悄悄修復的漏洞。對Issue1352549分析後,我們迅速排查了可能存在PatchGap的軟件,這裡不得不指出,截至目前Skype仍舊沒有對該漏洞進行修復。在x86下任意讀寫會稍有不同。 x64下由於存在地址壓縮,在tuborgfun優化javascript生成的代碼中,v8會默認將基址加上。 x86由於沒有基址,因此任意讀寫是直接相對於整個進程的。如下彙編所示:

獨家揭秘通過洩露Sentinel Value繞過Chrome v8 HardenProtect

如上所示,esi為任意讀數組的索引,eax為固定值,edi為"out of bounds"檢測的數值,實際上調試時我們可以看到,edi為一個很大的數值,遠超過聲明時數組的最大範圍。

因此,在edi範圍內,可以任意讀寫。在具體做skype的exp時,雖然此時我們沒有地址壓縮帶來內存讀寫的便利,且skype開啟了aslr。但由於該文件太大,直接放在4GB內存中,黑客只需要對某個固定地址進行讀寫,便可以一個極大的概率讀寫skype文件中的內容。結合PE解析等傳統思路,不難完成整個漏洞利用鏈。基於此,我們無法保證黑客不能在短時間內完成整個利用鏈的適配。

這次PatchGap實際上不止需要排查Issue1352549,由於一個新的繞過方法的公開,直接導致了類似Issue1314616和Issue1216437的利用難度大幅度降低,黑客幾乎不需要花費任何研究成本,即可實現以往任何洩露uninitialized_oddball漏洞的完整利用,包括谷歌cluster fuzz提交的所有Issue中類似的漏洞。

總結

本文僅拋磚引玉,粗略來談通過洩露Sentinel value中的uninitialized_Oddball來實現任意讀原語。如第二部分所示,v8中的Sentinel value還有很多,實際上我們在測試Sentinel value的時候,也會經常容易遇到崩潰,不乏有非int3的崩潰出現。由於Uninitialized_Oddball和TheHole均已被證明可以在v8中實現環節繞過,我們有充分的理由懷疑其他Sentinel value也可能導致類似問題。

這也給我們一點提示:

01-其他uninitialized_Oddball洩露是否會輕鬆實現v8的RCE;

02-我們已經看到,谷歌會迅速將TheHole繞過進行修復,我們也看到利用垃圾回收實現ASLR繞過被長期擱置。這說明類似issue仍處在一個模糊邊界,即是否被正式當作安全問題對待。

03-如果02中的問題被當作正式安全問題對待,那麼在fuzzer中是否有必要考慮將%TheHole/uninitialized_Oddball等Sentinel value作為變量加入,來挖掘其他利用原語;

這裡不得不強調的是,無論該類問題是否被正式當作安全問題對待,它都會大大縮減黑客實現完整利用周期。

參考資料

https://bugs.chromium.org/p/chromium/issues/detail?id=1314616

https://bugs.chromium.org/p/chromium/issues/detail?id=1352549

https://bugs.chromium.org/p/chromium/issues/detail?id=1216437

https://starlabs.sg/blog/2022/12-the-hole-new-world-how-a-small-leak-will-sink-a-great-browser-cve-2021-38003/

欲了解更多信息,請訪問: