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

宣布时间 2025-04-30

1.研究配景


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威胁 。


2.V8沙箱


V8沙箱的泛起 ,将历程地址空间分为V8沙箱内存和V8沙箱外内存 ,为了避免恣意内存读写 ,榨取使用危险的原始指针 。沙箱内的工具通过对沙箱基地址的偏移引用 。如下面的ArrayBuffer的内存结构 ,后端存储数据的原始指针(紫色部分)由沙箱基址偏移取代:


图片1.png


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


图片2.png


V8沙箱的泛起增添了使用链的长度 ,一定水平上镌汰了V8误差对浏览器清静带来的攻击威胁 。攻防相生相克 ,在pwn2own2024角逐中 ,Manfred Paul就使用一个整数溢出误差绕过了V8沙箱 。


3.误差剖析


在沙箱泛起前 ,通过ArrayBuffer以及其对应的TypedArray后端存储可有用控制恣意内存读写 。从上面的ArrayBuffer的内存结构可知 ,现在后端存储指针被替换为沙箱指针 ,并且长度被限制在235  ,有用阻止了使用这种要领恣意读写 。


随着Resizable ArrayBuffer的泛起 ,对ArrayBuffer和SharedArrayBuffer以及他们的Type View的会见变得越发重大 。详细来讲关于ArrayBuffer和SharedArrayBuffer的结构函数添加了maximum length ,ArrayBuffer能够随时增添和缩减缓存巨细 ,而SharedArraybuffer能够随时增添缓存巨细 。在工具建设后缓存的动态转变 ,致使每次会见后端缓存都要重新盘算缓存的长度 。


图片3.png


关于类型数组的长度盘算应该采� 。╞yte_length - byte_offset)/element_size , 下面是对RAB长度盘算:


图片4.png


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


图片5.png


4.误差复现


建设GSAB (ab)工具 ,length为0x3000 ,maxByteLength为0x6000;建设类型数组Uint8Array (dv) ,偏移值为0x2000 ;优化func函数凭证提供的索引(i)给类型数组元素(dv[i])赋值(0x88) 。


打印类型数组工具(dv)以便于审查厥后端存储指针 ,使用沙箱内写函数修改类型数组(dv)的偏移为0x8000(由于内存存储整数值为现实值的2倍 ,以是现实偏移为0x4000 ) 。偏移值(0x4000)大于长度(0x3000) ,导致整数溢出 ,当使用超大的索引(0x10000000000)越界会见后端缓存时 ,盘算的索引小于长度值 ,导致越界写 。


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


图片6.png


V8沙箱的内存规模是在1TB的地址空间 ,程序在对0x326600002000沙箱外的不可写内存赋值(0x88)时泛起瓦解:


图片7.png

图片8.png


5.误差修复


在BuidLength函数长度盘算之前 ,添加了对byte_offset和byte_length的较量 ,阻止泛起整数溢出:


图片9.png


6.误差影响


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+清静研究、卫星清静研究、运营商基础设施清静研究、移动清静研究、物联网清静研究、车联网清静研究、工控清静研究、信创清静研究、云清静研究、无线清静研究、高级威胁研究、攻防对抗手艺研究 。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等 。


adlab.jpg