🎉 攢成長值,抽華爲Mate三折疊!廣場第 1️⃣ 2️⃣ 期夏季成長值抽獎大狂歡開啓!
總獎池超 $10,000+,華爲Mate三折疊手機、F1紅牛賽車模型、Gate限量週邊、熱門代幣等你來抽!
立即抽獎 👉 https://www.gate.com/activities/pointprize?now_period=12
如何快速賺成長值?
1️⃣ 進入【廣場】,點擊頭像旁標識進入【社區中心】
2️⃣ 完成發帖、評論、點讚、發言等日常任務,成長值拿不停
100%有獎,抽到賺到,大獎等你抱走,趕緊試試手氣!
截止於 8月9日 24:00 (UTC+8)
詳情: https://www.gate.com/announcements/article/46384
#成长值抽奖12期开启#
V8引擎Sentinel Value泄露繞過HardenProtect的安全風險
Chrome V8引擎中Sentinel Value泄露導致的安全風險
Sentinel value是算法中的特殊值,常用於循環或遞歸算法的終止條件。Chrome源碼中存在多個Sentinel value,其中一些對象不應泄露到JavaScript環境中。本文將探討利用Uninitialized Oddball對象泄露來繞過Chrome V8引擎的HardenProtect機制。
V8中的Sentinel Value
V8的大部分原生對象定義在v8/src/roots/roots.h文件中,這些對象在內存中相鄰排列。一旦這些不應暴露給JavaScript的原生對象被泄露,就可能導致沙箱內任意代碼執行。
我們可以通過修改V8的native函數,將Uninitialized Oddball泄露到JavaScript中。例如修改%TheHole()函數的偏移量,使其返回Uninitialized Oddball對象。
繞過HardenType保護
利用泄露的Uninitialized Oddball對象,可以構造以下代碼實現相對任意讀:
javascript function read(obj, idx) { return obj[idx]; }
let arr = [1.1, 2.2, 3.3]; let uninitialized_oddball = %TheHole();
for (let i = 0; i < 100000; i++) { read(arr, 0);
}
%OptimizeFunctionOnNextCall(read);
let result = read(uninitialized_oddball, 0x12345); %DebugPrint(result);
優化後的read函數匯編代碼顯示,在計算數組偏移時沒有檢查obj.prop的值類型,直接按JavaScript語義計算,從而導致類型混淆,實現任意讀。
修復建議是在優化後的函數返回數組元素時,添加對數組map的檢查,避免直接計算偏移返回數值。
PatchGap風險提示
該漏洞目前在一些使用舊版V8引擎的軟件(如Skype)中仍未修復。在x86平台下,由於沒有地址壓縮,任意讀寫可直接相對於整個進程進行。
這種新的繞過方法的公開,降低了利用相關漏洞的難度。黑客幾乎不需要額外研究就可以完成對泄露Uninitialized Oddball漏洞的完整利用。
總結
V8中還存在其他Sentinel value,可能導致類似安全問題。建議進一步研究:
無論如何,這類問題都會大大縮短黑客實現完整利用的週期,值得高度重視。