通过上文, 我们已经对 TDX 有了基本的了解,本文将继续介绍它是如何进行架构设计,实现机密计算的。如有理解有误的地方,欢迎交流指正。
机密计算 (Confidential Computing) : 一种在基于硬件的可信执行环境 (TEE, Trusted Execution Environment) 中执行计算过程,为使用中的数据提供保护的计算模式。
对于 TEE,它必须具有一定级别的数据完整性、数据机密性和代码完整性。所谓机密性和完整性,其实就是能否从"增删改查" 四个方面保护敏感内容。
- 数据机密性:未经授权的实体无法查看在 TEE 内使用中的数据。(查)
- 数据完整性:未经授权的实体不能添加、删除或更改在 TEE 中使用的数据。(增删改)
- 代码完整性:未经授权的实体不能添加、删除或更改 TEE 中执行的代码。(增删改)
TDX 作为一种基于硬件的虚拟机隔离技术,通过创建的 TD 实现可信执行环境 (TEE),能够为整个 VM 提供保护和隔离。接下来介绍其如何实现机密性和完整性。
1 . 内存机密性和完整性
(Memory Confidentiality and Integrity)
1.1 TME-MK 生成密钥
TDX 使用 TME-MK 生成密钥进行内存加密,并新增了内存完整性保护 (Memory integrity protection) 。内存完整性保护有 Ci 和 Li 两种。
- 加密完整性保护 (cryptographic-integrity protection),简称 Ci : 可防止 host/system software 对敏感数据的访问,并检测来自软件的篡改。
- 软件的篡改,例如 rowhammer, 这是一种利用 DRAM 中电荷积累效应的攻击方式。它通过特殊的程序反复访问 DRAM 中的相邻行,来对特定行的数据进行访问或修改。
- 这种模式下,内存使用 MAC 和 TD owner bit 进行加密和保护。 (每个 cache line 中有 1 bit 是 TD-ownership 标签,表示该行是否与分配给 TD 的内存页相关联。)
- 逻辑完整性 (logical-integrity protection), 简称 Li : 仅可防止 host/system software 对敏感数据的访问。
- 这种模式下,内存使用 TD owner bit 进行加密和保护。
每个 TME-MK 提供的密钥 (key) 都有一个对应的 KeyID 。通过 PCONFIG 指令,TDX module 可以为 KeyID 提供一个 CPU 生成的,唯一且临时的 AES-XTS 128-bit 密钥。而且该密钥经过定制,不能通过软件或使用 SOC 的外部接口访问。
1.2 基于 KeyID 的访问控制
如下图所示,TME-MK 支持的 KeyID 分为两组:Private KeyID 和 Shared KeyID。内存也分为私有内存 (private memory) 和共享内存 (shared memory)。
创建 TD 时,TDX module 会通过 PCONFIG 为每个 TD 分配一个唯一的私有密钥。而且只允许从 SEAM 调用 (即从 TDX module 调用) PCONFIG 为 private KeyID 编码密钥。
除了 TDX module 和 TD,其他软件都禁止访问 private KeyID,否则会产生 #PF
(page-fault exception); 任何设备使用 private KeyID 的进行 DMA 操作同样也会被中止。
1.3 Private KeyID 加密的内存
不受信任的实体访问加密的内存可能会触发两种错误:
-
TD-ownership check failure: 当软件或设备去访问被 private KeyID 加密的内存时,会通过 cache line 中的 TD-ownership bit 判断该访问是否使用了 shared KeyID。如果使用 shared KeyID 进行访问,则被认为是无效访问, 此时 TME-MK 会返回固定的数据,避免密文解析。(Ci/Li)
-
MAC-verification failure: 当 Ci 开启时,MAC 会确保 TD 读回的 private memory 中的数据和上次写入内容一致。如果发现内容遭受了篡改,则会发生 MAC 验证失败。
无论 MAC-verification failure 或者 TD-ownership check failure 都会导致该 TD 被终止,而其他 TD 和平台上的软件都不会受到影响。
如下图所示,当不受信任的软件 (使用 private KeyID 的软件) 读取 MKTME 保护的内存时,读操作只会获取固定的值,写操作也会被终止。
当 TD 读取被保护的内存数据时,如果 MAC 校验成功,则会顺利读取;若保护的内存中数据被篡改,将导致 MAC 校验失败,从而访问失败。
2. 地址转换完整性
(Address-Translation Integrity)
2.1 两种内存
TD 可以访问两类内存。
- 私有内存 (private memory)。持有 TD 机密数据,使用前面提到的分配给 TD 的独一无二的临时密钥实现机密性和完整性保护的。
- 共享内存 (shared memory) 。用于 TD 和外部不受信任实体进行通信,以执行各种 IO 操作,比如网络访问,存储服务,调用 hypervisor 的服务等。
2.2 Shared bit
GPA (guest-physical address) 的最高位被设计为共享位 ("Shared" bit),用于表示该地址指向的是私有内存 ("Shared" bit is 0) 还是共享内存 ("Shared" bit is 1)。(这和 AMD 的 SEV-SNP 刚好相反)
TD 的所有私有代码和数据都是存放在私有内存中,并映射到 Shared bit 为 0 的 GPA (private GPA)。所有使用私有 GPA 的内存访问,都会通过分配给 TD 的 private key 实现加密,并进行完整性保护。 而对于使用共享 GPA 的内存访问,则借助 hypervisor 管理的 shared key,实现加密,并进行完整性保护。
2.3 两种 EPT
地址转换方面,TDX 架构提供了两种 EPT (extended-page table) 创建物理地址 (PA, physical address) 和 GPA 的映射关系。
- secure EPT,提供 private GPA 到 PA 的地址转换。该 EPT 由 TDX module 管理,保证内存布局的完整性。并由 module 提供接口给 VMM,用于增加或删除地址映射。构建 secure EPT 页表的内存也会使用每个 TD 唯一的密钥进行加密和完整性保护。
- shared EPT, 提供 shared GPA 到 PA 的地址转换。该 EPT 由 VMM 管理。
2.4 地址转换过程
如下图。无论是 shared memory 还是 private memory,首先都是由 VMM 分配内存,在随后生成 GPA 时会有不同。 对于 shared memory, 由 VMM 管理 shared EPT,使用 shared KeyID 和 PA 生成对应的 shared GPA。 对于 private memory, VMM 调用 TDX module 提供的接口,将 PA 传入。TDX module 使用 private KeyID 和 PA,通过 secure EPT 生成对应的 private GPA。
由于 CPU 会防止 TD 的页表结构和可执行代码存放到 shared memory 中,而且如果在 shared memory 中获取下一条 TD 的执行指令 (code fetches) 或者访问 TD 的页表时,CPU 会发生 #PF
(page fault)。 所以,即使 private memory 对应的 PA 对于 VMM 来说是已知的,它也无法访问这块数据,因为会触发 #PF
。
另外,TDX module 中还维护了一张表,称为 PAMT (Physical-Address-Metadata Table)。其中记录用到的 page size 和 page type 信息以协助 TD 的地址转换。
在性能方面,TD 的地址转换和传统 VM 类似,都是有两级 page walk, 因此它们的地址转换开销也类似。
3. CPU 状态机密性和完整性
(CPU-State Confidentiality and Integrity)
CPU state 有关的结构有:
- virtual apic page
- state save area
- secure EPT
- VMCS
它们都是托管在 VMM 提供的一组 page 中。TDX module 同样会使用分配给 TD 的 private key 加密起来。
每个 TD 都会有一组自己的 CPU 状态信息。当 TD 退出到 TDX module 时,这些状态信息会更新到 TDX module 中。但 TDX module 继续退出到 host 时, 提供给 VMM 的 CPU state 只会是一些固定的值,VMM 并不能拿到真实的 CPU state。
如果 TD 需要 VMM 完成一些功能,它可以根据 GHCI (TDX Guest-Hypervisor Communication Interface) 定义的规范,通过 TDCALL
指定哪些寄存器的内容可以暴露给 host,这时 TDX module 就不会在返回 host 时把指定的状态信息切换为固定值。
4. 安全的中断和异常发送机制
(Secure Interrupt and Exception Delivery)
TD 的中断和异常,采用的 VMX 中已有的中断虚拟化技术: VMX-APIC virtualization 和 virtual-interrupts architecture。
借助 APIC-virtualization architecture,TD 可以直接在 SEAM-VMX non-root mode 下读写 APIC 的各类寄存器, 发送 virtual interrupt,而不会触发 vm-exit。
借助 VMX-posted-interrupts-processing architecture,VMM 或者其他设备可以通过 posted-interrupt descriptor 直接向 TD 发送 virtual interrupt。
至于 TD 对中断的具体实现过程,考虑到篇幅原因,后面有时间再具体介绍。
Related
本文作者:文七安
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!