关注了就能看到更多这么棒的文章哦~

Blocking straight-line speculation — eventually

By Jonathan Corbet
December 9, 2021
DeepL assisted translation
https://lwn.net/Articles/877845/

Spectre 类型的漏洞,之所以被专门起了一个名字,是因为人们认为这类问题会困扰着我们很长时间。随着 Meltdown 和 Spectre 披露日期的四周年到来,我们不得不服气,确实需要这么一个名字。最近的一个 Spectre 变种被称为 "straight-line speculation",是在 2020 年 6 月首次披露的,但其 fix 仍在努力开发中,希望能想办法进入编译器和内核。

straight-line speculation 与其他 Spectre 漏洞有些不同。回顾一下,经典的 Spectre 问题通常是影响下面这类代码:

if (offset < obj->array_length)do_something_with(obj->array[offset]);

从表面上看,这段代码是很安全的:只会在给定的 offsett 符合范围要求的情况下才会去解析并使用 obj->array 中 offset 的位置。但是,运行这段代码的 CPU 当时如果无法从 cache 中获取到 obj->array_length,那么就需要等待从内存中获取到这个值。此时 CPU 并不会仅仅等待而什么都不做,它实际上会猜测一下比较的结果,然后根据推测的结果来继续执行。但是它可能会猜错,从而采用了一个越界的 offset 来访问 obj->array。但是这不应该是个问题,因为一旦 array_length 被 CPU 获取到了,那么 CPU 就必定会发现这里它猜错了,然后它会相应地把这部分基于错误猜测的工作丢弃掉。

这里的问题是这种猜测性地执行工作会在系统中其他地方(最常见的是 memory cache)留下痕迹,可以被利用来把攻击者本来无法访问到的数据暴露出来。在最坏的情况下,Spectre 漏洞可以被用来攻击内核或在同一个物理主机上运行的虚拟机之间进行攻击。这些是真正可行的攻击方式,因此人们采取了许多防护措施希望能挫败这些攻击,尽管需要付出很大的性能损失的代价。

straight-line speculation,最初是在 Arm 的这份白皮书(https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability/downloads/straight-line-speculation )中披露的,它的与众不同之处在于它不依赖于错误的 branch 预测。事实上,它根本不需要牵涉到 conditional branch (条件分支)。相反,它利用了一些关于 unconditional control-flow 变化的奇怪行为。有很多指令会导致程序计数器(program counter,PC)的变化;在 Arm 上,这包括可以产生 exception (异常)的指令,也包括 unconditional direct branch 以及从函数调用中返回的 RET 指令。

人们总以为 CPU 的 speculative-execution (预测执行)模式在遇到这些指令时能够正确处理(当然应该停止预测),这不应该是什么难事。但是,事实证明,在某些 CPU 上,在某些情况下,CPU 可能会采用推测性地策略来执行紧跟在后面的指令,就像这些特殊指令并不存在一样。也就是继续直冲冲地向下继续执行,这就是 straight-line 的名字的来源。如果攻击者能够在这些指令之后紧接着放一些他希望 CPU 去访问某些内容的代码,那么这部分代码可能就会被预测性地执行,从而在系统的其他地方产生跟以前一样的一些影响。这是一个很难利用的漏洞(目前还不清楚是否有人在现实世界中真正利用了这个漏洞),但它仍然是一个需要 fix 的漏洞。

Arm CPU 中的这个漏洞得到了编号 CVE-2020-13844。GCC 和 LLVM 很快就添加了 patch 来解决这个问题。新的 -mharden-sls flag 可以打开相关的防护措施。令人高兴的是,这个问题相对容易解决,只要在这些 unconditional branch 之后放置一个 barrier 指令就可以解决这个问题。如前所述,由于这些跳转是 unconditional 的,因此这些 barrier 操作实际上不会被真正执行,但在 CPU 的 straight-line speculation 执行过程中会看到,这时预测执行机制就会停下来。因此,这个改动并不会真正影响性能,除了最终的可执行文件 size 略有增加之外。

碰巧,不仅仅是 Arm 有这个问题,其他一些 x86 处理器也可能会预测性地执行 RET 指令之下的指令。在这种情况下,解决方案就是在 RET 之后放置一条 INT3 指令来阻止预测执行。INT3 是一条单字节指令,通常被调试器用来设置断点。同样,以这种方式使用时,它实际上不会得到执行。

编译器的改动已经准备好了,可以处理好这个漏洞(尽管它们还没有出现在正式 release 版本中),但是内核还没有更新来使用这些新的编译器。此外,由于很难利用这个漏洞,因此这个问题的解决就显得不那么特别迫切了。

Jian Cai 在 2 月份发布了一组 patch 针对 Arm 增加了保护,但这项工作还没有被合入 mainline。Arm 开发者 Will Deacon 反对这组 patch:

我仍然不理解为什么 Spectre-v1 没能能够得到编译器修改来进行防护,而 SLS 却能得到这种防护?修改编译器将会影响所有运行内核二进制文件的 CPU。换句话说,我认为这里最主要缺少的是一个解释,来说明为什么 SLS 就值得需要让所有的 C 代码都需要受到影响。

这组 patch 此后没有再出现。

在 x86 方面,Peter Zijlstra 最近提供了一组相关 patch。这里也是使用了新的编译器选项(当编译器可以支持时)来插入所需的指令,但是(正如 Deacon 在回应 Arm 补丁时指出的)这只是问题的一部分。内核里有相当多的汇编代码,这些代码都不会被编译器的修改简单解决。因此,Zijlstra 费了很大力气,用一个宏来替代了所有的 RET 指令,当选择正确的配置选项时,这个宏就可以被展开来包括一个额外的 INT3 指令。为了慎重起见,objtool 工具也增加了功能,用来检查 INT3 指令是否被插入到了相应的位置,以此来防止未来有人新写一些代码来引入类似的漏洞。

鉴于自这个漏洞被披露以来已经过去了将近一年半的时间,很明显,没有人觉得必须要尽快解决这个问题。在 straight-line speculation 这方面的防护进展十分缓慢,跟最初 Meltdown 和 Spectre 披露前的争分夺秒状态比起来相差甚远。但有一点我们现在应该已经知道了,那就是攻击者最终会想出一个办法来利用任何漏洞,不管它有多难利用。因此,straight-line speculation 漏洞的保护机制还是很受欢迎的,尽管它来得很晚。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

LWN:终于能够防护 straight-line 预测执行漏洞了!相关推荐

  1. DVWA靶场01-系统命令执行漏洞利用及防护(Low/Medium/Hight)

    目录 01-Low 01.1 任意文件读取 01.2 小马实现Getshell 01.2.1 获取网站路径 01.2.2 写入一句话木马 01.2.3 连接一句话木马 01.3 设置后门 02-Med ...

  2. 【安全漏洞】Rocket.Chat 远程命令执行漏洞分析

    简述 Rocket.Chat 是一个开源的完全可定制的通信平台,由 Javascript 开发,适用于具有高标准数据保护的组织. 2021年3月19日,该漏洞在 HackerOne 被提出,于2021 ...

  3. [系统安全] 十.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)及防御详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  4. 驱动提取软件_深入分析施耐德工控软件代码执行漏洞

    更多全球网络安全资讯尽在邑安全 简介 在本文中,我们将为读者详细介绍Claroty Research团队的Amir Preminger和Sharon Brizinov是如何组合利用两个漏洞,来触发施耐 ...

  5. oracle11g远程命令执行漏洞,漏洞应急|Oracle Weblogic Server远程代码执行漏洞(CVE-2021-2109)...

    近日,锐捷网络CERT安全应急响应团队关注到Oracle官方发布了2021年1月关键补丁更新公告,该补丁中修补了包括 CVE-2021-2109 Weblogic Server远程代码执行漏洞在内的多 ...

  6. struts2 ognl 判断数据类型_新华三攻防系列之防护篇从防护角度看Struts2历史漏洞...

    前言 Struts2漏洞是一个经典的漏洞系列,根源在于Struts2引入了OGNL表达式使得框架具有灵活的动态性.随着整体框架的补丁完善,现在想挖掘新的Struts2漏洞会比以前困难很多,从实际了解的 ...

  7. Source引擎的远程代码执行漏洞,可能影响千万游戏玩家

    本文讲的是Source引擎的远程代码执行漏洞,可能影响千万游戏玩家, 目前多款主流游戏,如CS.绝地要塞等都在使用Source引擎,Source引擎由Valve软件公司开发,这个引擎提供关于渲染.声效 ...

  8. cve-2017-12617 tomcat远程代码执行漏洞复现测试

    0x00前情提要 Apache Tomcat团队10月3日宣布,如果配置了默认servlet,则在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操 ...

  9. Apache Log4j2 远程代码执行 漏洞

    1.漏洞说明 Apache Log4j2是一个基于Java的日志记录工具.该工具重写了Log4j框架,并且引入了大量丰富的特性.该日志框架被大量用于业务系统开发,用来记录日志信息.大多数情况下,开发者 ...

  10. android fastjson漏洞_【漏洞预警】Fastjson 远程代码执行漏洞(暂无PoC)

    Fastjson简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种"假定有序快速匹配"的算法,把JSON Parse的性能提升到极致,是目前Jav ...

最新文章

  1. 使用runtime让button传递多个参数
  2. spring包自动扫描声明
  3. linux命令返回上一次所在的目录
  4. fedora17用yum下载包而不安装包
  5. pdo mysql fetchall_pdo fetch,pdo fetchAll,pdo query,pdo prepare用法举例
  6. Shell运算符及条件判断
  7. 本地安装UCSC基因组浏览器
  8. orocod_kdl学习(一):坐标系变换
  9. 误码率matlab怎么计算,Matlab 仿真(7,4)汉明码 传输误码率
  10. html5 预渲染,VUE预渲染及遇到的坑_情愫_前端开发者
  11. fastboot下载慢的一种原因
  12. win10记得pin码 重置密码登录
  13. win7计算机锁频图片怎么设置,Win7系统怎么使用注册表设置锁屏壁纸的图文教程...
  14. 2021年美容师(中级)新版试题及美容师(中级)免费试题
  15. 【魔方攻略】SQ1魔方教程(原创)
  16. 1、请简要介绍下SVM。
  17. html 中圆角怎么写,html中的圆角
  18. 每日计划(2)——大二
  19. Python视觉摄像头检测有趣项目之机器学习和概率论重点概念分析重要(三)(重点)
  20. 使用google.gson工具时-JSON(谷歌)的使用

热门文章

  1. Only fullscreen activities can request orientation异常解决
  2. 一个屌丝程序猿的人生(一百二十)
  3. 场景图生成论文阅读笔记 之 LinkNet: Relational Embedding for Scene Graph
  4. Image Retrieval using Scene Graphs ——基于场景图的图像检索 读书笔记
  5. IJCAI 2022 | 量化交易相关论文(附论文链接)
  6. 移动地盘仿真平台搭建
  7. 上海交通出行热线电话一览
  8. Vue使用Electron获取电脑MAC地址
  9. 上海小i机器人创始人:并非炒作 Siri几乎完全侵权
  10. window下webrtc编译m84