📢 Gate广场 #NERO发帖挑战# 秀观点赢大奖活动火热开启!
Gate NERO生态周来袭!发帖秀出NERO项目洞察和活动实用攻略,瓜分30,000NERO!
💰️ 15位优质发帖用户 * 2,000枚NERO每人
如何参与:
1️⃣ 调研NERO项目
对NERO的基本面、社区治理、发展目标、代币经济模型等方面进行研究,分享你对项目的深度研究。
2️⃣ 参与并分享真实体验
参与NERO生态周相关活动,并晒出你的参与截图、收益图或实用教程。可以是收益展示、简明易懂的新手攻略、小窍门,也可以是行情点位分析,内容详实优先。
3️⃣ 鼓励带新互动
如果你的帖子吸引到他人参与活动,或者有好友评论“已参与/已交易”,将大幅提升你的获奖概率!
NERO热门活动(帖文需附以下活动链接):
NERO Chain (NERO) 生态周:Gate 已上线 NERO 现货交易,为回馈平台用户,HODLer Airdrop、Launchpool、CandyDrop、余币宝已上线 NERO,邀您体验。参与攻略见公告:https://www.gate.com/announcements/article/46284
高质量帖子Tips:
教程越详细、图片越直观、互动量越高,获奖几率越大!
市场见解独到、真实参与经历、有带新互动者,评选将优先考虑。
帖子需原创,字数不少于250字,且需获得至少3条有效互动
Chrome v8漏洞揭秘:利用Sentinel Value实现沙箱逃逸
揭秘利用Sentinel Value绕过Chrome v8 安全保护机制
Sentinel value是算法中的一种特殊值,通常在循环或递归算法中作为终止条件使用。Chrome源码中存在多个Sentinel value。之前有研究表明,通过泄露TheHole对象可以实现沙箱内任意代码执行。谷歌团队随后对这两个漏洞进行了修复。
然而,除了TheHole对象外,v8中还有其他不应泄露到JS中的原生对象。本文将讨论Uninitialized Oddball对象,这种绕过方法目前仍可用于最新版V8,谷歌尚未修复。
值得注意的是,这种方法具有一定通用性:
Issue1216437中首先提到了泄露internal uninitialized oddball。
Issue1314616的poc也直接泄露了UninitializedOddball。
Issue1352549详细给出了利用方法。
这些案例表明,我们有必要重新审视可能受影响的软件。目前某些应用程序仍未修复该漏洞。
V8中的Sentinel value
v8/src/roots/roots.h文件中列出了v8的大部分原生对象,这些对象在内存中相邻排布。一旦将这些对象泄露到Javascript中,就可能实现沙箱内任意代码执行。
我们可以通过修改v8的native函数,将Uninitialized Oddball泄露到JavaScript中。具体可以修改%TheHole()函数中相对isolate的偏移,使其返回Uninitialized Oddball。
绕过HardenType保护
利用方法如下:
javascript const uninitialized = %TheHole(); const float_array = new Float64Array(1); float_array[0] = 1.1;
function read(obj, offset) { return float_array[obj.prop]; }
const obj = {prop: uninitialized};
for (let i = 0; i < 100000; i++) { read(obj, 0);
}
%OptimizeFunctionOnNextCall(read); const value = read(obj, 0x12345);
在v8-11.0.0中测试,当%TheHole()返回UninitializedOddball时,仍可实现相对任意读。
优化后的read函数反汇编代码显示,检查了obj的prop属性,但没有检查obj.prop为key的Value,直接按JavaScript语义计算偏移,导致类型混淆实现任意读。
建议修复方法是在优化后的函数返回数组元素时,添加对数组map的检查,避免直接计算偏移返回数组数值。
PatchGap风险提示
我们不仅需要关注历史漏洞,还要关注厂商在基础组件中悄悄修复的漏洞。经排查发现某些软件仍未修复该漏洞。
在x86架构下,由于没有地址压缩,任意读写是直接相对于整个进程的。虽然开启了ASLR,但文件较大时,黑客只需对固定地址进行读写,就有很大概率读写到文件内容。结合PE解析等传统思路,不难完成整个漏洞利用链。
这次PatchGap不仅涉及Issue1352549,还导致了类似Issue1314616和Issue1216437的利用难度大幅降低。黑客几乎不需要研究成本,就可以实现以往任何泄露uninitialized_oddball漏洞的完整利用。
总结
本文简要介绍了通过泄露Sentinel value中的uninitialized_Oddball来实现任意读原语。v8中还有很多其他Sentinel value,很可能也存在类似问题。这给我们几点启示:
其他uninitialized_Oddball泄露是否也能轻松实现v8的RCE。
类似问题是否应被正式当作安全问题对待。
fuzzer中是否有必要将%TheHole/uninitialized_Oddball等Sentinel value作为变量加入,以发掘其他利用原语。
无论如何,这类问题都会大大缩短黑客实现完整利用的周期。