Spectre && Meltdown漏洞

2023-12-19

前言

Spectre和Meltdown是缓冲时延旁路攻击的两种实际攻击方法。

一、原理

1.1 旁路(Side Channel)

什么叫旁路(Side Channel)攻击呢?就是说,在你的程序正常通讯通道之外,产生了一种边缘特征,这些特征反映了你不想产生的信息,这个信息被人拿到了,你就泄密了。这个边缘特征产生的信息通道,就叫旁路。比如你的内存在运算的时候,产生了一个电波,这个电波反映了内存中的内容的,有人用特定的手段收集到这个电波,这就产生了一个旁路了。基于旁路的攻击,就称为旁路攻击。这个论文对这种攻击有一个归纳:https://csrc.nist.gov/csrc/media/events/physical-security-testing-workshop/documents/papers/physecpaper19.pdf。读者可以体会一下可能的攻击方法:时延,异常(Fault),能耗,电磁,噪声,可见光,错误消息,频率,JTag等等,反正你运行总是有边缘特征的,一不小心这个边缘特征就成了泄密的机会。

1.2 缓冲时延(Cache Timing)

缓冲时延(Cache Timing)旁路是通过内存访问时间的不同来产生的旁路。假设你访问一个变量,这个变量在内存中,这需要上百个时钟周期才能完成,但如果你访问过一次,这个变量被加载到缓冲(Cache)中了,下次你再访问,可能几个时钟周期就可以完成了。这样,如果我攻击一个对象(比如一个进程,或者内核),要得到其中某个地址ptr的内容,我只要和它共享一个数组,然后诱导它用ptr的内容作为下标访问这个数组,然后我检查这个数组每个成员的访问时间,我就可以知道ptr的值了。

二、利用方法

你一定觉得利用缓冲时延来获取数据是很困难的,对吗?在Cache Timing Side Channel刚被提出来的时候,大家也是认为出问题的机会是很小的,只是理论上有效而已——直到Spectre和Meltdown被提出来(其实之前已经有人用这种方法来对内核地址随机化(KSLR)进行攻击了,Spectre和Meltdown只是综合利用了预执行的漏洞而已)……

这个事情坏就坏在现代的CPU基本上都支持指令预执行。比如,下面这段代码:

if(condition)
   do_sth();

你以为condition不成立,do_sth就不会执行,但condition存在内存上,从内存中把condition读出来,可能要几百个时钟周期,CPU闲着也是闲着,于是,它好死不死,它偷偷把do_sth()给它执行了!CPU本来想得好好的:我先偷偷执行着,如果最终condition不成立,我把动过的寄存器统统放弃掉就可以了。
问题是,大部分CPU在执行do_sth()的时候,如果有数据被加载到Cache中了,它是不会把它清掉的(因为这个同样不影响功能),这样就制造了一个“不同”了,旁路就产生了。

2.1 Meldown攻击

现在我们来看看Meltdown是怎么构造的。假设我现在在用户态执行一个程序,我可以在程序中制造这样一段代码:

raise_exception();
access(probe_data[data*4096]);

其中,raise_exception()表示制造一个异常,比如你除零错,或者访问非法地址之类的。后面那个数组是我(攻击程序)自己创建,我可以通过访问另一个一样大的数组一类的手段,导致这个数组的Cache全部被清掉。这样,理论上我访问这个数组的每个成员的时间都应该要数百时钟周期。

然后data是内核的一个地址(我想攻击的那个地址。另,为了避免部分人误会,严格来说,ptr的值是内核的一个地址,而data=*ptr),理论上这个地址我是没有权限访问的,但第一句话产生一个异常后,系统已经陷入到内核了。又“照理说”,access那一句是不应该执行的,但CPU又把它预执行了,这样,数组probe_data中的其中一个(下标等于data的)成员就被Load进Cache了。

等异常从内核返回后,我检查一下probe_data每个成员的加载速度(如果data的大小是字节,这个数组只要256项(乘4096是为了让cacheline隔开而已),我就足以偷到内核中的一个字节了)。然后重复这个过程,我就可以读出内核中的所有数据,包括你的root密码了。

按Meltdown论文的说法,他们在Intel的CPU上可以用五百多K每秒的速度Dump内核映像!

还是那句话,恐怖不恐怖?惊喜不惊喜?

为了解决这个问题,Linux上现在提出的解决手段是KPTI(通用技术称为Kaiser),内核和用户态不共享页表,每次你异常、IO、系统调用,都要把内核页表重新装进来。

2.2 Spectre攻击

现在我们来看看Spectre攻击。Meltdown只能从用户态攻击内核,Spectre攻击就灵活多了,它可以攻击任何有缺陷的对象。它要求被攻击的对象里面有如下Pattern的代码:

if(index1<array_a_size) {
  index2=array_a[index1];
  if(index2 < array_b_size);
     value = array_b[index2];
}

我们可以看到,理论上,如果index1越界,后面的代码不会被执行。但按预执行理论,即使index1超出了array_a_size的范围,它还是会“预执行”,一旦这个预执行被执行,我就可以通过控制index1的长度,让array_b的特定下标的数据Cacheline被点亮,如果我有办法访问一次array_b的全部内容,index1的内容就被我抠出来了。

要营造这样一种情形,其实是相当不容易的。既要有这样的Pattern,还要让攻击程序有办法访问array_b。但如果你的程序在执行我写的代码呢?比如Linux Kernel执行EBPF(Spectre的论文就是用这种手段构造这种攻击的),或者你的浏览器执行别人网页上的JavaScript呢?

你以为你的eBPF和Java Script已经经过了安全检查了,肯定不会访问你的重要数据的,结果,指令预执行把你给出卖了。

Spectre有两种变体,一种依靠默认的预执行行为,一种是利用预执行预测算法的BTB Aliasing漏洞在攻击程序中控制预执行的行为,然后再投入对问题代码的攻击。

相比Meltdown,Spectre是个更麻烦的东西,一方面它不容易构造,大家都有侥幸心理,希望没有问题,另一方面,它的攻击面又很大,大家都冒不起这个险。最保险的方式是关掉指令预测,但部分报告说关掉这个预测,性能可以直接下降到原来的10%,一朝回到解放前。

现在一般公司用的方法是半人工检查有没有这种模式,同时在不同区域切换的时候清空BTB(避免攻击程序训练被攻击程序),x86的IBPB和IBRS,ARM的IC IALLU等,都是这种手段,但暂时来说,性能损失都是相当大的。

对于BTB攻击,Google提出另一个软件方案,叫retpoline,所谓“ret蹦蹦床”,它认为CPU预执行就像一个精力过度充沛的孩子,闲不下来,所以,在每个可以产生指令预执行的地方都制造一个蹦床,让CPU在那里跳,而不会往下走。这个手段其实很简单,比如你原来要这样执行的:

jmp %eax
do_sth

现在可以改成这样:

call 2f
1:
  pause
  jmp 1b
2:
  mov %eax, (%esp)
  ret
  do_sth

跳转会在2分支上发生(ret不使用BTB),而预执行会被骗到1分支上蹦跶。但其实我认为这个方案在很多CPU上是有问题的,参考这里:Is retpoline really safe?。因为这个方案仅仅保护绝对地址跳转,不保护相对地址跳转,但BTB训练是可以训练相对地址的。如果把所有相对地址都修改为ret调用,这个成本就不见得低了。

另外,这个方案要求修改编译器,然后要求你重新编译所有的代码(请注意,你不是只有C代码),这个移植成本和性能成本有多大,估计你也能猜到了。但相对来说,它比起关闭指令预测,还是快多了。

这些攻击都是深刻种在CPU设计理念中的,只要你做高速CPU,不做指令预测和预执行几乎是不可能的。AMD开始认为自己免疫,估计现在不敢这么说了。ARM处理器也好不到哪里去。因为整个行业的芯片设计者都没有考虑过这个问题,所以,中不中招,完全是个运气问题。但总得来说,它对Intel的影响更大,因为Intel的量大,而且换代速度更慢一些。

而且,我认为,很多的芯片设计师并没有很严肃看待这件事,预执行为CPU性能提升带来很很多红利。他们很辛苦对预测执行进行优化,这些优化都没有考虑Cache加载带来的影响。他们一点都不想放弃这些红利。所以,很多设计师的思路还停留在如何补救Spectre和Meltdown引起的漏洞上。

但只要Cache还在发生变化,新的漏洞会被陆续发现,比如最新提出的:Skyfall 和 Solace。(参考:https://skyfallattach.com)

三、总结

由于CACHE的存在,CPU对于不同外存的地址访问速度会有差异,这本身就是一种“边带信息”。对这种边带信息的一种利用方式就是:首先清空CACHE;使用内存当中某个地址所存储的字节的值(这个值就是我所感兴趣、但又不被允许访问的,比如内核其他保护区域中)作为下标来读一个我可以访问的数组,这相当于预取了CACHE;然后测试这个数组所有地址的访问速度,就可以猜出我感兴趣的这个值来。这里唯一的问题是,我本来就不被允许去访问那个地址,所以上述方法我没有机会办到。现在,研究一下CPU的分支预测和投机执行,似乎机会来了……

参考资料

  1. 给程序员解释Spectre和Meltdown漏洞
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spectre && Meltdown漏洞 的相关文章

  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 如何在我的 AWS EC2 实例上安装特定字体?

    我有一个在 AWS EC2 Amazon Linux Elastic Beanstalk 实例上运行的 Python 应用程序 该实例需要某些特定字体才能生成输出 并且想知道如何在部署或实例启动过程中安装它们 我的代码在本地计算机 OS X
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse

随机推荐

  • uniapp H5项目使用ucharts的Echart组件方式创建圆环

    问题 没有报错但是图表不出来 调试了半天圆环图表没有不出来 是因为没有明示设置宽度与高度 请根据实际需求修改父元素尺寸 组件自动识别宽高 charts box width 100 height 300px 最终效果 先导入ucharts到项
  • 软件测试/测试开发/人工智能/测试管理圆桌讨论会 | 解锁测试管理的核心问题,提升您的管理实力!

    人工智能的出现 对我们的测试行业有哪些明显的影响呢 我们又应该如何应对 如何更好地拥抱人工智能呢 如何打造积极向上 主动 执行力强 不推诿 不甩锅 服从安排 和谐 互帮互助的团队 如何有效的追踪团队的测试效率 后续对测试时间 质量等评估做支
  • 2023年12月中国数据库排行榜:人大金仓跻身前五,南大通用、中兴热度再升

    破冰行舟蓄势起 壮志猛发破浪飞 2023年12月的 墨天轮中国数据库流行度排行 火热出炉 本月共有288个数据库参与排名 本月排行榜前十名有所变动 人大金仓冲入前五开新局 南大通用 中兴通讯排名上升占优势 墨天轮十强名次归属再迎变动 本月排
  • 测试编排效率提升:掌握前置接口响应数据的引用方法

    宁波银行深圳分行综合柜员面经 三方寄过去了 告诉我停止24届招聘 全部毁约 牛的 he芯 毁约应届生 34316 地产投资岗上岸啦 经验分享 江西农发行市级支行信贷岗面试 最终还是搏了一把 2023届CV视觉算法岗求职记录贴 规划指南 实习
  • 浅谈专项测试之弱网络测试

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • unittest自动化测试断言方法的介绍

    断言如同在测试用例上 类似于预期结果与实际结果是否一致 如果一致则表示测试通过 Assert断言 很好的用于测试结果判断上 更灵活的对预期结果和实际结果进行对比 下面简单的介绍一下unittest的Assert断言 unittest中基础的
  • 干货:教你如何在JMeter中调用Python代码N种方法!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • AI绘画生成器让你秒变画神,输入文字就能生成精美图片的AI绘画功能,AI绘画软件推荐

    在当今这个数字化时代 图片编辑已经成为我们日常生活和工作中的一项重要任务 无论是社交媒体上的个人展示 还是商业广告中的产品推广 精美的图片总能吸引更多的关注和赞誉 为了满足广大用户对图片编辑的需求 我们推出了一款全新的软件 首助编辑高手 1
  • CCF编程能力等级认证GESP—C++4级—20230923

    CCF编程能力等级认证GESP C 4级 20230923 单选题 每题 2 分 共 30 分 判断题 每题 2 分 共 20 分 编程题 每题 25 分 共 50 分 进制转换 变长编码 答案及解析 单选题
  • 数据结构学习笔记(七)搜索结构

    文章目录 1 前言 2 概念 3 静态搜索结构 3 1 静态搜索表 3 2 顺序搜索表 3 2 1 基于有序顺序表和顺序搜索和折半搜索 4 二叉搜索树
  • 吴恩达机器学习笔记八 正则化

    使第一项均方差较小来符合数据 使第二项正则化项较小来使 w 较小 0 采用高阶多项式会过拟合 非常大 则每个 w 都很小 F X 约为 b 结果为一条直线 欠拟合 含正则化线性回归的梯度下降 含正则化逻辑回归的梯度下降 到这里第一个专项课程
  • Lazada商品详情API在电商中的价值及实时数据获取实践

    一 引言 在电商行业 数据是驱动业务增长的关键 Lazada作为东南亚地区知名的电商平台 其商品详情API对于电商行业具有深远的影响 本文将探讨Lazada商品详情API在电商行业中的重要性 并介绍如何实现实时数据获取 二 Lazada商品
  • sourcetree 无效的源路径 细节提示:系统找不到指定的文件

    工具 gt 选项 gt git 直接下拉到底 点击红框 重新下载一个内嵌git就可以了 我感觉是因为改变了原有git安装路径的问题
  • 基于ssm的校园闲置物品交易平台

    收藏关注不迷路 源码文章末 文章目录 前言 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 前言 互联网日益成熟 走进千家万户 改变多个行业传统的工作方式 校园闲置物品交易管理以校园闲置物品交易和用户需求为
  • 如何编写产品需求文档(PRD)?「附模板」

    在数字化时代的快速变革中 产品开发不再是一个单向的 线性的过程 它涉及多方面的互动 多维度的考量 以及多个利益相关者的参与 那么 如何确保每个人都对产品的最终形态有一个清晰 一致的理解 如何确保每个人都在为同一个目标努力 产品需求文档就在产
  • Python爬坑指北:大神不会告诉你的优化小技巧

    Python是一种优美的编程语言 简洁 易读 非常适合快速原型设计 然而 随着代码库的增长 性能问题的风险也在增加 低效的Python代码可能会令人沮丧地缓慢 而且通常很难找到瓶颈所在 但是不用担心 在这篇文章中 我们将探讨一些优化Pyth
  • ArkTS 状态管理@Prop、@Link

    当父子组件之间需要数据同步的时候 可以使用 Prop和 Link装饰器 实现的案例之中 代码时平铺直叙的 阅读性可理解性比较差 我们应改遵循组件化开发的思想 在我们使用组件开发的时候 遇到数据同步问题的时候 State状态是解决不了的 所以
  • 母猪智慧养殖VR虚拟互动教学给予学生充分的自主性和创新-深圳华锐视点

    为了保障养殖场生物安全 避免疫情传播 学生开展育肥猪养殖培训 多以参观为主 在一对多的模式下被动了解生产过程 解决实训难的问题 基于元宇宙平台进行育肥猪养殖实训 开启新时代养殖培训领域的新篇章 基于元宇宙进行育肥猪养殖实训 学生可以通过软件
  • 电商平台API接口接入|实战:​获取商品列表接口测试用例举例python

    1 登录获 取商品列表的简单接口 定义 定义已经登陆获取商品列表的接口 包括商品的图片 标题 详情 价格 评论和推荐等
  • Spectre && Meltdown漏洞

    文章目录 前言 一 原理 1 1 旁路 Side Channel 1 2 缓冲时延 Cache Timing 二 利用方法 2 1 Meldown攻击 2 2 Spectre攻击