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上。時間節點如下:
我們從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尚未修復該漏洞。
我們可以在文件v8/src/roots/roots.h中看到v8的大部分原生對象。這些對象在內存中依次相鄰排布。
漏洞觸發後,一旦將不應該泄露到Javascript中的原生對象泄露了出去,即可實現沙箱內任意代碼執行。上一篇文章中TheHole對象的泄露也恰好說明了該問題。這裏我們也再次重申,該方法在最新版V8中尚未修復。
爲了在最新版V8中驗證該方法,我們可以通過修改v8的native函數,將Uninitialized Oddball泄漏到JavaScript中,這裏我們直接對%TheHole()函數中相對isolate偏移(索引)進行修改即可實現返回值爲Uninitialized Oddball。ida對Runtime_TheHole函數反編譯後代碼如下所示:
調用%DebugPrint(%TheHole())如下輸出所示:
該方法在Issue1352549中直接給出了所有源碼,我們直接對其進行提取和簡化即可,如下代碼所示:
我們對上述代碼在v8-11.0.0中測試,當%TheHole()返回UninitializedOddball時,仍舊可以實現相對任意讀。
對優化後的JavaScript的read函數去掉Prologue,留下關鍵反匯編如下所示:
在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時,實際上我們不僅僅需要關注曾經出現的歷史漏洞,我們還要關注廠商在基礎組件中悄悄修復的漏洞。對Issue1352549分析後,我們迅速排查了可能存在PatchGap的軟件,這裏不得不指出,截至目前Skype仍舊沒有對該漏洞進行修復。在x86下任意讀寫會稍有不同。x64下由於存在地址壓縮,在tuborgfun優化javascript生成的代碼中,v8會默認將基址加上。x86由於沒有基址,因此任意讀寫是直接相對於整個進程的。如下匯編所示:
如上所示,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
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
標題:獨家揭祕通過泄露Sentinel Value繞過Chrome v8 HardenProtect
地址:https://www.torrentbusiness.com/article/21300.html
標籤: