CPU漏洞之Meltdown

news2024/12/25 15:12:31

1.前言

计算机系统的安全性从根本上依赖于内存隔离,例如内核(Kernel)地址范围被标记为不可访问,并对用户访问加以限制和保护,因此操作系统确保了用户程序不能访问彼此的内存或内核内存。这种内存隔离是我们计算机环境的基石,它允许在个人设备上同时运行多个应用程序,或者在云中的一台机器上执行多个用户的进程。本文介绍的Meltdown利用现代处理器上乱序执行(Ouf-of-order)的副作用(side effects)来读取任意的内核内存位置,包括个人数据和密码。Meltdown攻击不依赖于任何操作系统,也不依赖于任何软件漏洞。Meltdown会破坏由地址空间隔离和虚拟化环境提供的所有安全保障,从而破坏建立在此基础上的所有安全机制。在受影响的系统上,Meltdown允许攻击者(黑客)能够在没有任何权限或特权的情况下读取云中的其它进程或虚拟机的内存,影响数百万客户和几乎每个个人计算机用户。

Meltdown是一种新颖的攻击方式,它利用了大多数现代处理器上可用的侧信道信息(side-channel)。典型易受这种攻击的CPU特点是:“允许非特权进程以特权进程从内核或物理地址加载数据到一个临时的CPU寄存器。此外,CPU甚至基于该寄存器执行进一步的计算,例如,基于该寄存器值访问数组。如果发现一条指令不应该被执行,处理器通过简单地丢弃内存查找的结果,可以确保正确的程序执行。因此,在体系结构级别(architectural level)上,不会出现安全问题。”Meltdown的攻击模式大致为:通过乱序执行CPU的指令流中读取特权内存数据,并通过非体系结构隐蔽通道(例如,Flush+Reload)将数据从内部状态传输到外部世界,在接收到重构解码数据信息。

2.背景知识

2.1乱序执行

乱序执行是一种优化技术,它允许尽可能地最大化CPU core的所有执行单元的利用率。CPU不是严格按照程序顺序处理指令,而是在所有所需资源可用时立即执行它们。当操作的执行单元被占用时,其它执行单元可以继续运行。因此,只要指令的结果符合体系结构定义,它们就可以并行运行。由于程序中经常需要跳转,CPU中会有分支预测单元,用于猜测下一个执行的指令。分支预测器试图在实际评估其条件之前确定采取分支的哪个方向。位于该路径上且没有任何依赖关系的指令可以提前执行,如果预测正确,则可以立即使用其结果。如果预测不正确,则reorder buffer允许通过清除清除中间缓冲区并重新初始化来回滚到相同的之前的状态。预测分支有多种方法:静态分支预测,仅根据指令本身预测结果。动态分支预测,在运行时收集统计信息来预测结果。一级分支预测使用1位或2位计数器记录分支的最后结果。现代处理器通常使用具有最近n个结果历史的两级自适应预测器,允许预测有规律的重复模式。

2.2地址空间

为了使进程之间相互隔离,CPU支持虚拟地址空间,其中虚拟地址需要被转换为物理地址。虚拟地址空间被划分为一组页,这些页可以通过多级页表转换单独映射到物理内存。页表定义了实际的虚拟到物理的映射以及用于特权检查的保护属性,例如可读、可写、可执行和用户可访问。当前使用的翻译表保存在一个特殊的CPU寄存器中,在每次上下文切换(context switch)时,操作系统用下一个进程的转换表地址更新这个寄存器,以便实现每个进程自己的虚拟地址空间。因此,每个进程只能引用属于其虚拟地址空间的数据。每个虚拟地址空间本身被分成一个用户和一个内核部分,虽然正在运行的应用程序可以访问用户地址空间,但内核地址空间只有在CPU以特权模式运行时才能访问。这是通过操作系统禁用相应页表的用户可访问属性来实现的。内核地址空间不仅有内核自己使用的内存映射,而且还需要在用户地址上执行操作,例如填充数据。因此,整个物理内存通常映射到内核中。在Linux和OS X上,这是通过直接物理映射完成的,也就是说,整个物理内存直接映射到一个预定义的虚拟地址。如下图所示,物理内存在内核中以一定偏移量直接映射。映射到用户空间可访问的物理地址(蓝色)也通过直接映射到内核空间中。

2.3高速缓存(cache)攻击

为了加速内存访问和地址转换,CPU包含小的内存缓冲区,称为缓存,用于存储经常使用的数据。CPU缓存通过将经常使用的数据缓冲在更小更快的内部存储器中来隐藏缓慢的内存访问延迟。现代CPU有多个级别的缓存,这些缓存要么是每个core私有的,要么是在它们之间共享的。页表也存储在内存中,因此也会缓存在常规缓存中。

缓存侧信道攻击利用缓存引入的时间差异。例如Flush+Reload是以单个缓存线(cache line)粒度进行攻击共享的、Inclusive的最后一级缓存。攻击者经常使用指令刷新目标内存位置,并测量重新加载数据所需的时间,就可以确定数据是否同时被另一个进程加载到缓存中。Flush+Reload攻击被用于攻击各种计算,例如加密算法、web服务器函数调用、用户输入和内核寻址信息。缓存侧信道攻击的一个特殊用例是隐蔽信道(covert channel)。攻击者控制产生副作用的部分和测量副作用的部分,可将信息从一个安全域泄漏到另一个安全域,同时绕过架构级别或更高级别上存在的任何边界。Prime+Probe和Flush+Reload已被用于高性能隐蔽通道。

3.Meltdown例子1

下面片段为一个简单的例子来说明乱序执行的CPU如何泄漏信息,它首先引发(暂时未被处理)异常,然后访问数组。异常的属性是控制流在异常之后不会继续执行代码,而是跳转到操作系统中的异常处理程序。不管这个异常是否由于内存访问引发的,例如,通过访问一个无效地址,还是由于任何其它除零等CPU异常。

raise_exception();
// the line below is never reached
access(byte  array_A[data_x * 4096]);

因此,示例不能访问array_A数组,因为异常会立即被捕获内核并终止应用程序。然而由于乱序执行,且异常下面的指令不依赖于异常,那么CPU可能已经执行了下面的指令。如下图所示,只是由于这个异常,乱序执行的下面指令不会retire,因此不会对体系结构产生影响。

尽管乱序执行的执行对寄存器或内存没有任何可见的体系结构影响,但它们有微体系结构的副作用。在乱序执行期间,被引用的内存被取出放到寄存器中,也存储在缓存中。如果乱序执行必须被丢弃,寄存器和内存内容永远不会提交。然而,缓存的内容仍旧保存在缓存中。我们就可以利用微架构侧通道攻击,如Flush+Reload,它检测特定的内存位置是否被缓存,使这种微架构状态可见。其它侧通道也可以检测是否缓存了特定的内存位置,包括Prime+Probe,Evict+Reload,Flush+Flush。由于Flush+Reload是已知的最精确的缓存侧通道,并且易于实现,因此我们在本例中不考虑任何其他侧通道。

在本例中,当数据(data_x)乘以4096时,对array_A数组针对的数据访问分散在距离为4KB的阵列上。这样就存在从数据值到内存页的映射,即不同的数据值永远不会导致对同一页的访问。因此,如果一个页表的缓存行被缓存,就可以提取出数据(data_x)的值。尽管由于异常,array_A数组不应该被访问,但它的索引(data_x * 4096)被缓存了。可以在异常处理程序中,通过Flush+Reload测量迭代找出缓存命中的页表。这表明,即使是从未实际执行过的指令,也会改变程序的微架构状态。

4.Meltdown例子2

程序片段如下所示:

bit [511:0] array_A [256]; // 256位宽是因为cacheline大小为64Byte,256深度是因为1byte的范围是0~255
bit [7:0] array_B[8]; // 8位宽是因为作为array_A的索引,深度8无实际意义
main_function() {
  clear_array_A(); // 这个函数将array_A的缓存区清除下,即cache中不存在它的数据
  ldr r0 array_B[x]; // x为目标地址,非法操作,可以让x大于等于8,数组越界
  ldr r1 array_A[r0 * 512];
  for (i=0; i<256; i++) {
    ldr r2 [array_A_base_addr + i]
  }
}

程序说明:第一步先用函数clear_array_A()将array_A的内容从缓存中清除出去。第二步访问超过array_B大小的index(x),并将返回数据作为array_A的index访问内存。第三步,扫描array_A的所有元素,记录返回时间,由于之前清除了array_A的缓存区,ldr指令从缓存和内存拿数据有明显的时间差,如果扫描结果为某index元素访问最快,那么目标地址x就等于该index的值。

这样就完成了通过缓存侧信道攻击获取了不可访问内存的数据。

5.可能的解决方案

问题根源在于硬件本身,一个极端的对策是完全禁用乱序执行,但由于现代CPU的并行性无法再得到充分利用,性能影响将是巨大的。因此,这个解决方案不是很靠谱的。

Meltdown是在获取内存地址数据和相应的每个任务检查此地址之间的某种形式的竞争条件引起的。序列化权限检查和寄存器值获取可以防止Meltdown,因为如果权限检查失败,内存地址的数据永远不会被获取,因此内存获取必须暂停,直到权限检查完成。

更现实的解决方案可以引入用户空间和内核空间的硬分割。可以由kernel在CPU控制寄存器中使用一个新的硬分割位,kernel必须位于地址空间的上半部分,而用户空间必须位于地址空间的下半部分。通过这种硬分割,内存访问可以立即识别目标访问是否会违反安全界限,因为特权级别可以直接从虚拟地址产生,而无需进一步查找的。这种方案对性能的影响是最小的,而且还确保了向后的兼容性,kernel只有在支持硬分割特性时才会设置它。

在软件层面,使用KAISER在很大程度上防止了Meltdown,三大操作系统(Windows, Linux和OS X)都实现了KAISER的变体,并且推出补丁修复了。但软件只是暂时修补了,最优办法还是要从硬件层面上杜绝Meltdown的发生。

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

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

相关文章

【mysql】1000w数据量的分页查询SQL,如何优化提升性能?

文章目录 优化场景特别注意&#xff01;&#xff01;&#xff01;有前提&#xff0c;谨慎使用 优化场景 当表数据量非常大时&#xff0c;需要进行分页查询如果慢的时候&#xff0c;可以考虑优化下。 假设一页展示10条&#xff0c;查询第10w条后面的数据时候变慢了… 优化思路&…

抖音短视频:表情包账号的魅力与运营之道以及制作与工具

在短视频的浪潮中&#xff0c;抖音以其独特的创意和趣味性成为了年轻人的最爱。其中&#xff0c;表情包账号更是凭借其生动、形象的表现方式&#xff0c;赢得了众多用户的青睐。本文将深入探讨抖音短视频表情包账号的魅力所在以及如何有效运营。 一、表情包账号的独特魅力 情…

C# 1.消息队列MQ使用场景--图文解析

为什么使用消息队列MQ&#xff08;Message Queue&#xff09;&#xff1f; 消息队列有什么优点和缺点&#xff1f; Kafka(大数据日志采集)、ActiveMQ(最早的MQ--目前使用较少)、RabbitMQ(开源&#xff0c;中小型企业使用足够)、RocketMQ(阿里开发&#xff0c;大型企业适用) 都…

windows Server下Let‘s Encrypt的SSL证书续期

一、手动续期方法&#xff1a; 暂停IIS服务器 --> 暂时关闭防火墙 --> 执行certbot renew --> 打开防火墙 --> 用OpenSSL将证书转换为PFX格式-->pfx文件导入到IIS --> IIS对应网站中绑定新证书 --> 重新启动IIS -->完成 1、暂停IIS服务器 2、暂时关闭…

冲击大厂算法面试=>链表专题【链表删除】

冲击大厂算法面试>链表专题【链表删除】 本文学习目标或者巩固的知识点 学习如何删除链表中的某个节点 如何删除valk的节点如何删除倒数第n个节点 学习如何删除链表中的某些节点 涉及头节点问题如何解决 提前说明&#xff1a;算法题目来自力扣、牛客等等途径 &#x1f7e…

每日一学—由面试题“Redis 是否为单线程”引发的思考

文章目录 &#x1f4cb; 前言&#x1f330; 举个例子&#x1f3af; 什么是 Redis&#xff08;知识点补充&#xff09;&#x1f3af; Redis 中的多线程&#x1f3af; I/O 多线程&#x1f3af; Redis 中的多进程&#x1f4dd; 结论&#x1f3af;书籍推荐&#x1f525;参与方式 &a…

[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的耕地占补平衡报备格式&#xff0c;现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见&#xff1a;软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&#xff08;插件&#xff09;&#xff0c;需要授权后才能使用&#xff1b; 本软件…

【成像光谱遥感技术】如何使用ChatGPT应用自如

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

TongWEB(东方通),部署WEB前后端项目步骤

我的系统: 银河麒麟桌面系统V10(SP1)(兆芯) 环境需要搭建好,什么redis,数据库等 1.准备项目前端war包 (我后端项目本就是war部署,jar转war自行百度一下吧) 进入前端打包好的dist文件夹,创建一个文件夹 WEB-INF ,再在 WEB-INF 里创建一个 web.xml 文件,文件内容: <web-…

大数据-数据可视化-环境部署vue+echarts+显示案例

文章目录 一、安装node.js1 打开火狐浏览器,下载Node.js2 进行解压3 配置环境变量4 配置生效二、安装vue脚手架1 下载vue脚手架,耐心等待。三、创建vue项目并启动1 创建2 启动四、下载echarts.js与axios.js到本地。五、图表显示demo【以下所有操作均在centos上进行】 一、安…

【Python笔记-设计模式】外观模式

一、说明 外观模式是一种结构型设计模式&#xff0c;能为程序库、框架或其他复杂类提供一个统一的接口。 (一) 解决问题 简化复杂系统的接口调用 (二) 使用场景 简化复杂系统&#xff1a;需要一个指向复杂子系统的直接接口&#xff0c; 且该接口的功能有限时重构复杂的代码…

vue3获取环境变量import.meta.env

vitevue的时候环境变量的获取方式变成如下&#xff1a; console.log(import.meta.env)

Windows中的Git Bash运行conda命令:未找到命令的错误(已解决)

在windows中的Gitbash中 打开激活conda环境&#xff0c;并运行&#xff08;前提是你先安装好git&#xff08;自己去官网下载&#xff09;&#xff09;。 要能够在Gitbash上运行Conda&#xff0c; 临时配置 如果你只是临时用一下&#xff0c;就是临时爽一把&#xff0c;那就按…

【Python】OpenCV-图像轮廓检测初学

图像轮廓检测初学 在图像处理领域中&#xff0c;轮廓检测是一项重要的任务&#xff0c;用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测&#xff0c;并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。 1. 引言 图像轮廓检测是图…

可视化 RAG 数据 - 用于检索增强生成的 EDA

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Visualize your RAG Data — EDA for Retrieval-Augmented Generation 原文地址:https://medi…

网络原理 - HTTP/HTTPS(5)

HTTPS HTTPS也是一个应用层协议.在HTTP协议的基础上引入了一个加密层. HTTP协议内容都是按照文本的方式明文传输的. 这就导致了在传输过程中出现了一些被篡改的情况. 臭名昭著的"运营商劫持" 下载一个天天动听. 未被劫持的效果,点击下载按钮,就会弹出天天动听的…

yolov5-tracking-xxxsort yolov5融合六种跟踪算法(三)--目标跟踪

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接&#xff1a;https://github.com/zzhmx/yolov5-tracking-xxxsort.git 先按照之前的博客配置好环境&#xff1a; yolov5-tracking-xxxsort yolov5融合六种跟踪算法&#xff08;一&#xff09;–环境配…

java医院综合信息管理云HIS系统源码(前后端分离、SaaS模式)

目录 综合管理系统 业务系统 技术框架 系统基础数据录入 系统功能介绍 云his综合管理系统 云his业务系统 门诊管理系统 住院管理系统 药房管理系统 药库管理系统 系统管理 云HIS系统分为两个大的系统&#xff1a;综合管理系统和业务系统 综合管理系统 由运营商、开…

【Linux】 logout命令使用

logout命令 Linux logout命令用于前登录的用户退出系统。 它会终止当前用户的会话并返回到登录界面或者重新登录。当使用logout命令时&#xff0c;系统会关闭所有与当前用户相关的进程和程序&#xff0c;并释放占用的资源。 使用logout命令可以方便地切换用户或者注销当前用…

力扣日记2.22-【回溯算法篇】47. 全排列 II

力扣日记&#xff1a;【回溯算法篇】47. 全排列 II 日期&#xff1a;2023.2.22 参考&#xff1a;代码随想录、力扣 47. 全排列 II 题目描述 难度&#xff1a;中等 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输…