2

RIDL 漏洞利用需要攻击者触发页面错误才能从行填充缓冲区读取陈旧数据。但是根据关于 RIDL 漏洞和负载的“重放”,也可以使用辅助负载。

该问题九次提到辅助/辅助负载,但我仍然无法理解这种负载的作用或触发方式。这与 TLB 相关,并且“导致需要微码辅助的页面浏览”。

有人可以解释一下辅助/辅助负载是什么,最好用一个已解决的例子吗?

4

1 回答 1

2

您在该引文中省略了该句子的其余部分,这解释了为什么页面遍历可能需要微码辅助:“...导致需要微码辅助的页面遍历(在页表条目中设置访问位)

x86 ISA 表示,读取或写入页面将在该映射的页表条目 (PTE) 中设置“已访问”位,如果该位尚未设置。操作系统可以使用它来查看哪些页面实际上被定期访问(通过清除访问位并让硬件再次设置它),因此如果需要释放一些物理页面,它们可以决定要分页哪些页面。“脏”位的故事相同,它让操作系统知道页面是否需要同步回文件或其他后备存储(如果有)。(例如操作系统如何实现 a mmap(MAP_SHARED,PROT_WRITE)

填充 TLB 条目的页面遍历是纯专用硬件,但使用存储更新那些 PTE 位非常罕见,可以留给微码处理;CPU基本上会陷入内部微码并在恢复之前运行它。

在某些 CPU 中使用了类似的机制来处理硬连线 FPU 无​​法处理的非正规浮点结果。这让常见情况(标准化浮点数)具有更低的延迟。

有关的:


英特尔上的性能计数器(至少在 Skylake 上): perf stat -e other_assists.any

[除 FP-assist 之外,HW 调用微码辅助的次数。示例包括 AD(页面访问脏)和 AVX* 相关辅助]


触发辅助从用户空间加载: 我不确定哪种方法好。

msync(MS_SYNC)在文件支持的映射上应清除脏位。IDK 如果它会清除访问位。据推测,使用 MAP_POPULATE 支持的新文件mmap将清除其访问位,但将其连接到页表中,因此不会出现#PF页面错误异常。也许也适用于MAP_ANONYMOUS.

如果您有多个页面的已访问位清晰,您可以循环它们以便能够执行多个辅助加载,而无需在其间进行昂贵的系统调用。


在 Linux 内核 4.12 及更高版本上,我怀疑私有匿名页面会根据手册页描述它madvise(MADV_FREE)的方式清除 Dirty 位。它还可能清除 Accessed 位,因此负载可能还需要辅助 IDK。

MADV_FREE(自 Linux 4.5 起)
应用程序不再需要 addr 和 len 指定范围内的页面。内核因此可以释放这些页面,但释放可能会延迟到内存压力发生时。 对于每一个被标记为释放但尚未释放的页面,如果调用者写入该页面,释放操作将被取消. 在成功的 MADV_FREE 操作之后,当内核释放页面时,任何陈旧的数据(即脏的、未写入的页面)都将丢失。但是,随后对该范围内的页面的写入将成功,然后内核无法释放这些脏页面,因此调用者始终可以看到刚刚写入的数据。如果没有后续写入,内核可以随时释放这些页面。释放范围内的页面后,调用者将在后续页面引用时看到按需填充零页面。

MADV_FREE 操作只能应用于私有匿名页面(请参阅 mmap(2))。在 Linux 4.12 之前的版本中,当释放无交换系统上的页面时,给定范围内的页面会立即释放,而不管内存压力如何。

或者也许mprotect,或者也许mmap(MAP_FIXED|MAP_POPULATE)是一个新的匿名页面来替换当前页面。使用 MAP_POPULATE 它应该已经连接到 HW 页表(首次访问时不需要软页错误)。脏位应该是清楚的,也许还有访问位。


mask=0的vpmaskmovd存储(没有实际存储)将触发对写保护页面的帮助,例如mmap(PROT_READ|PROT_WRITE),仅读取而不写入的延迟分配页面。所以它仍然是 CoW 映射到零的共享物理页面。

它使页面保持干净,因此如果每个商店的 mask=0 不替换任何元素,则每次在数组上的循环中都会发生这种情况。

这与您想要的 Accessed / Dirty page-table 帮助略有不同。我认为这种辅助是用于故障抑制,因为它不需要出现#PF页面错误。(该页面实际上是写保护的,而不仅仅是干净的。)

IDK 如果这对 MDS / RIDL 目的有用。

我还没有对来自新分配的mmap(MAP_POPULATE)缓冲区的屏蔽负载进行测试,以查看它们是否需要帮助但未设置 Accessed 位。

于 2020-04-27T06:49:47.383 回答