📢 Gate广场 #MBG任务挑战# 发帖赢大奖活动火热开启!
想要瓜分1,000枚MBG?现在就来参与,展示你的洞察与实操,成为MBG推广达人!
💰️ 本期将评选出20位优质发帖用户,每人可轻松获得50枚MBG!
如何参与:
1️⃣ 调研MBG项目
对MBG的基本面、社区治理、发展目标、代币经济模型等方面进行研究,分享你对项目的深度研究。
2️⃣ 参与并分享真实体验
参与MBG相关活动(包括CandyDrop、Launchpool或现货交易),并晒出你的参与截图、收益图或实用教程。可以是收益展示、简明易懂的新手攻略、小窍门,也可以是现货行情点位分析,内容详实优先。
3️⃣ 鼓励带新互动
如果你的帖子吸引到他人参与活动,或者有好友评论“已参与/已交易”,将大幅提升你的获奖概率!
MBG热门活动(帖文需附下列活动链接):
Gate第287期Launchpool:MBG — 质押ETH、MBG即可免费瓜分112,500 MBG,每小时领取奖励!参与攻略见公告:https://www.gate.com/announcements/article/46230
Gate CandyDrop第55期:CandyDrop x MBG — 通过首次交易、交易MBG、邀请好友注册交易即可分187,500 MBG!参与攻略见公告:https://www.gate.com/announcements
V8引擎Sentinel Value泄露引发安全风险 Uninitialized Oddball成新型攻击向量
Chrome v8引擎中Sentinel Value泄露导致的安全问题分析
Sentinel value是算法中的特殊值,通常在循环或递归算法中作为终止条件使用。Chrome源码中存在多个Sentinel value,其中一些如果泄露到JavaScript环境中可能导致安全问题。
之前有研究表明,通过泄露TheHole对象可以实现Chrome沙箱内任意代码执行。谷歌团队在此后不久对相关CVE进行了修复。然而,除了TheHole对象外,v8中还有其他不应泄露到JS中的原生对象。本文将讨论Uninitialized Oddball对象,这种绕过方法目前仍可用于最新版V8。
值得注意的是,这种方法具有一定通用性:
在CVE-2021-30551中,最初的POC就是泄露internal uninitialized oddball。
在CVE-2022-1486中,POC也直接泄露了UninitializedOddball。
Issue1352549(未分配CVE)中给出了完整利用代码。
这些案例表明,Uninitialized Oddball的泄露可能导致严重的安全问题。
V8中的Sentinel Value
V8的大部分原生对象定义在v8/src/roots/roots.h文件中,这些对象在内存中依次相邻排布。如果将不应泄露的原生对象泄露到JavaScript中,可能实现沙箱内任意代码执行。
为验证这一点,我们可以修改V8的native函数,将Uninitialized Oddball泄露到JavaScript中。具体可以修改%TheHole()函数中相对isolate的偏移,使其返回Uninitialized Oddball。
绕过HardenType保护
利用Uninitialized Oddball可以实现相对任意读。关键代码如下:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized_oddball = %TheHole(); let ab = new ArrayBuffer(8); let fa = new Float64Array(ab); let ia = new BigInt64Array(ab);
let evil = [1.1, 2.2, 3.3]; evil.prop = 1;
%PrepareFunctionForOptimization(read); read(evil, 0); read(evil, 1); %OptimizeFunctionOnNextCall(read); read(evil, 0);
let val = read(uninitialized_oddball, "prop"); fa[0] = val; console.log(ia[0]);
在优化后的汇编代码中,会直接按JavaScript语义计算偏移并返回数组值,而没有检查obj.prop为key的Value。这导致了类型混淆,从而实现任意读。
由于Uninitialized Oddball在V8内存中排序靠前且更原始,比TheHole对象更容易伪造,是绕过HardenType的首选方法。
建议的修复方案是在优化后的函数返回数组元素时,添加对数组map的检查,避免直接计算偏移返回数组值。
PatchGap警告
分析Issue1352549后发现,某些软件可能存在PatchGap问题。例如Skype目前仍未修复该漏洞。在x86平台下,由于没有地址压缩,任意读写是相对于整个进程的。
虽然Skype开启了ASLR,但由于文件较大,黑客只需对某个固定地址进行读写,就有很大概率读写到Skype文件内容。结合PE解析等传统方法,可以完成整个漏洞利用链。
这次PatchGap不仅涉及Issue1352549,还会导致类似CVE-2022-1486和CVE-2021-30551等漏洞的利用难度大幅降低。黑客几乎不需要额外研究即可实现完整利用。
总结
本文简要讨论了通过泄露Uninitialized Oddball实现任意读原语的方法。V8中还有许多其他Sentinel value,可能存在类似安全隐患。这给我们以下启示:
其他Uninitialized Oddball泄露是否也可轻易实现V8 RCE。
此类问题是否应被正式视为安全问题仍存在争议。
Fuzzer中是否有必要将%TheHole/Uninitialized Oddball等作为变量加入,以挖掘新的利用原语。
无论如何,这类问题都会大大缩短黑客实现完整利用的周期,值得我们高度重视。