跳转到主要内容

1.8 安全性

操作系统以及其他具有特权访问能力的系统软件,例如虚拟机,存在大量软件漏洞,它们一直是攻击者入侵计算机系统的主要途径。然而,2015 年,Google 展示了一种用户程序:它利用 DDR3 DRAM 芯片中的弱点,能够突破虚拟内存保护(Seaborn, 2015)。由于 DRAM 内部采用二维结构,而 DDR3 DRAM 的存储单元又非常小,研究人员发现,反复写入 DDR3 DRAM 的某一行,对它进行“锤击”,可能会在相邻行引发扰动错误,使受害行中的比特翻转。后续工作表明,同时攻击附近的两行,效果更强。

**Row hammer(行锤)**攻击针对的是物理内存,因此,破坏某些数据远比精确击中虚拟内存中的特定目标容易。锤击的确切结果无法预测,但多次尝试可能导致灾难性后果。攻击者可以巧妙地利用 row hammer 改变页表项中的保护位,从而让程序获得对操作系统原本试图保护的内存区域的访问权限。后来的微处理器和 DRAM 加入了检测 row hammer 攻击的机制,以阻止这类攻击。第 2 章将讨论在 DRAM 和操作系统两个层面防范定向 row hammer 攻击的技术。

这一攻击震惊了许多安全研究人员;在此之前,他们认为硬件不会受到安全问题的影响。虽然可以说 row hammer 本质上是可信赖性问题,因为内存中保存了错误的信息,但它只是一个新攻击方向的开端:攻击者开始把硬件弱点作为目标。

至少从 20 世纪 70 年代起,人们就已经知道**时序通道(timing channel)**是一种安全弱点,但大多数体系结构设计者错误地认为,它在实践中无关紧要。早期攻击要么利用操作系统缺陷,要么要求攻击者能够实际接触目标设备,要么只能以极低的带宽泄漏信息。然而,时序这样的实现属性,同样可能影响功能行为。

2018 年曝光的 Spectre 鲜明地展示了这一问题:它利用微体系结构中的推测执行,从用户级沙箱、内核或 hypervisor 中泄漏私密信息,让用户态攻击代码获得这些信息(Kocher, 2019)。

Spectre 利用了三种微体系结构技术:

  1. 指令推测执行。 处理器核心试图越过分支进行推测,以并发执行数十条指令。推测正确时,就提交对 ISA 可见状态的修改;推测错误时,则撤销这些修改。Spectre 反其道而行:它故意让处理器推测执行一些指令,即使知道这些指令对 ISA 可见状态的修改最终会被撤销。其隐蔽目的,是在微体系结构中留下“面包屑”般的线索,暴露程序员原以为隐藏起来的秘密。
  2. 缓存。 缓存对 ISA 不可见。特别是,按照传统的计算机体系结构认识,组相联缓存中哪个块是最近最少使用的,并不影响程序正确执行,因此,发生错误推测时不必恢复这一状态。Spectre 利用这一出人意料的弱点,留下并随后寻找能够泄漏秘密的“面包屑”。它由此把缓存内容用作传递秘密数据值的“侧信道(side channel)”。
  3. 硬件多线程。 如果攻击程序能与目标程序紧邻运行,就更容易察觉这种细微的时序变化。在硬件多线程中,一个程序的指令可以与其他程序的指令交错执行,见第 3 章;这使攻击更容易实现。硬件攻击令人担忧,以至于云服务商如今提供了选项,让用户的服务器不与其他客户的程序共享。例如,AWS 提供 Dedicated Instances,价格比传统共享实例高约 5%。

自 Spectre 公布以来,许多其他攻击又陆续出现,利用了类似的微体系结构弱点。

第 2 章和第 3 章将更深入地讨论安全性,说明如何通过针对存储层次结构和处理器的时序攻击泄漏信息。

介绍了安全性,并对计算机技术的成本、功耗和可信赖性进行了量化之后,我们已经可以进一步量化性能。