【发布时间】:2019-10-03 00:23:57
【问题描述】:
CVE-2018-12126 已分配给 MSBDS(微架构 StoreBuffer 数据采样),这是英特尔处理器的漏洞,属于新创建的 MDS (Microarchitectural Data Sampling) 类。
我正在尝试了解这些漏洞背后的微架构细节。我从 MSBDS 开始,也称为 Fallout (cfr Meltdown),它允许攻击者泄露存储缓冲区的内容。
出于某种原因,讨论微架构细节的网络安全论文往往不够精确。
幸运的是,MSBDS 论文引用了patent US 2008/0082765 A1(图片来自该地址)。
据我所知,在 MSBDS 的情况下,漏洞似乎在于内存消歧算法如何处理带有无效物理地址的负载。
这是用于检查存储缓冲区中的负载是否匹配的算法:
302 检查加载引用的页面偏移量是否与存储缓冲区中任何先前存储引用的页面偏移量匹配。
如果此检查失败,则加载与任何存储都不匹配,并且可以在 304 处执行(已调度)。
如果 302 进行检查,则加载的 虚拟地址 的上半部分将根据商店的虚拟地址检查1。
如果找到匹配项,则加载匹配,并且在 308 转发所需的数据或加载本身被阻止(直到匹配的存储提交)如果转发是不可能的(例如,将存储缩小到更宽加载)。
注意相同的虚拟地址可以映射到两个不同的物理地址(在不同的时间,但在存储转发窗口内)。不通过此算法防止不正确的转发,而是通过耗尽存储缓冲区(例如,使用正在序列化的mov cr3, X)2。
如果加载的虚拟地址与存储的任何虚拟地址都不匹配,则在 310 处检查物理地址。
这是处理不同虚拟地址映射到相同物理地址的情况所必需的。
第 [0026] 段补充说:
在一个实施例中,如果在操作302有命中 以及加载或存储操作的物理地址 无效,则操作 310 的物理地址检查可能 被认为是命中并且方法300可以继续 操作 308。在一种情况下,如果 加载指令无效,加载指令可能是 由于 DTLB 118 未命中而被阻止。此外,如果物理 存储操作的地址无效,结果可能 在一个实施例中基于细网命中/未命中结果 或者加载操作可能会在此存储操作上被阻止 直到解析存储操作的物理地址 在一个实施例中。
这意味着如果物理地址不可用,CPU 将只考虑地址的低 (12) 位3。
考虑到 TLB 未命中的情况在下面几行中得到解决,这仅留下访问页面不存在的情况。
这确实是研究人员提出攻击的方式:
char * victim_page = mmap (... , PAGE_SIZE , ...) ;
char * attacker_page = mmap (... , PAGE_SIZE, ...) ;
mprotect ( attacker_page , PAGE_SIZE , PROT_NONE ) ;
offset = 7;
victim_page [ offset ] = 42;
//Why people hate specpolines??
if ( tsx_begin () == 0) {
//Read the stale value and exfiltrate it with a spectre gadget
memory_access ( lut + 4096 * attacker_page [ offset ]) ;
tsx_end () ;
}
//Reload phase of FLUSH+RELOAD
for ( i = 0; i < 256; i ++) {
if ( flush_reload ( lut + i * 4096) ) {
report ( i ) ;
}
}
我不确定还有什么会导致无效的物理地址(访问特权页面返回正确的物理地址)。
真的是对无效物理地址的处理触发了MSBDS漏洞吗?
1SBA(存储缓冲区地址)组件同时保存存储的虚拟地址和物理地址,可能只是物理地址的一部分(其余部分位于专用数组中,可能命名为物理地址缓冲区)。
2我不清楚是否真的可以通过将页表条目更改为指向其他位置然后发出 invlpg 来触发错误转发。
3我对此的理由是,由于我们没有处于可恢复的情况下,负载有问题,跳过另一次检查冒着不正确转发的风险是值得的性能方面 因为它会使负载提前退出(和故障)。
【问题讨论】:
-
关于第二个脚注,
invlpg是一个完全序列化的指令,因此不会发生不正确的转发,因为在不提交所有先前存储的情况下无法更改同一虚拟地址的映射。关于第 0026 段,最后一句话看起来很重要,因为它描述了 4K 混叠,作者似乎称之为 WTF。我没有读过这篇论文,但看起来 WTF 是对 4K 混叠的利用,这很有意义。我打算阅读这篇论文,然后可能会在此之后发布答案以确保确定。 -
@HadiBrais 谢谢,我实际上是想了解这是否只是 4K 混叠问题。在我读过的所有官方新闻或论文中,都强调了“故障负载”的重要性。正常的 4K 混叠只会导致延迟。
-
是的,看起来这种推测仅在别名负载出现故障时才会发生。 RIDL 也是如此。但如果是 4K 混叠,那么作者在论文中的任何地方都没有提到 4K 混叠,这将是非常奇怪的,即使它是众所周知的。 (也许是故意混淆大家。)
-
@HadiBrais 我不确定,但我认为直到负载不断重播更年轻的依赖微指令才能调度。据我了解,正确检测到 4K 混叠只会延迟加载,而在出现错误加载的情况下,会跳过此检查并且加载完成执行(允许相关的 uops 调度和安装经典的隐蔽通道攻击)。
标签: security x86 cpu-architecture speculative-execution cpu-mds