近日,Linux 内核项目负责人 Linus Torvalds 拒绝了 AWS 工程师提交的一个补丁,该补丁的目的是减轻 Intel CPU 遭遇一种新型窥探攻击而导致数据泄露的风险。
这种新型攻击名为 “探听辅助 L1 数据采样攻击”,简称 Snoop (CVE-2020-0550)。今年 3 月,来自 AWS 的软件工程师 Pawel Wieczorkiewicz 率先发现了 Intel 处理器的这一漏洞,它可能会泄露 CPU 内部存储器或缓存中的数据,涉及 CPU 包括 Intel 旗下流行的 Xeon 和 Core 系列处理器。Pawel 迅速向 Intel 报告了此问题,随后该漏洞被 Intel 定位为中等严重性漏洞。
新的 Snoop 攻击利用了 Intel CPU 多级缓存、缓存一致性和总线监听等特性,通过位于 CPU 内核中的一级数据缓存(L1D),通过 “总线监听”(bus snooping)功能 —— 在 L1D 中修改数据时发生的缓存更新操作,将数据从 CPU 中泄漏出来。
以近代 CPU 的视角来说,计算机通常会采用三级缓存的设计来提高 CPU 的运行效率。三级缓存包括 L1 一级缓存、L2 二级缓存、L3 三级缓存,这些缓存都集成在 CPU 内,它们的作用是作为 CPU 与主内存之间的高速数据缓冲区。其中 L1 最靠近 CPU 核心;L2 其次;L3 再次。运行速度方面:L1 最快、L2 次快、L3 最慢;容量大小方面:L1 最小、L2 较大、L3 最大。在执行一项任务时,CPU 会先在最快的 L1 中寻找需要的数据,找不到再去找次快的 L2,还找不到再去找 L3,L3 都没有才去内存找。
而一级缓存其实还分为一级数据缓存(Data Cache,D-Cache,L1D)和一级指令缓存 Instruction Cache,I-Cache,L1I),分别用于存放数据及执行数据的指令解码,两者可同时被 CPU 访问,减少了 CPU 多核心、多线程争用缓存造成的冲突,提高了处理器的性能。一般 CPU 的 L1I 和 L1D 具备相同的容量,例如 I7-8700K 的 L1 即为 32KB+32KB。Snoop 攻击就是一种窃取 L1D 缓存中数据的攻击手段。
不过 Intel 的用户也不用惊慌,据 Intel 官方解释说,这种新攻击「很难实施」,并且不会泄露大量数据,毕竟 L1D 缓存中的数据非常有限,并且只有在任务运行时调用数据的短暂时间内才会存在。“我们不认为 Snoop 攻击在可信赖的操作系统环境下是一种实用的攻击方法,因为要利用这一漏洞需要同时满足很多苛刻的条件,比如攻击的时间要正好与用户打开程序的时间吻合,且程序调用的数据正好是攻击者想要窃取的数据。”
该漏洞披露之后,另一位来自 AWS 的软件工程师 Balbir Singh 为 Linux 内核提交了一个补丁,该补丁使 Linux 的应用程序能够选择在任务切换时自动刷新 L1D 的缓存,以降低 Linux 系统遭遇 Snoop 攻击的风险。
Singh 在 4 月份曾解释说:“这个补丁可以防止他们的数据在任务结束后被监听或通过旁道泄露。”他原本打算该补丁可以随 Linux 内核的 5.8 版一起发布。“如果硬件支持,该特性将允许基于可选加入的应用程序调用 prctl) 功能来刷新任务关闭后残留在 CPU 中的 L1D 缓存。”
但是,知名技术测试网站 Phoronix 指出,在任务结束后刷新 L1D 缓存会导致 CPU 的性能降低。Linux 内核项目负责人 Linus Torvalds 认为,这将导致使用该补丁的所有 Linux 用户(无论是否采用 Intel CPU)的 CPU 性能降低,严正拒绝了该补丁,同时还一如既往地说起了骚话。
Torvalds 在回复该提交的邮件列表中写道:“因为在我看来,这基本上是将缓存刷新指令导出到用户空间,并为进程提供了一种方式,可以说让与这事情无关的其他人也慢了下来。”
“换言之,据我所知,这就是疯狂的 Intel 发布了有缺陷的 CPU,它给虚拟化代码带来了问题(我对此并不太在意),但现在要因为它的问题影响到本来就没有这些问题的 Linux 用户,这是完全没有意义的。”
(Linus 在邮件列表中的原文)
“我不想某个应用程序跑起来就像在说 ‘哦,我是一个特别的,漂亮的,如此娇嫩的花,我想刷新 L1D 上的每一个任务缓存,无论我在什么 CPU 上,无论它是否有漏洞’。因为这个应用程序不仅会降低自身速度,还会降低其他应用程序的速度。”
在一番非常 Linus 式的回复下,Linus 对虚拟化的引用其实也是针对 AWS 的,AWS 和其他云服务提供商一样,销售的虚拟 cpu 通常启用了同步多线程(simultaneous multithreading,SMT)功能。Linus 接着指出,“在启用 SMT 的情况下,任务调度是分布式进行的,所以说,在任务结束与新任务开始之间刷新 L1D 缓存是非常愚蠢的。”
值得一提的是,AWS 的首席工程师 Benjamin Herrenschmidt 在与 Red Hat Linux 内核贡献者 Ingo Molnar 的讨论中也为该补丁的争论添加了一些背景。Herrenschmidt 承认这个补丁对 SMT 来说毫无意义,但他敦促 Linux 内核开发人员不要 “把婴儿和洗澡水一起扔掉”,并反驳了这个补丁是因为 AWS 想把超线程作为虚拟 cpu 出售的说法。Herrenschmidt 说,“这些补丁并不是要解决运行 SMT 的客户 VM 内部出现的问题,也不是要保护 VM 免受同一系统上其他 VM 的攻击。”
事实上,Linus 已经不是第一次严辞拒绝与 Intel CPU 有关的补丁。2018 年初,为了修补 Spectre 漏洞,Intel 工程师提供了一个间接分支限制推测(indirect branch restricted speculation, IBRS)功能的补丁。Linus 当时就在邮件列表中公开指出 IBRS 会造成系统性能大幅降低,直言该补丁 “就是彻彻底底的垃圾”,“Intel 真的要做这个 X 一样的东西?” 一顿口吐芬芳。
而就在上个月,Linus 对自己的私人电脑进行了升级,同时公开了自己最新的主力机器配置,他把自己的 CPU 换成了 AMD Ryzen Threadripper ,放弃使用了 15 年的 Intel 处理器。