为什么虚拟地址(VA)分隔不足以缓解各种幽灵和崩溃漏洞?我的意思是通用的,不包括用来攻击英特尔p-cache == v-cache hack的工具;那显然是个坏主意,我找不到同情。
作为基线:
我的内核地址空间(AS)与用户AS仅共享一个文本和数据页。这些页面仅包含足够的代码和数据来保存和存储寄存器。加载新的内存上下文,然后跳转到适当的位置。因此,这里没有有趣的地址。
exec的流程AS没有任何共同的VA。也就是说,每个VA分配都来自一个公共池,因此,即使共享对象(如libc)在每个进程中也位于不同的地址。大多数来自unix的人都会发现这个奇怪的地方,但这当然是可行的。我错误地做了一次^ H * 10 /以进行测试。
Fork()的处理图像位于单独的访问控制域中,则会对其进行沙盒处理,以防止交叉泄漏。沙箱可能涉及上下文切换缓存逐出,一直到 non-interference 内核,一直排除超线程的cpuset。
我知道[1]是与熔毁相关的问题的基本缓解方法; [2]是[1]的扩展,因此适用于Spectre。 [3]会导致性能问题,但同样,仅限于那些情况。
答案 0 :(得分:3)
Meltdown攻击取决于(推测地)直接(从攻击过程中)访问目标虚拟地址。 1 。
但是幽灵不是。 您对分支预测器进行初始化,以便受攻击的代码以推测方式访问其有权执行的虚拟地址空间。分支预测器别名意味着您通常/有时可以在您尚未/未映射的虚拟地址处填充分支的预测。 (例如在内核中)。
通常的旁通道是一种缓存读取攻击,它是基于在您自己的地址空间中为阵列清除缓存的。但是,也可以使用其他辅助渠道将Spectre数据从目标返回给攻击者,例如启动缓存,然后寻找冲突别名驱逐了哪个条目,从而使别名内存在受到攻击的过程中。 (较硬,因为现代x86 CPU中的L3缓存使用了复杂的索引功能,这与使用简单位范围作为索引的简单缓存不同。但是您可能会使用L2或L1d未命中。 L2 miss / L3 hit应该仍然比L2 hit更长。)
或与SMT(例如超线程)一起使用,这是ALU定时攻击,其中Spectre小工具会创建与数据相关的ALU端口压力。在这种情况下,唯一相关的内存访问是受到攻击的数据(硬件允许,只有分支的错误推测会导致回滚,而不是加载错误)。
攻击内核时,它将在某个位置映射攻击进程的物理内存页面。 (大多数内核将所有物理内存映射到连续的虚拟地址范围,从而可以轻松访问任何物理地址。)缓存基于物理地址,而不是虚拟的。
通过同一页面的不同映射使高速缓存行变热的Spectre小工具仍然有效。
在系统调用的上下文中,内核通常会将用户空间内存映射到进程内部使用的相同虚拟地址,因此系统调用如read
和{ {1}}可以在用户空间和页面缓存之间复制。许多系统调用将用户空间指针传递给文件名。因此,在攻击内核时,Spectre小工具可以在攻击过程中直接使用用户空间地址。
Spectre小工具本身甚至可能位于用户空间内存中,尽管可以使用独立的页表来解决Meltdown问题,但您可以通过将内核页表设置为在未经执行权限的情况下映射用户空间VA来减轻这种情况。
脚注1:Meltdown是页表中U / S位的旁路,它允许用户空间潜在地读取内核所映射的任何内存。是的,[1]是足够的解决方法。参见http://blog.stuffedcow.net/2018/05/meltdown-microarchitecture/。