18. AMD 内存加密¶
安全内存加密 (SME) 和安全加密虚拟化 (SEV) 是 AMD 处理器上提供的功能。
SME 提供了使用标准 x86 页表将内存的各个页面标记为加密的功能。标记为加密的页面在从 DRAM 读取时会自动解密,在写入 DRAM 时会自动加密。因此,SME 可以用来保护 DRAM 的内容,使其免受对系统的物理攻击。
SEV 允许运行加密的虚拟机 (VM),其中访客虚拟机的代码和数据是安全的,只有在虚拟机本身内部才能获得解密版本。SEV 访客虚拟机具有私有和共享内存的概念。私有内存使用访客特定的密钥加密,而共享内存可以使用虚拟机监控程序密钥加密。启用 SME 后,虚拟机监控程序密钥与 SME 中使用的密钥相同。
当页表条目设置了加密位时(请参阅下文关于如何确定其位置的信息),该页面将被加密。加密位也可以在 cr3 寄存器中指定,允许加密 PGD 表。通过在指向下一个表的页表条目中设置加密位,也可以加密每个连续级别的页表。这允许加密完整的页表层次结构。请注意,这表示仅仅因为在 cr3 中设置了加密位,并不意味着完整层次结构已加密。层次结构中的每个页表条目都需要设置加密位才能实现这一点。因此,理论上,您可以设置 cr3 中的加密位以加密 PGD,但不在 PGD 条目中为 PUD 设置加密位,这将导致该条目指向的 PUD 不被加密。
启用 SEV 后,指令页面和访客页表始终被视为私有。访客内部的所有 DMA 操作都必须在共享内存上执行。由于内存加密位由访客操作系统在 64 位或 32 位 PAE 模式下运行时控制,因此在所有其他模式下,SEV 硬件强制将内存加密位设置为 1。
可以通过 CPUID 指令确定对 SME 和 SEV 的支持。CPUID 函数 0x8000001f 报告与 SME 相关的信息
0x8000001f[eax]:
Bit[0] indicates support for SME
Bit[1] indicates support for SEV
0x8000001f[ebx]:
Bits[5:0] pagetable bit number used to activate memory
encryption
Bits[11:6] reduction in physical address space, in bits, when
memory encryption is enabled (this only affects
system physical addresses, not guest physical
addresses)
如果存在对 SME 的支持,可以使用 MSR 0xc00100010 (MSR_AMD64_SYSCFG) 来确定是否启用了 SME 和/或启用内存加密
0xc0010010:
Bit[23] 0 = memory encryption features are disabled
1 = memory encryption features are enabled
如果支持 SEV,可以使用 MSR 0xc0010131 (MSR_AMD64_SEV) 来确定 SEV 是否处于活动状态
0xc0010131:
Bit[0] 0 = memory encryption is not active
1 = memory encryption is active
如果 BIOS 确定启用内存加密后物理地址空间的减少(请参阅上面的 CPUID 信息)不会与系统的地址空间资源要求冲突,则 Linux 依赖 BIOS 设置此位。如果在 Linux 启动时未设置此位,则 Linux 本身不会设置它,并且内存加密将不可能。
Linux 内核中 SME 的状态可以记录如下
支持:CPU 支持 SME(通过 CPUID 指令确定)。
已启用:支持,并且设置了 MSR_AMD64_SYSCFG 的第 23 位。
活动:支持、已启用,并且 Linux 内核正在主动将加密位应用于页表条目(内核中的 SME 掩码为非零)。
SME 也可以在 BIOS 中启用和激活。如果在 BIOS 中启用并激活了 SME,则所有内存访问都将被加密,并且无需激活 Linux 内存加密支持。
如果 BIOS 仅启用 SME(设置 MSR_AMD64_SYSCFG 的第 23 位),则可以通过在内核命令行上提供 mem_encrypt=on 来启用内存加密。但是,如果 BIOS 未启用 SME,则 Linux 将无法激活内存加密,即使默认配置为这样做或指定了 mem_encrypt=on 命令行参数。
18.1. 安全嵌套分页 (SNP)¶
SEV-SNP 引入了新的特性 (SEV_FEATURES[1:63]),虚拟机监控程序可以启用这些特性以增强安全性。其中一些特性需要访客端实现才能正常工作。下表列出了访客/虚拟机监控程序 SNP 特性支持的各种可能情况下,预期的访客行为。
虚拟机监控程序启用的特性 |
访客需要实现 |
访客有实现 |
访客引导行为 |
---|---|---|---|
否 |
否 |
否 |
引导 |
否 |
是 |
否 |
引导 |
否 |
是 |
是 |
引导 |
是 |
否 |
否 |
启用特性引导 |
是 |
是 |
否 |
平稳引导失败 |
是 |
是 |
是 |
启用特性引导 |
更多详细信息请参阅 AMD64 APM[1] Vol 2: 15.34.10 SEV_STATUS MSR
18.2. 安全虚拟机服务模块 (SVSM)¶
SNP 提供了一种称为虚拟机特权级别 (VMPL) 的特性,该特性定义了访客软件可以运行的四个特权级别。最高特权级别为 0,数值较高的级别具有较低的特权。更多详细信息请参阅 AMD64 APM Vol 2,“15.35.7 虚拟机特权级别”部分,文档 ID:24593。
使用该特性时,不同的服务可以在不同的保护级别运行,除了访客操作系统之外,但仍在安全的 SNP 环境中。它们可以为访客提供服务,例如 vTPM。
当访客不在 VMPL0 级别运行时,它需要与在 VMPL0 级别运行的软件通信,以执行特权操作或与安全服务交互。例如,一个特权操作是 PVALIDATE,它必须在 VMPL0 级别执行。
在这种情况下,在 VMPL0 级别运行的软件通常称为安全虚拟机服务模块 (SVSM)。SVSM 的发现以及用于与其通信的 API 在“SEV-SNP 访客的安全虚拟机服务模块”中记录,文档 ID:58019。
(可以通过使用像 duckduckgo.com 这样的搜索引擎并键入
site:amd.com "SEV-SNP 访客的安全虚拟机服务模块",文档 ID:58019
例如)找到上述文档的最新版本。)