獨家揭祕通過泄露Sentinel Value繞過Chrome v8 HardenProtect

2022-12-20 22:12:02

前言

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/

欲了解更多信息,請訪問: https://mp.weixin.qq.com/s?__biz=Mzg4MDcxNTc2NA==&tempkey=MTE5Nl82T2RGMWw4QUErWEVhR0NGQjNEWG9oRlJmc21taEJ0Y0NnVE1mWGEyTEs0V1N0Z2tiXzJGX3N5Um8tR2JrelVoMDJTcXFLUHFFYXZSM1RwZ1dNS0QzbFVqQ29TLURZOEp1VTZ6Y2FDMndKSzdHQnVNNmZtU082RTBIZl81WmQwMnQ3WjN6OGxGTld6aTJhQlhGWnFCc3N3OHRlSVlSc3BXWndwUHJ3fn4%3D&chksm=cf71b6aef8063fb860f5a0bcc5427327edc5f556930b2708ac766734133b7e12935ce97bfde0&token=71808693&lang=zh_CN#rd

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

推薦文章

Layer2 格局劇變:Base 生態有哪些關鍵亮點?

在激烈競爭的 L2 賽道中,原本穩坐釣魚臺的 Arbitrum 和 Optimism 似乎面臨着前...

加密泡泡啊
71 1個月前

XRP 漲至 7.5 美元?分析師告訴 XRP 大軍為純粹的煙火做好准備!

加密貨幣分析師 EGRAG 表示,XRP 即將迎來關鍵時刻,價格可能大幅上漲,這取決於能否突破關鍵...

加密泡泡啊
73 1個月前

以太坊ETF通過後 將推動山寨幣和整個加密生態大爆發

比特幣ETF通過後市場動蕩,以太坊ETF交易前景分析 比特幣ETF通過後,市場出現了先跌後漲的走勢...

加密泡泡啊
78 1個月前

ZRO為啥這么能漲?

ZRO概述 ZRO代幣,全稱為LayerZero,是LayerZero協議的本地代幣,旨在作為治理...

加密泡泡啊
66 1個月前

今晚ETH迎來暴漲時代 op、arb、metis等以太坊二層項目能否跑出百倍幣?

北京時間7月23日晚上美股开盤後 ETH 的ETF开始交易。ETH的裏程碑啊,新的時代开啓。突破前...

BNBCCC
75 1個月前

Mt Gox 轉移 28 億美元比特幣 加密貨幣下跌 ETH ETF 提前發行

2014 年倒閉的臭名昭著的比特幣交易所 Mt Gox 已向債權人轉移了大量比特幣 (BTC),作...

加密圈探長
71 1個月前