X86 关于RIDL漏洞和;重播;装载量

X86 关于RIDL漏洞和;重播;装载量,x86,cpu,cpu-architecture,micro-architecture,cpu-mds,X86,Cpu,Cpu Architecture,Micro Architecture,Cpu Mds,我试图了解脆弱性的类别 这是一类能够从各种微体系结构缓冲区读取过时数据的漏洞。 目前已知的漏洞有:LFB、加载端口、eMC和存储缓冲区 本文主要关注LFB 我不明白为什么CPU会用LFB中的陈旧数据来满足负载。 我可以想象,如果负载在L1d中命中,它将在内部“重放”,直到L1d将数据带到LFB中,并向OoO内核发出停止“重放”的信号(因为读取的数据现在是有效的) 然而,我不确定“重播”到底是什么意思。 我认为负载被分配到一个能够加载的端口,然后记录在负载缓冲区(在MOB中),并最终根据需要保持,

我试图了解脆弱性的类别

这是一类能够从各种微体系结构缓冲区读取过时数据的漏洞。
目前已知的漏洞有:LFB、加载端口、eMC和存储缓冲区

本文主要关注LFB

我不明白为什么CPU会用LFB中的陈旧数据来满足负载。
我可以想象,如果负载在L1d中命中,它将在内部“重放”,直到L1d将数据带到LFB中,并向OoO内核发出停止“重放”的信号(因为读取的数据现在是有效的)

然而,我不确定“重播”到底是什么意思。
我认为负载被分配到一个能够加载的端口,然后记录在负载缓冲区(在MOB中),并最终根据需要保持,直到数据可用为止(如L1所示)。
因此,我不确定“重放”是如何起作用的,此外,为了使RIDL正常工作,每次尝试“播放”一个负载时,都应该解锁相关指令。
这对我来说似乎很奇怪,因为CPU需要跟踪加载正确完成后要重播的指令

RIDL上的论文以这段代码为例(不幸的是,我不得不将其粘贴为图像,因为PDF布局不允许我复制它):

它可以工作的唯一原因是,如果CPU首先使用陈旧数据满足第6行的负载,然后重新播放它。
以下几行似乎证实了这一点:

具体来说,我们可能会有两个 访问速度要快,而不仅仅是与 泄露的信息。毕竟,当处理器发现 它的错误并在第6行以正确的值重新启动 程序还将使用此索引访问缓冲区

但我希望CPU在将数据转发到LFB(或任何其他内部缓冲区)之前检查负载的地址。
除非CPU实际重复执行加载,直到它检测到加载的数据现在有效(即重放)。
但是,同样,为什么每次尝试都会解锁依赖指令


重放机制究竟是如何工作的(如果它存在的话),以及它是如何与RIDL漏洞相互作用的

重播=从RS(调度程序)再次调度。。(这并不是对你整个问题的完整回答,只是关于什么是重播的部分。尽管我认为这涵盖了大部分内容,包括解除阻止依赖UOP。)

这个答案的一部分对加载重放有误解。
请参阅-UOP依赖于拆分或缓存未命中加载,但不会重播加载本身。(除非负载在循环中依赖于自身,就像我在测试>时所做的那样,我不认为来自RS的负载重放与RIDL攻击有关。因此,与其解释什么是负载重放(@Peter的答案是一个很好的起点),我将根据我对RIDL论文中提供的信息、英特尔对这些漏洞的分析以及相关专利的理解,讨论我认为正在发生的事情

行填充缓冲区是L1D缓存中的硬件结构,用于保存缓存中未命中的内存请求和I/O请求,直到它们得到服务。当所需的缓存线填充到L1D数据数组中时,将为可缓存请求提供服务。当满足退出写入组合的任何条件时,将为写入组合写入提供服务缓冲区发生(如手册中所述)。当UC或I/O请求被发送到二级缓存(尽快发生)时,将为其提供服务

参考RIDL图4。用于产生这些结果的实验如下:

  • 受害线程将已知值写入单个内存位置。内存位置的内存类型为WB、WT、WC或UC
  • 受害线程在循环中读取相同的内存位置。每个加载操作后面都有
    MFENCE
    ,并且有一个可选的
    CLFLUSH
    。从论文中我不清楚
    CLFLUSH
    相对于其他两条指令的顺序,但这可能并不重要。
    MFENCE
    序列化cache line flushing操作,查看缓存中的每个加载未命中时会发生什么。此外,
    MFENCE
    减少L1D端口上两个逻辑核之间的争用,从而提高攻击者的吞吐量
  • 在同级逻辑核上运行的攻击者线程在循环中执行清单1所示的代码。第6行使用的地址可以是任何内容。唯一重要的是,第6行的加载会出现故障或导致需要微码辅助的页面漫游(设置页面表项中的访问位)。页面漫游也需要使用LFB,并且大多数LFB在逻辑核心之间共享
我不清楚图4中的Y轴代表什么。我的理解是,它代表每秒从隐蔽通道进入缓存层次结构(第10行)的行数,其中数组中的行的索引等于受害者写入的值

如果内存位置为WB类型,当受影响线程将已知值写入内存位置时,该行将填充到L1D缓存中。如果内存位置为WT类型,当受影响线程将已知值写入内存位置时,该行将不会填充到L1D缓存中。但是,在第一次读取时因此,在这两种情况下,如果没有
CLFLUSH
,大多数来自受害线程的加载都会命中缓存

当加载请求的缓存线到达L1D缓存时,它首先写入分配给该请求的LFB。缓存线的请求部分可以直接从LFB提供给加载缓冲区,而无需等待缓存中的缓存线被填充。