初识 TDX (2)

通过上文, 我们已经对 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 中的相邻行,来对特定行的数据进行访问或修改。
    • 这种模式下,内存使用 MACTD 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

机密计算技术分析

本文作者:文七安

本文链接:juejin.cn/post/730821...

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关推荐
newxtc1 小时前
【支付行业-支付系统架构及总结】
安全·支付宝·第三方支付·风控系统·财付通
newxtc2 小时前
【旷视科技-注册/登录安全分析报告】
人工智能·科技·安全·ddddocr
成都古河云2 小时前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市
Gworg2 小时前
您与此网站之间建立的连接不安全解决方法
安全
ac-er88883 小时前
MySQL如何实现PHP输入安全
mysql·安全·php
jjyangyou6 小时前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
AltmanChan6 小时前
大语言模型安全威胁
人工智能·安全·语言模型
马船长7 小时前
红帆OA iorepsavexml.aspx文件上传漏洞
安全
hikktn14 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
23zhgjx-NanKon16 小时前
华为eNSP:QinQ
网络·安全·华为