英语

Linux 中用于 x86 虚拟化的机密计算

作者:Elena Reshetova <elena.reshetova@intel.com> 和 Carlos Bilbao <carlos.bilbao.osdev@gmail.com>

动机

在 x86 虚拟化环境中进行机密计算的内核开发人员,在 Linux 内核威胁模型方面所依据的假设与传统观点不同。 从历史上看,Linux 威胁模型承认位于用户空间的攻击者,以及可以通过各种网络或有限的 HW 特定暴露接口(USB、thunderbolt)与内核交互的有限的外部攻击者集合。 本文档的目标是解释在机密计算领域中出现的其他攻击向量,并讨论 Linux 内核的拟议保护机制。

概述和术语

机密计算 (CoCo) 是一个广泛的术语,涵盖了旨在保护使用中数据(相对于静态数据或传输中的数据)的机密性和完整性的各种安全技术。 其核心是,CoCo 解决方案提供了一个可信执行环境 (TEE),可以在其中执行安全数据处理,因此,它们通常根据计划在 TEE 中运行的 SW 进一步分类为不同的子类型。 本文档重点关注 CoCo 技术的一个子类,该子类面向虚拟化环境,并允许在 TEE 中运行虚拟机 (VM)。 从现在开始,本文档将把 CoCo 的这个子类称为“用于虚拟化环境 (VE) 的机密计算 (CoCo)”。

在虚拟化上下文中,CoCo 指的是一组 HW 和/或 SW 技术,这些技术可以为在 CoCo VM 中运行的 SW 提供更强的安全保证。 也就是说,机密计算允许其用户确认所有 SW 片段的可信度,以包含在其缩减的可信计算基础 (TCB) 中,因为它能够证明这些可信组件的状态。

虽然具体实现细节因技术而异,但所有可用机制都旨在提高 VM 的客户机内存和执行状态(vCPU 寄存器)的机密性和完整性,更严格地控制客户机中断注入,以及一些额外的机制来控制客户机-主机页面映射。 有关特定于 x86 的解决方案的更多详细信息,请参见 英特尔信任域扩展 (TDX)AMD 内存加密

基本的 CoCo 客户机布局包括主机、客户机、用于客户机和主机通信的接口、能够支持 CoCo VM 的平台以及客户机 VM 和底层平台之间的充当安全管理器的可信中介。 主机端虚拟机监视器 (VMM) 通常由传统 VMM 功能的一个子集组成,并且仍然负责客户机的生命周期,即创建或销毁 CoCo VM、管理其对系统资源的访问等。 但是,由于它通常不属于 CoCo VM TCB,因此其访问受到限制以保护安全目标。

在下图中,“<--->”行表示 CoCo 安全管理器和其余组件(客户机、主机、硬件的数据流)之间的双向通信通道或接口

+-------------------+      +-----------------------+
| CoCo guest VM     |<---->|                       |
+-------------------+      |                       |
  | Interfaces |           | CoCo security manager |
+-------------------+      |                       |
| Host VMM          |<---->|                       |
+-------------------+      |                       |
                           |                       |
+--------------------+     |                       |
| CoCo platform      |<--->|                       |
+--------------------+     +-----------------------+

CoCo 安全管理器的具体细节在各种技术之间差异很大。 例如,在某些情况下,它将在 HW 中实现,而在另一些情况下,它可能是纯 SW。

现有 Linux 内核威胁模型

当前 Linux 内核威胁模型的总体组件是

+-----------------------+      +-------------------+
|                       |<---->| Userspace         |
|                       |      +-------------------+
|   External attack     |         | Interfaces |
|       vectors         |      +-------------------+
|                       |<---->| Linux Kernel      |
|                       |      +-------------------+
+-----------------------+      +-------------------+
                               | Bootloader/BIOS   |
                               +-------------------+
                               +-------------------+
                               | HW platform       |
                               +-------------------+

在引导过程中,引导加载程序和内核之间也存在通信,但此图未明确表示。 “接口”框表示允许内核和用户空间之间通信的各种接口。 这包括系统调用、内核 API、设备驱动程序等。

现有的 Linux 内核威胁模型通常假设在可信 HW 平台上执行,并且所有固件和引导加载程序都包含在其 TCB 中。 主要攻击者位于用户空间中,并且来自那里的所有数据通常被认为是不受信任的,除非用户空间具有足够的特权来执行可信操作。 此外,通常会考虑外部攻击者,包括那些有权访问已启用的外部网络(例如,以太网、无线、蓝牙)、暴露的硬件接口(例如,USB、Thunderbolt)以及离线修改磁盘内容的能力的攻击者。

关于外部攻击向量,有趣的是要注意,在大多数情况下,外部攻击者会首先尝试利用用户空间中的漏洞,但是攻击者有可能直接针对内核; 特别是如果主机具有物理访问权限。 直接内核攻击的示例包括漏洞 CVE-2019-19524、CVE-2022-0435 和 CVE-2020-24490。

机密计算威胁模型及其安全目标

机密计算在上述列表中添加了一种新型攻击者:潜在的恶意主机(也可以包括传统 VMM 的一部分或全部),由于其较大的 SW 攻击面,通常位于 CoCo VM TCB 之外。 重要的是要注意,这并不意味着主机或 VMM 是故意恶意的,而是存在具有较小 CoCo VM TCB 的安全价值。 这种新型对手可以被视为更强大的外部攻击者类型,因为它位于同一物理机上(与远程网络攻击者相反),并且可以控制客户机内核与大多数 HW 的通信

                              +------------------------+
                              |    CoCo guest VM       |
+-----------------------+     |  +-------------------+ |
|                       |<--->|  | Userspace         | |
|                       |     |  +-------------------+ |
|   External attack     |     |     | Interfaces |     |
|       vectors         |     |  +-------------------+ |
|                       |<--->|  | Linux Kernel      | |
|                       |     |  +-------------------+ |
+-----------------------+     |  +-------------------+ |
                              |  | Bootloader/BIOS   | |
+-----------------------+     |  +-------------------+ |
|                       |<--->+------------------------+
|                       |          | Interfaces |
|                       |     +------------------------+
|     CoCo security     |<--->| Host/Host-side VMM |
|      manager          |     +------------------------+
|                       |     +------------------------+
|                       |<--->|   CoCo platform        |
+-----------------------+     +------------------------+

虽然传统上主机具有对客户机数据的无限访问权限,并且可以利用此访问权限来攻击客户机,但 CoCo 系统通过添加安全功能(如客户机数据机密性和完整性保护)来缓解此类攻击。 此威胁模型假设这些功能可用且完好无损。

Linux 内核 CoCo VM 安全目标可以概括如下

1. 维护 CoCo 客户机的私有内存和寄存器的机密性和完整性。

2. 防止主机特权升级到 CoCo 客户机 Linux 内核中。 虽然主机(和主机端 VMM)确实需要一定级别的特权才能创建、销毁或暂停客户机,但防止特权升级的部分目标是确保这些操作不会为攻击者提供访问客户机内核的途径。

上述安全目标导致两个主要的 Linux 内核 CoCo VM 资产

  1. 客户机内核执行上下文。

  2. 客户机内核私有内存。

主机保留对 CoCo 客户机资源的完全控制权,并且可以随时拒绝访问这些资源。 资源的示例包括 CPU 时间、客户机可以消耗的内存、网络带宽等。 因此,主机对 CoCo 客户机的拒绝服务 (DoS) 攻击超出了此威胁模型的范围。

Linux CoCo VM 攻击面是从 CoCo 客户机 Linux 内核暴露给不受信任的主机且 CoCo 技术 SW/HW 保护未覆盖的任何接口。 这包括任何可能的旁路通道以及瞬态执行旁路通道。 显式(非旁路通道)接口的示例包括对端口 I/O、MMIO 和 DMA 接口的访问、对 PCI 配置空间的访问、特定于 VMM 的超级调用(对主机端 VMM)、对共享内存页面的访问、允许主机注入到客户机内核中的中断以及 CoCo 技术特定的超级调用(如果存在)。 此外,CoCo 系统中的主机通常控制创建 CoCo 客户机的过程:它有一种方法可以将固件和引导加载程序映像、内核映像以及内核命令行加载到客户机中。 在通过证明建立其完整性和真实性之前,所有这些数据也应被视为不受信任。

下表显示了 CoCo 客户机 Linux 内核的威胁矩阵,但未讨论潜在的缓解策略。 该矩阵是指客户机、主机和平台的 CoCo 特定版本。

CoCo Linux 客户机内核威胁矩阵

威胁名称

威胁描述

客户机恶意配置

恶意主机修改以下客户机配置之一

  1. 客户机固件或引导加载程序

  2. 客户机内核或模块二进制文件

  3. 客户机命令行参数

这允许主机破坏在 CoCo 客户机内运行的代码的完整性,并违反 CoCo 安全目标。

CoCo 客户机数据攻击

恶意主机保留对在客户机和主机管理的物理或虚拟设备之间传输的 CoCo 客户机数据的完全控制。 这允许针对此类数据的机密性、完整性或新鲜度的任何攻击。

格式错误的运行时输入

恶意主机通过客户机内核代码使用的任何通信接口注入格式错误的输入。 如果代码未准备好正确处理此输入,则这可能会导致主机 --> 客户机内核特权升级。 这包括传统的旁路通道和/或瞬态执行攻击向量。

恶意运行时输入

恶意主机通过客户机内核代码使用的任何通信接口注入特定的输入值。 与先前的攻击向量(格式错误的运行时输入)的区别在于,此输入没有格式错误,但其值经过精心设计以影响客户机内核安全。 此类输入的示例包括向客户机提供恶意时间或向客户机随机数生成器提供熵。 此外,如果此类事件导致特定的客户机内核操作(即,处理主机注入的中断),则此类事件的计时本身可能就是一个攻击向量。 防范提供的主机输入。