Linux对机密计算的支持

Linux阅码场 2023-06-26 08:01
Linux对机密计算的支持
Author: Wenhui Zhang, Yibo Zhou, Yuan Zhu, Guixiong Wei, Zhe Li, Chenyu Jiang, Sam Han,Yizheng Jiao, Hou Yu, Zefan Li, Wei Xu,
Reviewer: Jiaxin Shan, Wilson Wang, Baron, Jian Zhang
在大模型时代,模型即服务(Model as a Service)可以发挥重要的作用。模型即服务提供了一种将这些大模型部署在云端,并提供多个实体共同训练模型的合作模式。共同训练的多个实体需要共享数据并合作。 对于互不信任的实体共享数据进行合作的场景(例如,基于法律原因数据必须留在特定司法管辖区内),机密计算可以提供数据隐私和合规的保护。例如,通过在CPU TEE中运行聚合分析运算,可以降低对聚合分析机器的信任。类似地,通过在机密虚拟机TVM (trustedvirtual machine)中运行每个参与者的本地训练,可以降低对参与者的信任,并确保计算的完整性和数据的私密性。通过确保每个参与者对其训练数据的隐私数据过程不泄漏的承诺,TEE可以提高透明度和问责制,并起到防范数据和模型污染以及数据偏见等攻击的作用。基于TEE的机密计算正逐渐成为负责人人工智能的重要工具。Linux kernel对TEE的支持是TEE生态系统中的重要基石。本文讲详细解释Linux是如何实现和支持机密计算的。
本文结构如下,我们会先讲解机密计算的背景,概述TDX依赖的硬件技术,最后详细描述TDXModule的软件实现原理和TDX的hypervisor实现。
1. 机密计算的背景
机密计算 (Confidential Computing)是一种在计算机处理器的受保护区域中处理数据的方法,通常在远程边缘云或公共云服务器内部进行,并且可以证明没有任何人查看或修改了该数据。2015年的一篇论文 Verifiable Confidential Cloud Computing 使用新的安全防护扩展(Intel SGX)在x86CPU上展示了如何运算进行时的安全。该论文将其方法称为VC3,代表可验证的机密云计算(Confidential Cloud Computing),而这个名称从此被广泛采纳。
  机密计算建立在一种称为"root of trust"的基础上,该基础基于每个处理器的独特安全密钥。处理器通过所谓的安全测量引导检查是否具有正确的固件以开始运行。该过程生成参考数据,验证芯片处于已知的安全状态以开始工作。处理器建立了一个安全隔离区域或可信执行环境(TEE),与系统的其余部分隔离开来,在其中运行用户的应用程序。该应用程序将加密数据带入TEE,解密数据,运行用户的程序,加密结果并发送出去。在任何时候,机器所有者都不能查看用户的代码或数据。TEE向用户证明没有人能够篡改数据或软件。2018 年,Open Enclave SDK发布,OpenEnclave SDK (https://openenclave.io/sdk/)致力于支持一个API集,使开发人员可以一次构建并在多个技术平台上进行部署,包括云端、混合环境和边缘计算,并且适用于Linux和Windows操作系统。
谷歌,阿里,微软,亚马逊等多家云厂商都提供了机密计算的服务。比如Azure提供了一个丰富的机密计算平台,包括不同类型的机密计算硬件(如Intel SGX,AMD SEV-SNP),核心机密计算服务(如Azure Attestation和Azure Key Vault托管HSM),以及应用级服务,如Azure SQL AlwaysEncrypted、Azure机密分类账本和Azure上的机密容器。Linux 支持多种CPU架构上的机密计算, 比如Intel Icelake 和 Intel Skylake 上的SGX,AMD 上的SEV 和 SEV-SNP,Intel SPR上的TDX等。其中Intel Trust Domain Extensions (TDX)是第四代英特尔至强可扩展处理器中支持机密计算的新架构扩展。TDX允许在安全仲裁模式(SEAM)中部署虚拟机,具有加密的CPU状态和内存、完整性保护以及远程证明功能。TDX旨在为虚拟机强制执行硬件辅助隔离,并将暴露给主机平台的攻击面最小化。TDX是使用多种技术组合构建的,包括虚拟化技术(VT),多密钥总体内存加密(MKTME)和TDX模块, 此外,TDX还依赖于软件保护扩展(SGX)和数据中心认证原语(DCAP)进行远程认证。TDX实现了内存机密性,CPU状态机密性,执行完整性以及部分的I/O保护。
● 内存机密性:TD(Trust Domain)内部存储的数据以明文形式存储在处理器封装中。然而,当数据从处理器转移到主内存时,处理器使用仅对处理器可知的TD特定加密密钥对其进行加密。加密是以缓存行粒度进行的,使外设设备无法读取或篡改TD的私有内存而不被检测到。处理器能够检测到从主内存加载数据时可能发生的任何篡改。
● CPU状态机密性:TDX通过在安全域之间的所有上下文切换期间管理TD的虚拟CPU状态,保护免受同时执行的进程的影响。状态存储在TD的元数据中,使用TD的密钥在主内存中进行保护。在上下文切换期间,TDX从内部处理器寄存器和缓冲区(例如转换后备缓存(TLB)条目或分支预测缓冲区)中清除或隔离TD特定的状态,以保持TD信息的保护。
● 执行完整性:TDX保护TD的执行免受主机干扰,确保在中断后TD在预期指令和预期状态下恢复其计算。它能够检测虚拟CPU状态的恶意更改,以及位于私有内存中的指令的注入、修改或删除。然而,TDX对于控制流完整性不提供额外的保证。TD的所有者有责任使用现有的基于编译或硬件辅助的控制流完整性强制执行技术,如控制流强制执行技术(CET)。
● I/O保护:外设设备或加速器处于TD的信任边界之外,不应允许其访问TD的私有内存。为了支持虚拟化的I/O,TD可以选择显式共享内存进行数据传输。然而,TDX对于共享内存区域中的数据不提供任何机密性和完整性保护。TD的所有者有责任实施适当的机制,例如使用像传输层安全(TLS)这样的安全通信通道,以保护离开TD信任边界的数据。TDX2.0计划包括可信I/O虚拟化来解决这些问题。
2. TDX依赖的硬件技术
机密计算 Intel TDX确保TD(Trust Domain)的内存和虚拟CPU状态的机密性和完整性,确保它们不会被在同一台机器上执行的其他安全域访问或篡改。这是通过以下几种方式实现的:
(1)内存访问控制,
(2)运行时内存加密,以及
(3)由Intel签名的TDX模块处理安全敏感的TD管理操作。
如图所示,TDX依赖于一系列现有的英特尔技术,包括虚拟化技术(VT)、总体内存加密(TME)/多密钥总体内存加密(MKTME)和软件保护扩展(SGX)。下面,我们将对这些基础技术进行概述,并解释它们在TDX中的使用方式。
参考https://github.com/intel/tdx-tools/wiki/API-&-Specifications
2.1. 虚拟化技术(VT)
VT(Virtualization Technology)是TDX的基础。TDX是基于虚拟机的可信执行环境(TEE),它依赖于VT来实现TD之间的隔离。具有VT-x技术的处理器具有一组特殊的指令集,称为虚拟机扩展(VMX),它使虚拟化得以控制。具有VT-x技术的处理器可以运行在两种模式下:VMX根模式和VMX非根模式。虚拟机监控程序(hypervisor)在VMX根模式下运行,而虚拟机客户机(guest VM)在VMX非根模式下运行。VT-x定义了两个新的转换,即虚拟机进入(VM entry)和虚拟机退出(VMexit),用于在客户机和虚拟机监控程序之间进行切换。虚拟机控制结构(VMCS)是一种存储模式转换的虚拟机和宿主状态信息的数据结构。它还控制哪些客户机操作会导致虚拟机退出。IntelVT-x利用扩展页表(EPT)实现了第二级地址转换(SLAT)。每个客户机内核维护自己的页表,将客户机虚拟地址(GVA)转换为客户机物理地址(GPA)。虚拟机监控程序管理EPT,将GPA映射到主机物理地址(HPA)。Intel VT for Directed I/O(VT-d)使得可以对设备访问进行隔离和限制,以便管理设备的实体可以进行控制。它包括I/O设备分配、DMA重映射、中断重映射和中断发送。借助VT-d的支持,虚拟机可以通过虚拟到物理地址转换直接访问物理I/O内存,其中的IOMMU起到了帮助的作用。VT-d还提供了在虚拟机之间进行I/O设备分配的灵活性,并消除了虚拟机监控程序处理中断和DMA传输的需求。在新的威胁模型中,不再信任虚拟化管理程序(hypervisor),因此管理TD的功能已经封装在TDX模块中。TDX模块和TD在新的SEAM VMX根/非根模式下运行,并具有额外的保护措施。TDX仍然利用EPT(扩展页表)来管理GPA(Guest Physical Address)到HPA(Host PhysicalAddress)的转换。但目前,对于每个TD,它维护了两个EPT,一个用于私有(加密)内存,另一个用于共享(未加密)内存。
2.2. 总体内存加密(TME)/多密钥总体内存加密(MKTME)
TME使用单个临时密钥对整个计算机的内存进行加密。密钥在引导时通过硬件随机数生成器和集成到系统芯片组中的安全措施的组合生成。内存加密由每个内存控制器上的加密引擎执行。加密过程使用NIST标准的128位或256位密钥的AES-XTS算法。MKTME(Multi-key Total MemoryEncryption)扩展了TME,支持多个密钥和以页面粒度的内存加密。对于每个内存事务,MKTME根据主机密钥标识符(HKID)选择一个加密密钥来加密内存。HKID占据物理地址的顶部,可由BIOS在系统引导期间设置HKID的范围。MKTME允许使用软件提供的密钥,并引入了一个新的指令PCONFIG,用于编程与特定HKID相关联的密钥和加密模式。这些⟨HKID,密钥⟩对存储在每个MKTME加密引擎中的密钥加密表(KET)中。KET中的密钥从不离开处理器,也不会暴露给软件。在TDX中,MKTME模块负责控制TD的内存加密。HKID空间被划分为私有HKID和共享HKID。有HKID仅用于加密TD的私有内存。TDX模块仍然利用MKTME来保护TD的内存。
2.3. 软件保护扩展(SGX)
Intel SPR CPU是需要Intel SGX的辅助才能完成远程认证的。Intel SGX在ISA中添加了18条新指令,使开发人员能够对其应用程序进行分区,并保护选定的代码和数据在安全区域(enclaves)中。SGX使用基于硬件的内存加密来保护安全区域的内容。SGX 创建了新的设备(/dev/sgx)支持一些ioctl()调用。CPU的访问控制ioctl()禁止了外部的代码对内部区域的内存进行访问, 并在离开最后一级缓存之前对其进行加密。SGX固件使用PRMRR寄存器来保留一片被称为Enclave PageCache(EPC)的物理内存区域。处理器中有一个称为Memory Encryption Engine(MEE)或者Total Memory Encryption (TME) 的硬件单元。安全区域页面缓存(EPC)是一个特殊的内存区域,包含安全区域的代码和数据,其中每个页面使用内存加密引擎(MEE)进行加密。安全区域页面缓存映射(EPCM)存储页面的元数据,例如配置、权限和类型。在引导时,密钥被生成并用于解密CPU内部的加密页面的内容。这些密钥由MEE控制,并且从不暴露给外部。因此,只有这个特定的CPU才能解密内存。CPU将这些密钥内部存储,并阻止任何软件访问它们。此外,非安全区域中的特权软件不被允许读取或写入EPC或EPCM页面。禁止的几个API定义在了arch/x86/include/asm/sgx.h。使用SGX_IOCTL_ENCLAVE_CREATE 创建一个新的enclave,使用SGX_IOCTL_ENCLAVE_ADD_PAGE 向其中添加数据页。然后使用SGX_IOCTL_ENCLAVE_INIT 准备运行。最后一个操作需要传入一个包含enclave数据哈希和适当签名的初始化令牌。SGX没有办法在创建了enclave后删除它。特权级(ring-0)的ENCLS函数用于构建这些私有的代码和数据区域。非特权级(ring-3)的ENCLU函数允许应用程序进入并在这些私有的代码和数据区域内执行。Enclave只能通过一组固定的入口点进入。每个入口点一次只能容纳一个硬件线程。当使用ENCLS函数从常规二进制文件加载enclave时,只有enclave内部的线程可以访问其内存。支持SGX2的系统还支持对已初始化的enclave进行更改和删除页面。TDX利用了SGX提供的远程认证机制来进行远程认证。值得注意的是,Intel SPR CPU是需要Intel SGX的辅助才能完成远程认证的。但是对于后续的Intel CPU,并不一定会用到SGX。Intel SPR CPU的下一代是 Intel EMR CPU,再往后一代是Intel DMR CPU。Intel EMR 的TDX 还是需要启用SGX,并且每个socket需要预留128MB的内存用于SGX PRM。从Intel DMR之后,TDX的认证不依赖于SGX,而是基于S3M(Secure SoftwareStack Memory)。然而,TDX仍然需要为TDX模块预留内存,但这时每个插槽只需要32-48MB基于以上三种技术,Intel TDX 建立了TDX Module。
3. TDX Module的软件实现原理
下面,我们解释TDX的系统架构、内存保护机制、I/O模型、认证以及未来计划服务于大模型和AI的功能。
3.1. 系统架构
TDX模块提供了两组接口函数:面向启用了TDX的虚拟化监视程序的主机端接口函数和面向TD的客户端接口函数。TDX模块加载和执行在SEAM RANGE中,这是由UEFI/BIOS保留的系统内存部分。P-SEAM Loader也位于SEAM RANGE中,用于安装和更新TDX模块。安全仲裁模式(SEAM)是VMX架构的扩展,提供了两种新的执行模式:SEAM VMX根模式和SEAM VMX非根模式。启用了TDX的虚拟化监视程序在传统的VMX根模式下运行,并使用SEAMCALL指令调用TDX模块的主机端接口函数(函数名称以TDH开头)。执行SEAMCALL指令时,逻辑处理器从VMX根模式转换为SEAM VMX根模式,并开始执行TDX模块内的代码。一旦TDX模块完成任务,通过执行SEAMRET指令返回到虚拟化监视程序中的VMX根模式。另一方面,TD在SEAM VMX非根模式下运行。TD可以通过TD退出或调用TDCALL指令陷入TDX模块。在这两种情况下,逻辑处理器从SEAM VMX非根模式转换为SEAM VMX根模式,并在TDX模块的上下文中开始执行。处理TDCALL的客户端接口函数的名称以TDG开头。
3.2. 内存保护机制
TDX利用VMX的安全保密模式(SEAM)来强制执行TD的内存隔离。安全保密模式(SEAM)是虚拟机扩展(VMX)架构的扩展,定义了一个称为SEAM根的新的VMX根模式。SEAM根模式用于托管经过CPU验证的模块,使其能够创建作为来宾VM的可信域(TD)。与传统的虚拟机类似,TD无法访问其他安全域(如SMM、hypervisor、TDX模块和其他虚拟机/TD)的内存。使用VMX,hypervisor维护扩展页表(EPT)来实施内存隔离。然而,由于不再信任hypervisor,TDX将内存管理的任务转移到了TDX模块上,该模块控制TD私有内存的地址转换。TDX用共享来宾物理地址(GPA)用于帮助TD访问共享内存。安全扩展页表(secure EPT)用于翻译私有GPA,确保地址翻译的完整性,并防止从共享内存中获取TD代码。目前的目标是使用TD专用密钥对私有内存访问进行加密和保护,提升安全性。物理地址元数据表(PAMT)用于跟踪页面分配、页面初始化和翻译旁路缓冲区(TLB)的一致性。
TDX内存分为两类:私有内存和共享内存。私有内存受到完整的TDX保护,仅虚拟化监视程序可以访问其内容。共享内存用于虚拟机与虚拟化监视程序之间的共享,并不具备完整的TDX保护。TDX利用MKTME对TD的私有内存和其元数据进行加密。多密钥全内存加密(MKTME)是一个引擎,旨在使用AES-128-XTS提供内存加密,实现全面的数据保护。MKTME负责通过内存控制器对通过内存传递的数据进行透明的内存加密和解密。TDX模块在写入内存时对特定的缓存行编程,以使用MKTME加密所需的密钥。这些密钥与嵌入在物理地址中的HKID相关联。MKTME解码HKID,并使用引用的加密密钥执行加密操作。在TDX中,MKTME用TD Owner位与一个内存段(对应一个缓存行)相关联。TD Owner位存储在与这些段相关联的错误校正码(ECC)内存中。TDX模块通过将私有HKID附加到物理地址来控制将物理内存页面转换为安全内存。HKID编码在物理地址的高位。私有HKID的集合由TDX控制,只能用于TD和TDX模块。当内存控制器写入具有私有HKID的物理地址时,它将TD Owner位设置为1。当写入没有私有HKID的地址时,它将清除TD Owner位。每个缓存行读取时都会执行访问控制。读取请求经过内存控制器,只有在SEAM模式下执行的进程才能读取TD Owner位设置为1的缓存行。任何非SEAM模式的读取请求在尝试读取此类缓存行时将收到全零数据。在构建TD时,不受信任的hypervisor从普通内存中选择内存页面以成为安全内存的一部分。TDX模块逐渐将这些页面移动到安全内存中,并将其用于每个个体TD的元数据和主内存。在这些页面可以用于主内存之前,TD必须明确接受它们。TDX模块通过维护一个物理地址元数据表(Physical Address Metadata Table,PAMT)来执行安全内存设置的完整性检查。Guest VM访问共享内存需要通过TD虚拟机的许可,访问共享内存是通过TDCALL完成的。TDCALL会触发Linux读取 #VE info 结构(TDG.VP.VEINFO.GET), 之后,TD虚拟机通过页表项中的一位来选择私有或共享模式。共享映射的内容由Hypervisor完全控制。虚拟机应该只使用共享映射与虚拟化监视程序进行通信。在启动时,所有的TDX客户机内存都是私有的。TD虚拟机利用现有的内存加密辅助函数实现私有和共享之间的转换。set_memory_decrypted()函数将一段页面范围转换为共享状态,而set_memory_encrypted()函数将内存重新转换为私有状态。
3.3. I/O模型
在Linux中针对TDX的客户机支持中,所有MMIO区域和DMA缓冲区都被映射为TD内的共享内存。Linux客户机必须使用SWIOTLB在统一位置分配和转换DMA缓冲区,以防止来自I/O的恶意输入。驱动程序(如virtio_net、virtio_console、virtio_blk、9pnet_virtio、virtio_vsock)是共享内存的主要调用者。TD虚拟机通过改进的SWIOTLB函数和ioremap()函数将内存在启动时转换为共享状态,用于处理DMA缓冲区。对于一致性内存,TD虚拟机使用force_dma_unencrypted()函数强制取消DMA缓冲区的加密状态。虚拟设备的内存映射IO(MMIO)实现为共享内存。Guest VM在访问设备的MMIO区域时必须小心,除非已准备好处理#VE异常。通常情况下,TDX中的MMIO区域会在客户机中触发#VE异常。然后,客户机的#VE处理程序会在客户机内部对MMIO指令进行模拟,并将其转换为对主机的受控TDCALL,而不是将客户机状态暴露给主机。通过其他方式(如overlay)进行的MMIO访问可能会导致OOPS错误。
3.4. 认证
在启用TDX的机器上,验证者在TD内操作,并负责处理远程验证请求。当来自挑战者(如租户)的请求到达时,验证者通过生成TD报告提供TD正确实例化的证据。该报告作为证据由TDX模块生成,并由报告托管区签名。它包含了TDX的TCB(可信计算基)和加载在TD中的软件组件的测量结果。报告还包括由Intel颁发的证书作为锚定的证书链。在收到报告后,挑战者通过检查报告并确定验证者是否在真正的启用TDX的平台上运行,并且TD是否具有预期的软件测量结果来验证其真实性。如果报告成功验证,挑战者可以继续与验证者建立安全通道或向验证者发布秘密信息。
3.5. 未来计划的功能
Linux社区除了CPU上的机密计算, 还计划支持GPU上的机密计算。以及CPU GPU 协同合作时候的机密计算。微软与NVIDIA合作,在Azure上引入GPU加速的机密计算。目前,Nvidia A100 部分支持TEE的功能,并可以和Intel SGX共同协作,提供CPU GPU协同工作的机密虚拟机。H100的TEE功能由Nvidia官方全面支持。NVIDIA和微软将GPU加速计算与机密计算相结合,借助NVIDIA A100 Tensor Core GPU中的Ampere Protected Memory (APM)支持和硬件保护的虚拟机, 用于先进的人工智能工作负载, 使得企业将能够使用敏感数据集训练和部署更准确的模型。APM在数据通过PCIe总线从CPU传输到GPU或从GPU传输到CPU时,使用由NVIDIA设备驱动程序和GPU之间安全交换的密钥对数据进行加密。数据解密仅在GPU内部的硬件保护、隔离环境或GPU内的隔离区域中进行,这样可以对数据进行处理,用于训练AI模型或提供AI推理结果。其他Azure机密计算解决方案类似,NVIDIA A100 GPU中的APM功能支持基于NVIDIA在制造过程中分配的唯一GPU身份的加密证明。使用远程证明,组织可以独立验证GPU的安全状态,并确保他们的数据仅在GPU的机密隔离区域内进行处理。此外,Nvidia还和Linux社区合作, 从 Linux  v6.3 开始支持Nvidia H100 TEE。
4. TDX的hypervisor实现
如果要写一个针对TDX的hypervisor,要搞清楚其TDX加载过程,接着解释了TDX物理和线性内存布局,TD 的内存管理,以及跨安全域进行上下文切换。下面,我们详细解释这一部分。
4.1. TDX 加载和初始化
TDX 模块的工作主要是三块儿,TD dispatch, VMM dispatch 和 TD transition. TDX 加载开始于加载Intel Non-Persistent SEAM Loader(NP-SEAM Loader)。NP-SEAM Loader是一个Intel认证代码模块(ACM)。ACM是在处理器的内部RAM中运行的由Intel签名的模块。NP-SEAM Loader由Intel可信执行技术(TXT)通过GETSEC[ENTERACCS]函数进行认证和加载。NP-SEAMLoader包含了Intel持久性SEAM Loader(P-SEAM Loader)的映像,然后由NP-SEAM Loader进行验证和加载。P-SEAM Loader负责安装或更新TDX模块。P-SEAM Loader和TDX模块都加载在SEAM RANGE中,该范围是通过UEFI/BIOS保留的系统内存的一部分。范围的基地址和大小由IA32_SEAMRR_PHYS_BASE和IA32_SEAMRR_PHYS_MASK MSR指定。该范围被划分为Module_Range用于TDX模块和P_SEAMLDR_Range用于P-SEAM Loader。这两个模块在SEAM VMX根模式下运行,并使用SEAMCALL / SEAMRET与外部软件进行交互。NP-SEAM Loader、P-SEAM Loader和TDX模块均由Intel提供和签名,建立了一个信任链来引导TDX模块的启动。P-SEAM Loader提供了一个SEAMCALL接口函数seamldr_install,用于加载TDX模块。TDX模块的映像预先加载到一个内存缓冲区中(不在SEAM RANGE内)。缓冲区的物理地址和seam_sigstruct(TDX模块的签名)作为参数传递给seamldr_install函数。seam_sigstruct包含TDX模块的哈希值和安全版本号(SVN),每个逻辑处理器(LP)堆栈页的数量,每个LP数据页的数量以及全局数据页的数量。这些数字由seamldr_install函数用于确定TDX模块各个内存区域的物理/线性地址和大小。所有逻辑处理器(LPs)按顺序调用seamldr_install,在每个LP上,seamldr_install会检查LP是否已经处于由其他LP开始的安装会话中,并清除LP的VMCS缓存。最后一个LP会检查seamldr_install的参数,验证各个模块的签名,在SEAM RANGE中确定TDX模块各个内存区域的物理和线性地址以及大小:代码、数据、堆栈、页表、sysinfo_table、keyhole和keyhole-edit,将区域的物理地址映射到其线性地址,将TDX模块的二进制映像加载到SEAMRANGE中,设置TDX模块的sysinfo_table,在每个LP上设置SEAM Transfer VMCS。最后,在P-SEAM Loader的数据区域记录TDX模块的哈希值和SVN。
vt_init workflow
  tdx_init
     SEAMCALL_SEAMDLR_INSTALL for each cpu
     TDH_SYS_INIT
     TDH_SYS_LP_INIT
     TDH_SYS_INFO
     MKTME Partitioning check for each cpu
          TDH_SYS_LP_INIT for each cpu
          TDH_SYS_CONFIG
          TDH_SYS_KEY_CONFIG for each pkg
          TDH_SYS_TDMR_INIT
加载TDX module之后就是平台初始化, 见上图的workflow。
虚拟化管理程序通过SEAMCALL[TDH.SYS.INIT]对TDX模块进行全局初始化。然后,虚拟化管理程序对每个逻辑处理器(LP)进行SEAMCALL[TDH.SYS.LP.INIT] 调用,以检查和初始化每个LP的参数,比如keyhole,数据区域和堆栈区域。接下来,虚拟化管理程序分配一个全局私有HKID,并通过SEAMCALL[TDH.SYS.CONFIG]将其传递给TDX模块,该调用还初始化了Trust DomainMemory Region (TDMR)。每个处理器套件上的 SEAMCALL[TDH.SYS.KEY.CONFIG] 生成一个TDX全局私有密钥,并将该密钥与该HKID绑定。该密钥用于加密存储每个TD的Physical AddressMetadata Table (PAMT)和Trust Domain Root (TDR)的内存。最后,虚拟化管理程序多次调用SEAMCALL[TDH.SYS.TDMR.INIT]逐步初始化每个TDMR的PAMT。TDMR里面存了每个TD(Trust Domain)的元数据, 包括Trust Domain Root(TDR),Trust Domain Control Structure(TDCS),Trust Domain Virtual Processor State(TDVPS)和 Secure EPT(SEPT)。
4.2. TDX物理和线性内存布局
TDX模块在Module_Range内的物理内存布局如下所示。
                               TDX 的物理内存布局图,参考https://www.intel.com/content/www/us/en/developer/articles/technical/intel-trust-domain-extensions.html
TDX 的物理内存布局以一个4 KB的页面开始,该页面保存TDX模块的sysinfo_table。sysinfo_table包含由NP-SEAM Loader的MCHECK填充的2 KB平台信息,以及由P-SEAM Loader填充的下一个2 KB,其中包含TDX模块的信息,如SEAM RANGE的基地址和大小、内存区域的基线性地址、LP数量和私有HKID的范围。在sysinfo_table之后,是每个LP的VMCS区域。每个LP都有一个4 KB的SEAM Transfer VMCS。在每个LP的VMCS区域之后,是数据区域,该区域被划分为每个LP的数据区域和全局数据区域。接下来是TDX模块的4级页表,然后是每个LP的堆栈区域,最后是TDX模块的可执行代码区域。
                               TDX 的线性内存布局图,参考https://www.intel.com/content/www/us/en/developer/articles/technical/intel-trust-domain-extensions.html
TDX模块维护一个页表来进行地址转换, 并维护自己的线性内存布局。上图展示了TDX模块线性地址空间的布局,该布局由P-SEAM Loader通过构建TDX模块的页表来建立。为了防止内存破坏攻击,P-SEAM Loader对线性地址的第34到46位进行随机化处理,并把区域的线性地址和大小记录在sysinfo_table的字段中。
4.3. TD 的内存管理
TD的内存管理定义在TDX module的vmm dispatcher API 里面。TDX 上有两类memory,E820和Convertible memory range (CMR)。E820 由BIOS设置,是host内核可用内存范围。CMR是可转换内存范围用于TD来宾私有页面,相当于SGX的EPC, 由TDX Module设置。CMR里面有一段叫做Trust Domain Memory Region(TDMR),由VMM配置。在TDMR里面又一段叫做PhysicalAddress Metadata Table(PAMT , AKA 物理地址元数据表),是TDMR的一个子集,是用来强制执行额外的属性。具体来说,TDs(可信域)可以访问两类内存 。私有内存用于保存TD的机密数据,共享内存用于与不受信任的外部实体进行通信。TD的私有内存通过为该TD分配的独特的、临时的内存加密密钥,提高了加密的机密性和完整性保护。除了私有内存和共享内存, TD客户环境中的内存可以未接受的内存或者内存映射的I/O(MMIO)。
● 私有内存 - TD一般将其所有私有代码和数据定位在使用私有GPA映射的私有内存中。TD分配的私有密钥有助于对使用“共享”位设置为0的GPA的所有内存访问进行加密和保护完整性。所有使用“共享”位设置为1的GPA的共享内存访问可能会使用由虚拟机管理的共享密钥进行加密和保护完整性。私有内存由VMM通过SEAMCALL[TDH.MEM.PAGE.ADD]或TDVF通过TDCALL[TDG.MEM.PAGE.ACCEPT]创建,页面表中的S位清除。
● 共享内存 - 共享内存用于与TD外部的代理进行通信,以执行诸如网络访问、存储服务、调用虚拟化服务等I/O操作。共享内存在客户物理地址(GPA)中,最高位被指定为“共享”位,用于指示该GPA是否映射私有内存(当“共享”位为0时)或映射共享内存(当“共享”位为1时)。共享内存由VMM通过SEAMCALL[TDH.MEM.PAGE.ADD]或TDVF通过TDCALL[TDG.MEM.PAGE.ACCEPT]创建,页面表中的S位设置。
● 未接受的内存 - 由VMM通过SEAMCALL[TDH.MEM.PAGE.AUG]创建,但尚未被TDVF接受。
● 内存映射的I/O(MMIO) - 通过TDVF通过TDVMCALL<#VE.RequestMMIO>访问的共享内存。
Intel-TDX模块提供安全EPT管理功能给虚拟机管理器(VMM),用于向安全EPT添加或删除映射,并通过执行安全策略来维护内存布局的完整性。用于构建安全EPT的内存被设计为使用唯一的、每个TD的内存加密密钥进行加密和完整性保护。CPU会阻止TD将页表结构和可执行代码定位在共享内存中。如果代码获取或页表访问位于共享内存中,CPU会引发页故障(#PF)。Intel-TDX模块pamt_get_block利用物理地址元数据表(Physical-Address-Metadata Table,PAMT) 来确保映射到TD的安全EPT的页面不能映射到其他任何TD的安全EPT中。PAMT作为一个跟踪数据结构,帮助确保页面只能在安全EPT中映射到一个GPA。它提供给VMM函数来向安全EPT添加4K, 2M或1G的映射。PAMT还跟踪页面大小和类型,以确保在从安全EPT中取消映射页面时进行正确的TLB失效操作。这有助于维护内存映射的完整性和一致性。当使用安全EPT或共享EPT进行虚拟地址到物理地址的转换时,这些转换会被缓存到CPU的TLB(Translation Lookaside Buffer)中。TLB为每个转换关联一个标签,以标识创建该转换的TD。这样可以实现高效的地址转换,并减少重复转换操作的开销。基于安全EPT的地址转换架构支持将大页映射到安全/共享EPT,并在适当的情况下将转换缓存为大页。TD的地址转换
lock_sept_check_and_walk_private_gpa -> lock_sept_check_and_walk_any_gpa ->secure_ept_walk 遵循类似于传统虚拟机 two-level page walk。因此,在地址转换方面,TD中的软件和传统虚拟机中软件开销差不多。在TD执行时,虚拟机管理器(VMM)通过扩展页表(EPT)帮助为TD分配和映射使用的内存到TD的GPA,提供GPA到物理地址(PA)的转换。在TD执行时会有两个EPT用于TD:一个安全EPT用于提供私有GPA到PA的转换,以及一个共享EPT用于提供共享GPA到PA的转换。信任域(TD)使用的客户物理内存由TD私有密钥或基于GPA共享位(基于GPAW的GPA )进行加密。TD操作系统可以在Host虚拟机管理器(VMM)配置的固定私有GPA空间上运行。通常,Host OS会管理物理页框数据库,用于记录(客户)物理内存分配的状态。为了避免为大量共享GPA空间扩展页框数据库,TD操作系统可以通过管理物理内存状态属性来指示是否使用TD私有密钥或VMM密钥对其进行加密。然后,TD客户操作系统可以使用TDG.VP.VMCALL(MapGPA) 在固定的GPA映射内请求Host虚拟机管理器(VMM)将GPA范围映射为私有或共享内存映射, 或者共享I/O内存的别名映射到该GPA空间中的共享内存。此API还可用于将页面映射从私有转换为共享。在此操作中传递的GPA范围可以通过起始地址中的GPA.Shared位来指示映射是请求用于共享内存还是私有内存。例如,为了与VMM交换数据,TD可以使用此TDG.VP.VMCALL请求将GPA范围映射为共享内存(例如,用于半虚拟化IO)通过共享EPT。如果指定的起始GPA是私有GPA(GPA.S位清除),则此MapGPA TDG.VP.VMCALL可以用于请求HostVMM映射特定的私有页面(该映射可能涉及将支持物理页从共享页转换为私有页)。在这种情况下, VMM必须将GPA从共享EPT区域取消映射,并使TD VCPU的TLB和缓存无效,刷新TLB和缓存,并删除映射,以确保不存在陈旧的映射。类似地,如果共享页已分配给任何设备用于IO,那么VMM应使IOTLB无效并清除任何待处理的IO事务(例如,通过排队等待描述符)以删除IO侧的陈旧映射。然后,应刷新所有数据缓存的内容。具体流程是,VMM可以选择私有GPA空间的一个页面,并用TDG.VP.VMCALL(MapGPA),并将GPA.S=1进行映射。VMM可以使用TDH.MEM.RANGE.BLOCK, TDH.MEM.TRACK和TDH.MEM.SEPT.REMOVE从S-EPT映射中移除受影响的GPA。VMM可以使用直接内存存储重新获取该页面,并在由VMM管理的共享EPT中为TD操作系统映射共享GPA的别名。稍后,TD操作系统可能需要将GPA用作私有页,通过使用相同的TDG.VP.VMCALL(MapGPA),其中GPA被指定为私有GPA(GPA.S=0),来请求HostVMM将该页面与共享EPT解除关联,并执行TDH.MEM.PAGE.AUG以为私有GPA设置待处理EPT映射。成功完成TDG.VP.VMCALL流程后,TD客户可以使用TDG.MEM.PAGE.ACCEPT来重新初始化该页,使用TD私有密钥,并将S-EPT映射标记为活动状态。
4.4. 跨安全域进行上下文切换
TDX有两种类型的上下文切换:(1)hypervisor和TDX模块之间,(2)TD和TDX模块之间。Hypervisor 通过SEAMCALL接口函数与TDX模块进行交互, 处理器从VMX根模式转换到SEAMVMX根模式,加载TDX模块的SEAM Transfer VMCS。在Module_Range中,SEAM TransferVMCS区域的位置和布局从SEAMRR_Base开始。Module_Range的第一个4 KB页面是sysinfo_table。从SEAMRR_Base + 4 KB开始,有一个由每个LP的SEAM Transfer VMCS区域组成的数组。每个区域是一个4 KB页面。这个数组以LP的标识符(LP_ID)作为索引。当执行SEAMCALL指令时,处理器根据当前的LP_ID来搜索VMCS地址。地址的确定方式是:SEAMRR_Base + 4 KB + (LP_ID × 4 KB)。TDX模块的状态存储在VMCS的主机状态区域中。主机RIP被设置为TDX模块的tdx_seamcall_entry_point,主机CR3被设置为TDX模块PML4基址的物理地址。此外,主机FS_BASE被设置为sysinfo_table的线性地址,主机GS_BASE被设置为每个LP的数据区域的线性地址。当LP通过SEAMCALL指令转换到TDX模块时,存储在SEAM Transfer VMCS中的信息被加载到处理器中。因此,FS_BASE和GS_BASE现在分别指向TDX模块的sysinfo_table和本地数据区域。CR3寄存器指向TDX模块的页表,从而将内存管理单元(MMU)切换到TDX模块的线性地址空间。TDX模块开始处理SEAMCALL并将其分派给相应的接口函数。
在TDX虚拟化实现中,同步的TDCALL或异步的TD退出被设计为陷入TDX模块。这由TD TransferVMCS控制,在创建TD的虚拟CPU时设置,并存储在TD的TDVPS中。TDVPS使用TD的私钥进行加密。因此,TD Transfer VMCS对于不受信任的hypervisor是不可访问的。当TD调用TDCALL或触发TD退出时,LP加载存储在TD Transfer VMCS中的TDX模块的状态以进行上下文切换。某些TD退出需要hypervisor来辅助模拟某些操作,如端口I/O、HLT、CPUID等等。所有的TD退出首先陷入TDX模块,TDX模块向TD注入一个虚拟化异常(VE)来处理退出。TD的客户机内核包含一个相应的VE处理程序,该处理程序准备了一个最小化的参数集,并调用TDCALL重新进入TDX模块。此时,TDX模块可以安全地要求hypervisor处理请求,最小化地暴露敏感信息。
5. 总结
综上所述,Intel® Trust Domain Extensions (Intel® TDX) 可以用于部署硬件隔离的虚拟机(VM)称为Trust Domains(TDs)。Intel TDX的设计目的是将TD虚拟机与虚拟机管理器(VMM)、Hypervisor和主机平台上的其他非-TD软件进行隔离。Intel TDX模块利用专门为Intel TDX设计的指令集架构,同时借助系统芯片(SoC)中的MKTME(Multi-Key Total Memory Encryption)引擎的支持。该模块充当主机虚拟机管理器(VMM)和客户端Trust Domains(TDs)之间的中间层。TDs需要使用Guest-Host-Communication Interface(GHCI)与Intel TDX模块和主机VMM进行通信。GHCI提供了一种标准化的方法,供TDs与Intel TDX模块进行交互,并与主机VMM交换信息。通过利用指令集架构和MKTME引擎以及GHCI,Intel TDX模块促进了TDs与主机VMM之间的安全通信和协调,确保了TDs与底层平台的隔离和保护。Intel TDX可用于增强保密计算,通过帮助保护TD免受各种软件攻击,同时有助于减少TD的可信计算基础(TCB)。
题图来源:https://pixabay.com/zh/vectors/computer-encrypt-encryption-1294045

Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 【萤火工场CEM5826-M11测评】OLED显示雷达数据本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。该项目整体分为两部分: 一、框架显示; 二、数据采集与填充显示。为了减小 MCU 负担,采用 局部刷新 的方案。1. 显示框架所需库函数 Wire.h 、Adafruit_GFX.h 、Adafruit_SSD1306.h . 代码#include #include #include #include "logo_128x64.h"#include "logo_
    无垠的广袤 2024-12-10 14:03 74浏览
  • 概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些之前系列器件还未遇到的问题,这些问题将在本文中进行详细描述介绍。 在五代Cyclone器件内部系统时钟受限的情况下,意味着大量逻辑资源将被浪费在于实现较大长度的TDL上面。是否可以找到方法可以对此前TDL的长度进行优化呢?本文还将探讨这个问题。TDC前段BIN颗粒堵塞问题分析 将延时链在逻辑中实现后
    coyoo 2024-12-10 13:28 108浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-10 16:13 113浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 153浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 67浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 69浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 57浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 53浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 99浏览
  • 智能汽车可替换LED前照灯控制运行的原理涉及多个方面,包括自适应前照灯系统(AFS)的工作原理、传感器的应用、步进电机的控制以及模糊控制策略等。当下时代的智能汽车灯光控制系统通过车载网关控制单元集中控制,表现特殊点的有特斯拉,仅通过前车身控制器,整个系统就包括了灯光旋转开关、车灯变光开关、左LED前照灯总成、右LED前照灯总成、转向柱电子控制单元、CAN数据总线接口、组合仪表控制单元、车载网关控制单元等器件。变光开关、转向开关和辅助操作系统一般连为一体,开关之间通过内部线束和转向柱装置连接为多,
    lauguo2013 2024-12-10 15:53 93浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 80浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 99浏览
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 62浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 92浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 56浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦