# 深入探討Chrome V8引擎中Sentinel Value的安全影響Sentinel value是算法中的一種特殊值,常用於循環或遞歸算法的終止條件。Chrome源碼中存在多種Sentinel value。之前有研究表明,通過泄露TheHole對象可以實現Chrome沙箱內任意代碼執行。谷歌團隊隨後對相關漏洞進行了修復。然而,V8中還存在其他不應泄露到JavaScript中的原生對象。本文將討論Uninitialized Oddball對象,這種繞過方法最早出現在Issue1352549中。值得注意的是,該方法目前仍可用於最新版V8,尚未被修復。這種方法具有一定的通用性:1. Issue1216437(CVE-2021-30551)中首次給出了泄露internal uninitialized oddball的poc。2. Issue1314616(CVE-2022-1486)中也直接泄露了UninitializedOddball。3. Issue1352549(NoCVE)的影響值得關注。這些案例表明,我們有必要重新審視可能受PatchGap影響的軟件。目前Skype仍未修復該漏洞。V8中的大部分原生對象定義在v8/src/roots/roots.h文件中,它們在內存中相鄰排列。一旦這些不應泄露的原生對象被泄露到JavaScript中,就可能實現沙箱內任意代碼執行。爲驗證該方法,我們可以修改V8的native函數,將Uninitialized Oddball泄露到JavaScript中。具體可以修改%TheHole()函數中相對isolate的偏移,使其返回Uninitialized Oddball。利用這種方法可以繞過HardenType保護,實現相對任意讀寫。分析優化後的JavaScript代碼可以發現,在檢查obj.prop時沒有驗證以obj.prop爲key的Value,直接按JavaScript語義計算偏移並獲取數組值,從而造成類型混淆。由於uninitialized_oddball在V8內存中排序靠前且更原始,比TheHole對象更容易僞造。在TheHole相關緩解被修復後,這種方法成爲繞過的首選。建議在優化後的函數返回數組元素時,增加對數組map的檢查,避免直接計算偏移返回數值。值得注意的是,Skype目前仍未修復該漏洞。在x86系統上,由於沒有地址壓縮,任意讀寫是相對整個進程的。雖然Skype開啓了ASLR,但由於文件較大,黑客只需對固定地址讀寫,就有很大概率讀寫到Skype文件內容。這大大降低了完成完整利用鏈的難度。這次PatchGap不僅涉及Issue1352549,新的繞過方法的公開也大幅降低了Issue1314616和Issue1216437等漏洞的利用難度。黑客幾乎不需要額外研究就可以完整利用之前任何泄露uninitialized_oddball的漏洞。V8中還存在其他多種Sentinel value,它們也可能存在類似安全隱患。建議在fuzz測試中考慮將%TheHole/uninitialized_Oddball等Sentinel value作爲變量加入,以發現其他潛在的利用原語。無論這類問題是否被正式視爲安全問題,它們都會大大縮短黑客實現完整利用的週期。我們需要持續關注和研究這一領域,以提高Chrome等軟件的安全性。
Chrome V8引擎Sentinel Value安全風險深度剖析
深入探討Chrome V8引擎中Sentinel Value的安全影響
Sentinel value是算法中的一種特殊值,常用於循環或遞歸算法的終止條件。Chrome源碼中存在多種Sentinel value。之前有研究表明,通過泄露TheHole對象可以實現Chrome沙箱內任意代碼執行。谷歌團隊隨後對相關漏洞進行了修復。
然而,V8中還存在其他不應泄露到JavaScript中的原生對象。本文將討論Uninitialized Oddball對象,這種繞過方法最早出現在Issue1352549中。值得注意的是,該方法目前仍可用於最新版V8,尚未被修復。
這種方法具有一定的通用性:
Issue1216437(CVE-2021-30551)中首次給出了泄露internal uninitialized oddball的poc。
Issue1314616(CVE-2022-1486)中也直接泄露了UninitializedOddball。
Issue1352549(NoCVE)的影響值得關注。
這些案例表明,我們有必要重新審視可能受PatchGap影響的軟件。目前Skype仍未修復該漏洞。
V8中的大部分原生對象定義在v8/src/roots/roots.h文件中,它們在內存中相鄰排列。一旦這些不應泄露的原生對象被泄露到JavaScript中,就可能實現沙箱內任意代碼執行。
爲驗證該方法,我們可以修改V8的native函數,將Uninitialized Oddball泄露到JavaScript中。具體可以修改%TheHole()函數中相對isolate的偏移,使其返回Uninitialized Oddball。
利用這種方法可以繞過HardenType保護,實現相對任意讀寫。分析優化後的JavaScript代碼可以發現,在檢查obj.prop時沒有驗證以obj.prop爲key的Value,直接按JavaScript語義計算偏移並獲取數組值,從而造成類型混淆。
由於uninitialized_oddball在V8內存中排序靠前且更原始,比TheHole對象更容易僞造。在TheHole相關緩解被修復後,這種方法成爲繞過的首選。
建議在優化後的函數返回數組元素時,增加對數組map的檢查,避免直接計算偏移返回數值。
值得注意的是,Skype目前仍未修復該漏洞。在x86系統上,由於沒有地址壓縮,任意讀寫是相對整個進程的。雖然Skype開啓了ASLR,但由於文件較大,黑客只需對固定地址讀寫,就有很大概率讀寫到Skype文件內容。這大大降低了完成完整利用鏈的難度。
這次PatchGap不僅涉及Issue1352549,新的繞過方法的公開也大幅降低了Issue1314616和Issue1216437等漏洞的利用難度。黑客幾乎不需要額外研究就可以完整利用之前任何泄露uninitialized_oddball的漏洞。
V8中還存在其他多種Sentinel value,它們也可能存在類似安全隱患。建議在fuzz測試中考慮將%TheHole/uninitialized_Oddball等Sentinel value作爲變量加入,以發現其他潛在的利用原語。
無論這類問題是否被正式視爲安全問題,它們都會大大縮短黑客實現完整利用的週期。我們需要持續關注和研究這一領域,以提高Chrome等軟件的安全性。