0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux是如何实现和支持机密计算的

Linux阅码场 来源:Linux阅码场 2023-06-26 09:57 次阅读

在大模型时代,模型即服务(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中的使用方式。
0dfd6630-13b5-11ee-962d-dac502259ad0.png 参考: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社区合作, 从 Linuxv6.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内的物理内存布局如下所示。 0e47a7ae-13b5-11ee-962d-dac502259ad0.png                                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模块的可执行代码区域。
0e641af6-13b5-11ee-962d-dac502259ad0.png                                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)。

责任编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206736
  • 计算
    +关注

    关注

    2

    文章

    431

    浏览量

    38479
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47689

原文标题:Linux对机密计算的支持

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    百度,谷歌和微软等科技公司组建机密计算联盟

    包括阿里巴巴,Arm,百度,IBM,英特尔,谷歌云,微软和红帽在内的主要科技公司22日宣布有意组建机密计算联盟,以提高使用中数据的安全性。该组织由Linux基金会成立,计划将硬件供应商,开发人员
    的头像 发表于 08-22 09:44 6649次阅读

    Linux生成密码命令有哪些?

    使用Linux命令生成随机密码是一种基本的Linux操作功能,并有多种实现形式,具体使用方式如下:1. 使用openssl生成随机密码具体用
    发表于 03-02 18:53

    Linux上生成随机密码的方法

    使用Linux命令生成随机密码是一种基本的Linux操作功能,并有多种实现形式,具体使用方式如下:1. 使用openssl生成随机密码具体用
    发表于 11-20 11:02

    Linux忘记开机密码的解决方法

    Linux忘记开机密码怎么办?1. 开机ESC/Shift,在出现grub画面时,用上下键选中你平时启动linux的那一项,然后按e键
    发表于 07-26 07:23

    如何实现linux支持的swap功能的呢?

    ,如何实现linux支持的swap功能的呢?1,嵌入式linux随产品发布时,运行的逻辑往往是在设计之初就确定了。因而在选择内存大小时,避免了可用内存的不足的问题。因而不会出现swa
    发表于 11-05 07:05

    如何在Arm计算平台中实现机密计算

    ) 如何在 Arm 计算平台中实现机密计算。看完本文后,您将能够:定义机密计算描述复杂的系统信任
    发表于 08-05 14:40

    Arm机密计算架构用户指南

    在本指南中,我们将探讨保密计算在现代计算平台和解释机密计算的原理。然后我们描述Arm机密计算架构
    发表于 08-02 08:27

    开源机密计算平台:蓬莱-OpenHarmony

    OpenHarmony技术峰会——安全及机密计算分论坛 ​ 正 文 内 容 OpenHarmony赋能万物互联,存在覆盖从端到云的安全能力需求。蓬莱-OpenHarmony是一个开源机密计算
    发表于 09-07 16:08

    Linux 5.7将支持Zstd压缩算法

    Linux 5.6 引入了可选的 F2FS 透明数据压缩支持,并通过 LZO 和 LZ4 压缩算法实现。现在,Linux 5.7 内核正在支持
    的头像 发表于 03-26 15:15 2611次阅读

    浅谈机密计算的工作原理和应用

    几大科技公司在大力采用一种新的安全模式:所谓的机密计算,以更好地保护各种形式的数据。
    的头像 发表于 07-02 12:43 3687次阅读

    GTC2022大会黄仁勋:Hopper 实现首个GPU机密计算

    GTC2022大会黄仁勋:Hopper 实现首个GPU机密计算,是处理器架构和软件的结合,每个Hopper 实例都支持在受信任执行环境中进行机密
    的头像 发表于 03-23 17:47 1834次阅读
    GTC2022大会黄仁勋:Hopper <b class='flag-5'>实现</b>首个GPU<b class='flag-5'>机密</b><b class='flag-5'>计算</b>

    玩转机密计算从secGear开始

    作为隐私计算的重要分支,机密计算是一种利用硬件可信执行环境 (Trusted Execution Environment, TEE) 保护使用中数据的技术 [1]。如下图所示,在非安全世界(Rich Execution Envi
    的头像 发表于 01-13 15:25 512次阅读

    什么是机密计算机密计算有何独到之处?

    机密计算是一种在计算机处理器的保护区内处理数据的方式。该保护区通常位于远程边缘或公有云服务器内,可保证无人能够查看或更改所处理的工作。
    的头像 发表于 05-06 16:38 1131次阅读
    什么是<b class='flag-5'>机密</b><b class='flag-5'>计算</b>?<b class='flag-5'>机密</b><b class='flag-5'>计算</b>有何独到之处?

    Arm如何让构建支持机密计算的平台变得更容易

    要构建一个支持机密计算的平台,必须解决几个挑战,但主要的挑战是如何在处理数据和代码时保护数据和代码。相比之下,通过使用强大的加密、数字签名和细致的密钥管理,保护静态数据和动态数据相对容易。 
    的头像 发表于 05-08 11:11 658次阅读
    Arm如何让构建<b class='flag-5'>支持</b><b class='flag-5'>机密</b><b class='flag-5'>计算</b>的平台变得更容易

    ARM系列—机密计算

    今天来看一个ARM中的新东西,机密计算架构(Confidential Compute Architecture,CCA)。CCA是ARM公司在2021年发布的,属于Armv9-A的关键架构之一。有了机密
    发表于 05-24 15:25 946次阅读
    ARM系列—<b class='flag-5'>机密</b><b class='flag-5'>计算</b>