熔毁,幽灵,以及技术状态

你听过一句俗语“都是1和0”,但这并不是一种语言形式:晶体管,计算机的基本组成部分,只是一个开关,它可以是开(“1”)或关(“0”)。事实证明,虽然,正如克里斯·狄克逊在一篇名为亚里士多德是如何创造计算机的,1和0,通过数学逻辑和晶体管的结合,您需要的只是:

计算机的历史常被称为物体的历史,从算盘到巴贝奇引擎,再到第二次世界大战的破译机。事实上,最好把它理解为思想史,主要是从数学逻辑中产生的思想,一种默默无闻的、类似邪教的学科,最早出现在19世纪。

狄克逊的文章我以前联系过-值得一读,但这篇文章的相关观点可能令人惊讶:计算机真的很蠢;它们之所以有用,是因为它们很快就变蠢了。

处理器漏洞问题

上周科技界受到了震动现代处理器中两个漏洞的暴露:熔化和幽灵。公告有点随意,由于对漏洞性质的广泛猜测(可能是由于对Linux内核的更新),披露日期提前了一周,www.xf187官网娱乐但也因为熔毁和幽灵在某些方面是相似的,但其他方面不同。

从相似性开始:两个漏洞的结果是相同的-非特权用户可以访问他们不应该访问的计算机上的信息,像密钥、密码或其他用户拥有的任何其他类型的数据。对于像AWS这样的云服务来说,这是一个特别大的问题,如果多个“租户”使用相同的物理硬件:

这种多租户体系结构是通过使用虚拟机实现的:有专门的软件在单个物理计算机上运行,允许每个用户像拥有自己的计算机一样操作,实际上他们是在分享。这是一个双赢的结果:单用户计算机大部分时间处于空闲状态(它们真的很快就变得愚蠢)。但是,如果多个用户可以使用一台计算机,那么硬件的利用效率就会大大提高。而且,对于云服务,同样的概念可以扩展到数百万台物理计算机,共享更基本的基础设施,如冷却,网络,行政管理,等。

整个大厦,虽然,基于一个基本假设:一个虚拟机中的用户不能访问另一个虚拟机中的数据。这种假设,延伸,依赖于对虚拟机软件完整性的信任,它依赖于对底层操作系统完整性的信任,它最终依赖于对服务器核心处理器的信任。从熔化白皮书重点矿井):

要将主存储器中的数据加载到寄存器中,主内存中的数据是使用虚拟地址引用的。在将虚拟地址转换为物理地址的同时,CPU还检查虚拟地址的权限位,即。,这个虚拟地址是用户可访问的还是只有内核可访问的。如第2.2节所述,通过权限位进行的这种基于硬件的隔离被认为是安全的,并且被硬件供应商推荐。因此,现代操作系统总是将整个内核映射到每个用户进程的虚拟地址空间中。因此,所有内核地址在转换时都会产生一个有效的物理地址,CPU可以访问这些地址的内容。访问用户空间地址的唯一区别是,由于当前权限级别不允许访问此类地址,CPU引发异常。因此,用户空间不能简单地读取这样一个地址的内容。

内核是操作系统的核心部分,一般用户不可访问;它有自己的内存,不仅可以存储核心系统数据,还可以存储来自所有用户的数据(例如,当它必须被写入或从永久存储器中读取时)。即使在这里,虽然,系统依赖于虚拟化——即用户为其应用程序使用的物理内存相同。由CPU来跟踪内存的哪些部分属于谁,这就是漏洞出现的地方。

投机执行

我刚刚提到了计算机的三个关键部分:处理器,记忆,以及永久储存。事实上,存储数据的体系结构甚至比这更复杂:

  • 寄存器是最快的内存形式,每个时钟周期都可以访问(即,一个2.0GHz处理器可以每秒访问20亿次寄存器)。它们也是最小的,通常只包含当前计算的输入和输出。
  • 然后有不同级别的缓存(l1,L2,等)速度越来越慢,在反面,越来越大,越来越便宜。此缓存位于层次结构中:立即需要的数据将从寄存器移动到一级缓存,例如;所需数据略低于l2,然后L3,等。
  • 内存层次结构的下一个主要部分是主内存,这是系统RAM。虽然缓存量取决于处理器模型,内存量取决于整个系统生成器。这个内存比缓存慢很多,但它也大得多,而且价格也低得多。
  • 内存层次结构的最后一部分,至少在一台计算机上,是永久存储-硬盘。固态硬盘(SSD)在速度上有很大的不同,但即便如此,永久记忆仍然比主记忆慢得多,有了同样的折衷:你可以以更低的价格得到更多。
  • 虽然不是传统内存层次结构的一部分,云应用程序通常在同一网络上的单独物理服务器上具有永久内存;通常的折衷办法是——以非常缓慢的速度获得其他利益,在这种情况下,将数据与其应用程序分开。

可以肯定的是,“非常慢”都是相对的-我们这里讨论的是纳秒。www.xf187官网娱乐杰夫·阿特伍德的这篇文章用人类的话来说:

我们人类所感受到的时间之间的无限空间就是计算机花费所有时间的地方。这是一个完全不同的时间尺度。书系统性能:企业和云有一张很好的表格,可以说明这些时间差有多大。只需将计算机时间转换为任意秒:

1 CPU周期 0.3纳秒 1秒
一级缓存访问 0.9纳秒 3秒
二级缓存访问 2.8纳秒 9秒
三级缓存访问 12.9纳秒 43秒
主存储器存取 120纳秒 6分钟
固态磁盘I/O 50-150μs 2-6天
旋转磁盘I/O 1-10毫秒 1-12个月
互联网:旧金山到纽约 40毫秒 4年
互联网:SF到英国 81毫秒 8年
互联网:旧金山到澳大利亚 183毫秒 19年
操作系统虚拟化重新启动 4秒 423年
SCSI命令超时 30秒 3000年
硬件虚拟化重新启动 40秒 4000年
物理系统重新启动 5米 32千年

[…]

已故的,伟大的吉姆·格雷…也有一种有趣的解释方法.如果CPU寄存器是你从大脑中获取数据所需的时间,然后去磁盘就相当于从冥王星那里获取数据。

格雷在微软时展示了这张幻灯片,为“奥林匹亚,华盛顿参考。让我扩展他的类比:

假设你是一名大学生,暑期在微软雷德蒙实习,你在奥林匹亚的家里收拾衣服。现在西雅图的夏天可能非常挑剔——可能会有大风和下雨,或是阳光明媚。直到凌晨才知道天气会怎么样。为此,谨慎的做法不是只装一套衣服,但为了这两种可能,最好还是打包衣服。毕竟,每次天气变化,从手提箱换衣服比开车回家奥林匹亚要快得多。

这就是类比开始分崩离析的地方:现代处理器为减少获取数据所需的时间所做的不仅是获取比他们可能需要的更多的数据,但事实上提前计算这些数据。这就是所谓的投机执行,它是这些弱点的核心。要将此类比用算法形式表示:

  • 检查天气(执行触发传感器的多个子流程,中继数据,等)
    • 如果天气晴朗,穿短裤和T恤
    • 否则穿牛仔裤和运动衫

记得,电脑很蠢,但他们很快就笨了:执行“穿短裤和T恤”或“穿牛仔裤和运动衫”需要纳秒的时间——等待天气观察需要时间。为了节省时间,处理器会在天气预报之前给你穿好衣服,通常基于历史-过去几天的天气如何?这意味着你可以决定穿什么鞋,配件,等。,一直在等待天气观测。这是关于处理器的另一件事:它们可以同时做很多事www.xf187官网娱乐情。为了达到这个目的,最快的方法就是猜测最终的结果是什么,如果必要的话,回溯。

熔化

现在,假设算法更改为以下内容:

  • 检查经理的日历,看他们是否在办公室。
    • 如果他们在办公室,穿休闲裤和有领衬衫
    • 如果他们不在办公室,穿短裤和T恤

只有一个问题:你不应该访问经理的日历。记住,计算机是愚蠢的:处理器不含蓄地知道这一点,它必须实际检查您是否有访问权限。所以在实践中,这个算法更像这样:

  • 检查经理的日历,看他们是否在办公室。
    • 检查这个实习生是否可以访问他们经理的日历
      • 如果实习生有权,访问日历
        • 如果他们在办公室,穿休闲裤和有领衬衫
        • 如果他们不在办公室,穿短裤和T恤
      • 如果实习生没有权限,别穿衣服了

记得,虽然,电脑很擅长同时做很多事情,不太擅长查找数据;在这种情况下,处理器将,在某些条件下,看经理的日历,决定穿什么在它知道是否应该看日历之前.如果它后来意识到它不应该访问日历,它将撤消所有操作,但最终衣服可能会有点不整齐,这意味着你可能会放弃不该知道的答案。

我已经说过,这个类比正在瓦解;现在已经破烂不堪了,但是这个,用粗笔画,崩溃:在知道是否应该之前,处理器会推测性地获取和执行特权数据;这个过程,虽然,在缓存中留下痕迹,并且这些跟踪可以被非特权用户捕获。

解释幽灵

幽灵更狡猾,但很难做到:记住,多个用户使用相同的处理器-室友,如果你愿意的话。假设我和你一样包装我的手提箱,然后我对处理器进行“训练”,使其始终能期待晴天(也许我会运行一个模拟程序,让每一天都充满阳光)。处理器将提前选择短裤和T恤。然后,当你醒来时,处理器已经选择了短裤和T恤;如果真的下雨了,它会把短裤和T恤放回原处,但总有那么一点点凌乱。

这个类比已经从破烂到完全瓦解——它在这里真的不起作用。你的数据不是简单地从主存储器中推测出来的,当处理器执行错误的分支时,它会暂时停在缓存中;一旦处理器修复错误,它就会被快速删除,但我仍然可以弄清楚那里有什么数据-这意味着我现在已经偷了你的数据。

崩溃更容易解释,因为-英特尔的抗议相反(崩溃也影响了苹果的处理器)-这是由于设计缺陷。处理器负责检查是否可以访问数据,检查得太慢,这样就可以窃取数据,是一个bug。这也是为什么崩溃可以在软件中解决的原因(基本上,在使用数据之前,将有一个额外的步骤检查权限,这就是补丁导致性能下降的原因)。

幽灵完全是另一回事:这是处理器的作用按照设计.计算机做基础计算的速度非常快,但要花很长时间才能得到进行这些计算的数据:因此在不等待瓶颈的情况下进行计算,根据最佳猜测,是利用这种根本不平衡的最佳途径。大多数时候你会更快地得到结果,如果你猜错了,你不会比你做的一切都井然有序的慢。

这个,同样,这就是Spectre影响所有处理器的原因:利用现代处理器的并行性和执行速度所获得的速度收益是如此之大,以至于投机执行是一个显而易见的选择;分支预测器可能由另一个用户进行培训,这样就可以简单地跟踪缓存更改,而不会发生在任何人身上。直到去年(我们知道的)。

而且,延伸,幽灵不能由软件修复:特定的实现可能被阻止,但这种脆弱性是内在的。需要设计新的处理器,但是,数十亿的处理器在使用中却无处可逃。我们得混过去。

幽灵与技术状态

我在2017年结束时没有我的传统“技术状态”职位,同样:幽灵是一种比我写的任何东西都好得多的表现形式。面临着根本的不平衡(数据获取缓慢与执行速度之比),处理器工程师设计了一个针对性能优化的巧妙系统,但由于未能预见到坏人滥用该系统的可能性,每个人都很脆弱。

这种类比是显而易见的:面临着根本的不平衡(获取和保留用户的困难与快速迭代和优化的容易性)。互联网公司设计了专门为参与而优化的系统,但拥有未能预见不良行为人滥用系统的可能性,每个人都很脆弱。

幽灵,虽然,有助于说明这些问题为何如此令人烦恼:

  • 我不相信有人会造成这种脆弱性
  • 这个漏洞可能值得一试——更快的处理器带来的收益绝对是巨大的!
  • 无论如何,过去的决定已经过去了:我们能做的最好的就是混过去

Facebook的影响就是如此,谷歌/ YouTube等。,以及广泛的互联网。动力来自给人们想要的-一个不错的动机!-还有可能的好处呢?-弊大于利。无论如何,我们唯一的选择是前进。

我在每日更新.