# 1.8 安全性
<!-- source: p0063 -->

操作系统以及其他具有特权访问能力的系统软件，例如虚拟机，存在大量软件漏洞，它们一直是攻击者入侵计算机系统的主要途径。然而，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）。

<!-- source: p0064 -->

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

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

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

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

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