x86 虚拟化中 Linux 的机密计算

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

动机

在 x86 虚拟化环境中从事机密计算的内核开发人员在 Linux 内核威胁模型方面存在一系列假设,这些假设与传统的观点不同。历史上,Linux 威胁模型承认存在于用户空间的攻击者,以及能够通过各种网络或有限的特定硬件暴露接口(USB、Thunderbolt)与内核交互的有限的外部攻击者。本文档的目标是解释在机密计算领域出现的新增攻击向量,并讨论 Linux 内核的拟议保护机制。

概述和术语

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

在虚拟化上下文中,CoCo 指的是一组硬件和/或软件技术,这些技术可以为在 CoCo VM 中运行的软件提供更强的安全保证。也就是说,机密计算允许其用户确认包含在其缩减的可信计算基础 (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 安全管理器的具体细节因技术而异。例如,在某些情况下,它将在硬件中实现,而在其他情况下,它可能是纯软件。

现有的 Linux 内核威胁模型

当前 Linux 内核威胁模型的总体组成部分是

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

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

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

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

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

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

                              +------------------------+
                              |    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 技术软件/硬件保护覆盖的任何接口。这包括任何可能的侧通道以及瞬态执行侧通道。显式(非侧通道)接口的示例包括对端口 I/O、MMIO 和 DMA 接口的访问、对 PCI 配置空间的访问、特定于 VMM 的管理程序调用(针对主机侧 VMM)、对共享内存页面的访问、允许主机将中断注入到客体内核中,以及特定于 CoCo 技术的管理程序调用(如果存在)。此外,CoCo 系统中的主机通常会控制创建 CoCo 客体的过程:它有一种方法将固件和引导加载程序镜像、内核镜像以及内核命令行加载到客体中。在通过证明建立其完整性和真实性之前,所有这些数据也应被视为不受信任的数据。

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

CoCo Linux 客体内核威胁矩阵

威胁名称

威胁描述

客体恶意配置

行为不当的主机修改以下客体的配置之一

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

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

  3. 客体命令行参数

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

CoCo 客体数据攻击

行为不当的主机保留对客体和主机管理的物理或虚拟设备之间传输的 CoCo 客体数据的完全控制权。这允许对这些数据的机密性、完整性或新鲜度进行任何攻击。

格式错误的运行时输入

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

恶意运行时输入

一个行为不端的宿主机通过访客内核代码使用的任何通信接口注入特定的输入值。与之前的攻击向量(格式错误的运行时输入)不同,此输入格式正确,但其值经过精心设计,会影响访客内核的安全性。此类输入的示例包括向访客提供恶意时间或向访客随机数生成器提供熵。此外,如果此类事件导致特定的访客内核操作(即处理宿主机注入的中断),则此类事件的时序本身也可能成为攻击向量。抵抗提供的宿主机输入。