来自谷歌的几位研究人员在一篇论文中指出,推测性漏洞目前击败了所有编程语言级别的信息保密手段。这不只是我们如何构建系统的偶然性属性,而是错误的心智模型导致我们在不知情的情况下以安全性换取性能的结果。
我们的论文表明,这些泄漏不仅是设计缺陷,而且实际上是理论计算的基础。
信息机密性是系统的一个非常理想的属性,应该在从硬件到编程语言的不同抽象层次上强制执行。
编程语言提供了不同数量的手段来保证机密信息不会泄露。例如,在很多主流编程语言中,类型系统旨在排除一些可能危及完整性、机密性和可用性的危险行为。类型系统尝试强制执行的一个重要属性是内存安全性,这通常是许多漏洞背后的罪魁祸首,并且已经有大量的研究工作致力于以一种可信任的方式构建编程语言,不会导致意外的情况发生。但谷歌的研究人员称,Spectre漏洞改变了这一切。
根据处理器的架构语义,Spectre允许从永远不应该发生的计算中泄露信息。这将使内存中的数据处于危险之中,甚至是当前不参与计算、之前被认为是安全的且不受侧通道攻击的“静止”数据。
为了澄清这一观点,研究人员定义了一个形式化的微架构侧通道模型,用于定义处理器架构状态(即程序可见的处理器视图)与其微状态(即暴露于编程语言抽象之下的 CPU 内部状态)之间的关联。这种关联显示了有多少正确的微状态可以映射到单个架构状态。
当一个 CPU 使用缓存或分支预测时,与一个给定操作相关联的时间将取决于 CPU 微观状态,例如,缓存中的数据可能已经可用或需要从内存中获取,但所有可能的微状态对应于相同的架构状态,例如使用少量的信息。此外,研究人员定义了一种技术来放大时间差异,使其易于检测,这成为构建通用“读取小部件”的基础,一种“界外内存读取器”,可以访问所有可寻址内存。
根据研究人员的说法,这种通用的读取小部件可能是为任意编程语言而构建的——即使它不一定是一项简单的任务——利用了大量的语言结构或特性,这些结构或特性在使用它们的模型时已经被证明是易受攻击的。包括带有动态边界检查的索引数据结构、可变参数、调度循环、调用栈、switch 语句,等等。
综上所述,社区现在面临三大挑战:发现微架构侧通道、了解程序如何操纵微状态,以及如何缓解这些漏洞。
缓解漏洞可能是所有问题中最具挑战性的,因为现有硬件所需的有效软件缓解措施似乎还处于起步阶段,而未来设计所需的硬件缓解措施是一个完全开放的设计问题。
虽然这篇论文并不能让人完全放心,但它提供了相当密集的资料,提供了很多有关我们的思维计算模型如何与 CPU 实际计算发生偏差的见解。
查看英文原文:https://www.infoq.com/news/2019/02/spectre-will-haunt-us-for-years
评论