CPU 设计人员如何防止因推测执行而导致的信息泄露?

信息安全 崩溃 幽灵 中央处理器
2021-08-27 13:21:49

我们知道缓解某些微处理器中的 Meltdown 和 Spectre 漏洞的短期措施,其中推测性执行对缓存时间有可衡量的影响(主要是微代码、操作系统和任何包含信任边界的应用程序的补丁)。

该问题的长期解决方案是什么?

显然,简单的解决方案,例如“不推测”或“推测时忽略缓存”,由于首先引入推测的性能考虑,不太可能被接受。

也许推测的指令可以使用单独的缓存,只有在推测成功时才会复制到主缓存?如果不是,为什么不呢?

处理器能否将特权信息添加到页表条目,以使内核页表隔离自动(并减少其性能影响)?

是否有其他设计更改可以在不影响性能的情况下提高安全性?

3个回答

修复 Meltdown 很简单:如果 CPU 正在执行推测执行,请不要从内存的受保护区域读取数据。Meltdown 几乎完全是英特尔独有的事实表明这是一个设计缺陷,而不是推测执行的固有副作用。

在一般情况下修复 Spectre 要困难得多。Spectre 是关于诱导程序推测性故障,然后观察该故障的副作用。无法摆脱所有的副作用:即使你可以回滚所有的缓存、缓冲区、表等等,一个简单的事实是推测执行涉及推测执行运行推测性指令需要(在某种程度上是数据可控的)时间量,除非弄清楚时间旅行,否则无法撤消。

能做的就是大大增加引发投机故障的难度。目前,大部分CPU都没有“进程”的概念,在分支预测表中查找时只使用部分地址。如果分支预测数据被标记以指示它属于哪个进程,或者如果分支预测表在每次上下文切换时被刷新,则有效地消除了一个程序错误训练另一个程序的分支预测器动作的能力。同样,如果使用完整地址执行分支预测,程序就不能攻击自己(例如,Javascript 将无法使用 Spectre 突破 Web 浏览器的沙箱)。

所有这三种攻击都使用侧通道,其中推测执行产生的副作用可以实际观察到。

为了防止此类攻击,必须更改推测执行电路以不产生任何可观察到的处理器状态变化(除了它们产生的临时结果)。例如,处理器可以在推测执行之前对所有缓存、缓冲区和表进行快照,并在未采用分支时恢复它们。或者,例如,在分支预测失败后,它可以通过使对所有高速缓存行的访问第一次同样慢来防止观察到这种影响。

不幸的是,任何修复都将意味着对当前处理器设计和方法的重大改变,并且可能会抵消分支预测和推测执行的许多好处。

据我所知,缓解某些微处理器中的 Meltdown 和 Spectre 漏洞的短期措施,其中推测性执行对缓存时间有可衡量的影响(主要是微码、操作系统和任何包含信任边界的应用程序的补丁)。

因此,我可以说防止任何信息从 CPU/GPU/PSU 泄漏的正确方法是“Ziploc”范例。ziploc 范例又名 Ziparadignloc,是防止此类事情发生的唯一方法,因为它一旦密封就被正确密封。