【复现】Chrome V8堆沙箱绕过分析

admin 2025年5月1日01:22:03评论3 views字数 2642阅读8分48秒阅读模式

更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)

01

研究背景

V8是Google Chrome脚本语言(JavaScript)的解析引擎。多年来Google安全团队一直致力于提升V8的安全性,但V8漏洞仍层出不穷。除了经典的内存破坏、运行时问题,V8优化编译器的逻辑问题转化为内存破坏是V8漏洞中的典型。如果编译器本身就是攻击面,生成有漏洞的代码在所难免。通过采取内存安全的编程语言或者硬件安全不能缓解这种问题。在这种情况下,Google安全提出V8沙箱,将V8堆保存在1TB的沙箱内,将利用V8漏洞造成的破坏限制在沙箱内。攻击者为了能进一步构造任意内存读写,必须找到能绕过V8沙箱的漏洞。

理想情况下,V8沙箱使得浏览器即使运行不安全的代码也不会造成攻击威胁。 然而事实并非如此。在pwn2own2024比赛中,Manfred Paul利用了一个V8中的类型混淆漏洞(CVE-2024-2887)控制沙箱内的内存,同时也披露了一种绕过V8沙箱的方法。启明星辰ADLab研究人员着重分析复现了该V8沙箱的绕过方法,并提醒Google Chrome用户及时更新浏览器,避免受到NDay威胁。

02

V8沙箱

V8沙箱的出现,将进程地址空间分为V8沙箱内存和V8沙箱外内存,为了防止任意内存读写,禁止使用危险的原始指针。沙箱内的对象通过对沙箱基地址的偏移引用。如下面的ArrayBuffer的内存布局,后端存储数据的原始指针(紫色部分)由沙箱基址偏移取代:

【复现】Chrome V8堆沙箱绕过分析

V8外部对象(如Blink对象)通过外部索引表引用。为了控制流完整性,代码和它的元数据等危险对象也要移到沙箱外,由代码索引表以及信任表引用。信任表用于对不包含原始指针的V8对象(如Bytecode Code metadata)的索引,这些对象虽然不包含指针,但利用这些对象仍可能打破沙箱。V8沙箱整体的设计图如下:

【复现】Chrome V8堆沙箱绕过分析

V8沙箱的出现增加了利用链的长度,一定程度上减少了V8漏洞对浏览器安全带来的攻击威胁。攻防相生相克,在pwn2own2024比赛中,Manfred Paul就利用一个整数溢出漏洞绕过了V8沙箱。

03

漏洞分析

在沙箱出现前,通过ArrayBuffer以及其对应的TypedArray后端存储可有效控制任意内存读写。从上面的ArrayBuffer的内存布局可知,现在后端存储指针被替换为沙箱指针,而且长度被限制在235 ,有效阻止了利用这种方法任意读写。

随着Resizable ArrayBuffer的出现,对ArrayBufferSharedArrayBuffer以及他们的Type View的访问变得更加复杂。具体来讲对于ArrayBufferSharedArrayBuffer的构造函数添加了maximum length,ArrayBuffer能够随时增加和缩减缓存大小,而SharedArraybuffer能够随时增加缓存大小。在对象创建后缓存的动态变化,致使每次访问后端缓存都要重新计算缓存的长度。

【复现】Chrome V8堆沙箱绕过分析

对于类型数组的长度计算应该采取(byte_length - byte_offset/element_size , 下面是对RAB长度计算:

【复现】Chrome V8堆沙箱绕过分析

相较于RAB对于byte_lengthbyte_offset的溢出检查,GSAB缺少整数溢出检查,在拥有沙箱内内存破坏的能力下,这两个值完全可控,当byte_offset大于byte_length, 其后端存储后的整个地址空间可控,完全突破V8沙箱,达到沙箱外内存读写。

【复现】Chrome V8堆沙箱绕过分析

04

漏洞复现

创建GSAB (ab)对象,length0x3000maxByteLength0x6000;创建类型数组Uint8Array (dv),偏移值为0x2000 ;优化func函数根据提供的索引(i)给类型数组元素(dv[i])赋值(0x88)。

打印类型数组对象(dv)以便于查看其后端存储指针,使用沙箱内写函数修改类型数组(dv)的偏移为0x8000(由于内存存储整数值为实际值的2倍,所以实际偏移为0x4000 )。偏移值(0x4000)大于长度(0x3000) ,导致整数溢出,当使用超大的索引(0x10000000000)越界访问后端缓存时,计算的索引小于长度值,导致越界写。

可以看到类型数组(dv)的后端存储指针为0x316600002000

【复现】Chrome V8堆沙箱绕过分析

V8沙箱的内存范围是在1TB的地址空间,程序在对0x326600002000沙箱外的不可写内存赋值(0x88)时出现崩溃:

【复现】Chrome V8堆沙箱绕过分析
【复现】Chrome V8堆沙箱绕过分析

05

漏洞修复

在BuidLength函数长度计算之前,添加了对byte_offset和byte_length的比较,避免出现整数溢出:

【复现】Chrome V8堆沙箱绕过分析

06

漏洞影响

Chrome before 123.0.6312.86

参考链接:

[1]https://docs.google.com/document/d/1FM4fQmIhEqPG8uGp5o9A-mnPB5BOeScZYpkHjo0KKA8/edit?tab=t.0

[2]https://www.zerodayinitiative.com/blog/2024/5/2/cve-2024-2887-a-pwn2own-winning-bug-in-google-chrome

[3]https://github.com/tc39/proposal-resizablearraybuffer

[4]https://chromium-review.googlesource.com/c/v8/v8/+/5385329/4/src/compiler/graph-assembler.cc

启明星辰积极防御实验室(ADLab)

ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截至目前,ADLab已通过 CNVD/CNNVD/NVDB/CVE累计发布安全漏洞6500余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖基础安全研究、数据安全研究、5G安全研究、AI+安全研究、卫星安全研究、运营商基础设施安全研究、移动安全研究、物联网安全研究、车联网安全研究、工控安全研究、信创安全研究、云安全研究、无线安全研究、高级威胁研究、攻防对抗技术研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等

【复现】Chrome V8堆沙箱绕过分析

原文始发于微信公众号(ADLab):【复现】Chrome V8堆沙箱绕过分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月1日01:22:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【复现】Chrome V8堆沙箱绕过分析http://cn-sec.com/archives/4021049.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息