Chrome 中的 RCE 会在 JIT 编译器中产生不正确的副作用

news2024/11/14 14:00:47

此类漏洞通常是“一键式”攻击的起点,当受害者访问恶意网站时,该漏洞会危害受害者的设备。Chrome 中的渲染器 RCE 允许攻击者危害 Chrome 渲染器进程并执行任意代码。但是,渲染器进程的权限有限,因此攻击者需要将此类漏洞与第二个“沙盒逃逸”漏洞串联起来:Chrome 浏览器进程中的另一个漏洞或操作系统中的漏洞,以危害 Chrome 本身或设备。例如,Google 威胁分析小组的 Clement Lecigne 在“间谍软件供应商使用 0-day 和 n -day 攻击流行平台”中发现,由渲染器 RCE(CVE-2022-3723)、Chrome 沙盒逃逸(CVE-2022-4135)和内核错误(CVE-2022-38181)组成的链条被野外利用。

虽然许多最强大、最复杂的“一键式”攻击都具有高度针对性,而普通用户可能更容易受到网络钓鱼等不太复杂的攻击,但用户仍然应该保持 Chrome 为最新版本并启用自动更新,因为一旦补丁发布,通常可以通过分析补丁来相对快速地利用 v8 中的漏洞。

当前漏洞存在于 Chrome 中的 JIT 编译器中,该编译器根据对输入类型(例如数字类型、数组类型等)的先前了解来优化 JavaScript 函数。这称为推测优化,必须小心确保在使用优化代码时,这些对输入的假设仍然有效。JIT 引擎的复杂性在过去导致了许多安全问题,并且一直是攻击者的热门目标。Samuel Groß 撰写的 phrack 文章“利用 JavaScript JIT 引擎中的逻辑错误”很好地介绍了该主题。

Chrome 中的 JIT 编译器

Chrome 的 v8 Javascript 引擎中的 JIT 编译器称为TurboFan。Chrome 中的 Javascript 函数会根据其使用频率进行优化。首次运行 Javascript 函数时,解释器会生成字节码。随着使用不同输入反复调用该函数,会收集有关这些输入的反馈,例如它们的类型(例如,它们是整数还是对象等)。在函数运行足够次数后,TurboFan 会使用此反馈为该函数编译优化代码,并根据反馈做出假设以优化字节码。此后,将使用编译后的优化代码来执行该函数。如果在优化函数后这些假设变得不正确(例如,使用了与反馈类型不同的新输入),则将取消优化该函数,并再次使用速度较慢的字节码。读者可以查阅 Benedikt Meurer 撰写的“ V8 中的推测优化简介”,了解有关编译过程如何工作的更多详细信息。

TurboFan 本身是一个研究得很好的主题,有大量文献记录了它的内部工作原理,所以我只介绍本文所需的背景知识。Jeremy Fetiveau 撰写的文章“ TurboFan 简介”是一篇很棒的文章,涵盖了 TurboFan 的基础知识,对于理解本文的背景非常有用,尽管我也会介绍必要的材料。Samuel Groß 撰写的 phrack 文章“利用 JavaScript JIT 引擎中的逻辑错误”也涵盖了 TurboFan 和 V8 对象布局的许多相关方面。

节点和副作用

在编译优化的 JIT 代码时,TurboFan 首先访问函数中的每个字节码指令,然后将这些指令中的每一个转换成节点集合(此过程称为缩减),从而得到一种称为“节点之海”的表示形式。节点通过依赖关系相互关联,这些依赖关系在Turbolizer中表示为边,Turbolizer 是一种常用于可视化节点之海的工具。边有三种类型:控制边表示控制流图,值边表示数据流图,效果边根据节点访问对象状态的方式对节点进行排序。

例如,在以下内容中:

x.a = 0x41;
var y = x.a;

操作y = x.a对 具有效果依赖性x.a = 0x41,并且必须在 之后执行,x.a = 0x41因为x.a = 0x41会改变 的状态x,该状态用于y = x.a。效果边缘对于消除优化代码中的检查非常重要。

在 Chrome 中,内存布局(特别是对象中字段的偏移量)由其指定Map,可以将其视为对象的类型信息,而MapTurboFan 经常使用反馈中的知识来优化代码。(读者可以查阅Mathias Bynens 的“JavaScript 引擎基础:形状和内联缓存”Map以了解更多详细信息。但就本文而言,知道确定对象字段偏移量就足够了。)

让我们更深入地看一下如何插入依赖性检查,并使用此函数作为运行示例:

function foo(obj) {
  var y = obj.x;
  obj.x = 1;
  return y;
}
x`当访问的字段时`obj`,TurboFan 使用 参数的先前输入`obj`来推测内存布局(由 的 确定`Map`)`obj`并发出优化的代码来访问`x`。当然,在优化后调用 时可能会使用`obj`不同的,因此在函数中创建一个节点以确保在优化代码访问该字段之前具有正确的内存布局。这可以在 Turbolizer 生成的图中看到:`Map``foo``CheckMaps``obj``x

Turbolizer 图表显示 CheckMaps 在字段加载之前插入

Turbolizer 图表显示 CheckMaps 在字段加载之前插入

同样,当将 存储到x行中时obj.x = 1,优化后的代码假定obj具有正确的映射。但是,由于 的映射obj在 之前进行了检查var y = obj.x,并且这两行之间没有任何可以更改 的内容obj,因此无需重新检查映射。实际上,TurboFan 不会在 中使用的节点CheckMaps之前生成额外的节点:StoreField``obj.x = 1

Turbolizer 图显示,在后续存储之前省略了 CheckMaps

Turbolizer 图显示,在后续存储之前省略了 CheckMaps

但是,节点有时会产生副作用,即它可能会间接改变对象。例如,调用用户定义的 JavaScript 函数的节点可能会改变任何对象:

function foo(obj) {
  var y = obj.x;
  callback();
  obj.x = 1;
  r

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#WinFrom 中实现可自定义按钮和事件的消息提示框

实现效果: public partial class CustomMessageBox : Form {// 声明按钮和标签控件private Button btnOption1;private Button btnOption2;private Label lblMessage;// 自定义属性用于获取对话框的结果public DialogResult DialogResult1 { get; private set; }// …

一文弄懂SQL事务隔离级别

SQL 事务隔离级别 在多用户数据库系统中,为了保证数据的完整性和一致性,SQL 标准提出了四种事务隔离级别,以规避脏读、不可重复读和幻读等问题。以下是四种隔离级别的简要介绍: 读未提交(read uncommitted&#xff09…

产业报告 | 2024年中国低空经济产业研究报告

低空经济是指以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引,辐射带动航空器研发、生产、销售以及低空飞行活动相关的基础设施建设运营、飞行保障、衍生综合服务等领域产业融合发展的综合经济形态。 基于启信产业大脑的海量数据与专业研判模型&#xff0…

【Linux C++】log4cpp日志库的安装和使用详解

log4cpp 是一个开源的 C 日志库,灵感来源于 Java 的 log4j。它提供了灵活的日志记录功能,可以帮助开发者在 C 应用程序中记录、管理和格式化日志信息。log4cpp 支持多种日志记录策略和输出目标,可以满足各种不同的需求。 1.安装 下载压缩包…

2.2.2 Posix API与网络协议栈2

接上回2.2.2 posix api 2 传输数据 四线一⚪,kernel 协议栈 send- write, recv-read 如何知道send成功? 如果返回整数,只能证明data从user copy到内核kernel wmemory了 就是数据传输是异步的,send是从application cop…

二叉树的层序遍历 C++

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2: 输入&…

李宏毅 机器学习与深度学习【2022版】 02

文章目录 一、机器学习任务攻略二、优化失败1、梯度很小的情况2、Batch and Momentum 三、自适应学习率 Adaptive Learning Rate四、分类问题简述五、重温神奇宝贝和数码宝贝分类器六、深度学习的优化 一、机器学习任务攻略 因为在训练集中,56层的network一定至少和…

等保测评(三级)服务器和终端-测评项及整改措施(详细)

本文按照三级等保标准进行测评,可参考进行加固。 等保测评是信息安全等级保护工作的基本制度、基本策略和基本方法。 等保测评是信息安全等级保护工作的基本制度、基本策略和基本方法。信息系统运营、使用单位应选择符合国家要求的测评机构,依据《信息…

Java中常用的API

具体的例子就不再列出了 自己尝试 // 注意第三个方法 1.如果数据源数组和目的地数组都是基本数据类型,那么两者的类型必须保持一致,否则会报错 2.如果数据源数组和目的地数组都是引用数据类型,那么子类类型可以赋值给父类类型 public cl…

并发服务器---IO多路复用

单循环服务器:同一时刻只能处理一个客户端任务 并发服务器: 同一时刻,只能处理多个客户端的任务 实现方法:多进程 多线程 IO多路复用 IO多路复用: 1.阻塞io(fgets scanf recv getchar read&#x…

【python计算机视觉编程——1.基本的图像操作和处理】

python计算机视觉编程——1.基本的图像操作和处理 1.基本的图像操作和处理1.1 PIL:Python图像处理类库1.1.1 转换图像格式1.1.2 创建缩略图1.1.3 复制和粘贴图像区域1.1.4 调整尺寸和旋转 1.2 Matplotlib1.2.1绘制图像、点和线1.2.2 图像轮廓和直方图 1.3 Numpy1.3.1 图像数组表…

【STM32】DMA

描述 大部分图片来源:正点原子HAL库课程 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 0 概述 1 原理(用于个人理解的,非常重要!) 1.1 DMA请求 1.2 循环模式与DMA请求的关系 1.3 …

以科研为本 创新突破的品牌理念 朵拉朵尚荣获2023年度影响力品牌奖

以科研为本 创新突破的品牌理念 朵拉朵尚荣获2023年度影响力品牌奖 随着国内美妆行业经过数十年的快速发展,已经形成了数千亿规模的产业链,在产业集聚、行业新技术不断涌现、产业链持续优化等背景下,美妆行业该如何通过科技创新,…

流量太炸裂了!一键AI替换视频人物,几分钟极速制作爆款视频!

目录 一、案例分析 二、制作教程 1.1、通义千问APP——角色扮演 1.2、Motionshop 1.3、Wonder Studio 1.4、Viggle 三、结束语 最近网上火了一种新玩法:用AI技术,一键就能把视频里的人物换成机器人或者任何你想要的角色。就像之前那些视频&#x…

二叉树高频题目-上-不含树型dp

二叉树高频题目-上-不含树型dp 题目1 : 二叉树的层序遍历 测试链接 : https://leetcode.cn/problems/binary-tree-level-order-traversal/ 思路 自己使用数组实现队列, 在队列中进行广度优先遍历先将根结点进队, 如果队列里还有东西, 按照队列大小进行循环, 让队列里的结点进…

创建一个最简单的FastAPI

如何生成一个最简单的 FastAPI 文件? FastAPI官方文档:https://fastapi.tiangolo.com/zh/tutorial/first-steps/ # -*- coding: utf-8 -*-""" file: main.py author: CSDN-北极的三哈 time: 2024/8/27 22:11 email:flymeawei163.com so…

【自动驾驶】控制算法(六)前馈控制与航向误差

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

Python爬虫使用实例_1

Python爬虫使用实例 —— 续 IDE: Pycharm or Jupyter Notebook 6. 网易云歌榜 🥝 获取地址 记得把#/去掉就好,一定要记得,否则没用。 热歌榜的url是 https://music.163.com/discover/toplist?id3778678 ,同理可得其他榜的ur…

Java设计模式之单例模式详细讲解和案例示范

单例模式(Singleton Pattern)是Java设计模式中最简单但却非常实用的一种。它确保一个类只有一个实例,并提供一个全局的访问点。本文将通过电商交易系统为例,详细探讨单例模式的使用场景、常见问题及解决方案。 1. 单例模式简介 …

【LeetCode Cookbook(C++ 描述)】平衡二叉树

目录 平衡二叉树基础不同插入节点方式的不同旋转LL 型失衡RR 型失衡LR 型失衡RL 型失衡 删除操作删除节点为二叉树的叶子节点删除的节点只有左子树或者右子树删除的节点既有左子树又有右子树 LeetCode #110:Balanced Binary Tree 平衡二叉树递归法(自底向…