在大模型時(shí)代,模型即服務(wù)(Model as a Service)可以發(fā)揮重要的作用。模型即服務(wù)提供了一種將這些大模型部署在云端,并提供多個(gè)實(shí)體共同訓(xùn)練模型的合作模式。共同訓(xùn)練的多個(gè)實(shí)體需要共享數(shù)據(jù)并合作。 對于互不信任的實(shí)體共享數(shù)據(jù)進(jìn)行合作的場景(例如,基于法律原因數(shù)據(jù)必須留在特定司法管轄區(qū)內(nèi)),機(jī)密計(jì)算可以提供數(shù)據(jù)隱私和合規(guī)的保護(hù)。例如,通過在CPU TEE中運(yùn)行聚合分析運(yùn)算,可以降低對聚合分析機(jī)器的信任。類似地,通過在機(jī)密虛擬機(jī)TVM (trustedvirtual machine)中運(yùn)行每個(gè)參與者的本地訓(xùn)練,可以降低對參與者的信任,并確保計(jì)算的完整性和數(shù)據(jù)的私密性。通過確保每個(gè)參與者對其訓(xùn)練數(shù)據(jù)的隱私數(shù)據(jù)過程不泄漏的承諾,TEE可以提高透明度和問責(zé)制,并起到防范數(shù)據(jù)和模型污染以及數(shù)據(jù)偏見等攻擊的作用?;赥EE的機(jī)密計(jì)算正逐漸成為負(fù)責(zé)人人工智能的重要工具。Linux kernel對TEE的支持是TEE生態(tài)系統(tǒng)中的重要基石。本文講詳細(xì)解釋Linux是如何實(shí)現(xiàn)和支持機(jī)密計(jì)算的。
本文結(jié)構(gòu)如下,我們會先講解機(jī)密計(jì)算的背景,概述TDX依賴的硬件技術(shù),最后詳細(xì)描述TDXModule的軟件實(shí)現(xiàn)原理和TDX的hypervisor實(shí)現(xiàn)。
1. 機(jī)密計(jì)算的背景
機(jī)密計(jì)算 (Confidential Computing)是一種在計(jì)算機(jī)處理器的受保護(hù)區(qū)域中處理數(shù)據(jù)的方法,通常在遠(yuǎn)程邊緣云或公共云服務(wù)器內(nèi)部進(jìn)行,并且可以證明沒有任何人查看或修改了該數(shù)據(jù)。2015年的一篇論文 Verifiable Confidential Cloud Computing 使用新的安全防護(hù)擴(kuò)展(Intel SGX)在x86CPU上展示了如何運(yùn)算進(jìn)行時(shí)的安全。該論文將其方法稱為VC3,代表可驗(yàn)證的機(jī)密云計(jì)算(Confidential Cloud Computing),而這個(gè)名稱從此被廣泛采納。
機(jī)密計(jì)算建立在一種稱為"root of trust"的基礎(chǔ)上,該基礎(chǔ)基于每個(gè)處理器的獨(dú)特安全密鑰。處理器通過所謂的安全測量引導(dǎo)檢查是否具有正確的固件以開始運(yùn)行。該過程生成參考數(shù)據(jù),驗(yàn)證芯片處于已知的安全狀態(tài)以開始工作。處理器建立了一個(gè)安全隔離區(qū)域或可信執(zhí)行環(huán)境(TEE),與系統(tǒng)的其余部分隔離開來,在其中運(yùn)行用戶的應(yīng)用程序。該應(yīng)用程序?qū)⒓用軘?shù)據(jù)帶入TEE,解密數(shù)據(jù),運(yùn)行用戶的程序,加密結(jié)果并發(fā)送出去。在任何時(shí)候,機(jī)器所有者都不能查看用戶的代碼或數(shù)據(jù)。TEE向用戶證明沒有人能夠篡改數(shù)據(jù)或軟件。2018 年,Open Enclave SDK發(fā)布,OpenEnclave SDK (https://openenclave.io/sdk/)致力于支持一個(gè)API集,使開發(fā)人員可以一次構(gòu)建并在多個(gè)技術(shù)平臺上進(jìn)行部署,包括云端、混合環(huán)境和邊緣計(jì)算,并且適用于Linux和Windows操作系統(tǒng)。
谷歌,阿里,微軟,亞馬遜等多家云廠商都提供了機(jī)密計(jì)算的服務(wù)。比如Azure提供了一個(gè)豐富的機(jī)密計(jì)算平臺,包括不同類型的機(jī)密計(jì)算硬件(如Intel SGX,AMD SEV-SNP),核心機(jī)密計(jì)算服務(wù)(如Azure Attestation和Azure Key Vault托管HSM),以及應(yīng)用級服務(wù),如Azure SQL AlwaysEncrypted、Azure機(jī)密分類賬本和Azure上的機(jī)密容器。Linux 支持多種CPU架構(gòu)上的機(jī)密計(jì)算, 比如Intel Icelake 和 Intel Skylake 上的SGX,AMD 上的SEV 和 SEV-SNP,Intel SPR上的TDX等。其中Intel Trust Domain Extensions (TDX)是第四代英特爾至強(qiáng)可擴(kuò)展處理器中支持機(jī)密計(jì)算的新架構(gòu)擴(kuò)展。TDX允許在安全仲裁模式(SEAM)中部署虛擬機(jī),具有加密的CPU狀態(tài)和內(nèi)存、完整性保護(hù)以及遠(yuǎn)程證明功能。TDX旨在為虛擬機(jī)強(qiáng)制執(zhí)行硬件輔助隔離,并將暴露給主機(jī)平臺的攻擊面最小化。TDX是使用多種技術(shù)組合構(gòu)建的,包括虛擬化技術(shù)(VT),多密鑰總體內(nèi)存加密(MKTME)和TDX模塊, 此外,TDX還依賴于軟件保護(hù)擴(kuò)展(SGX)和數(shù)據(jù)中心認(rèn)證原語(DCAP)進(jìn)行遠(yuǎn)程認(rèn)證。TDX實(shí)現(xiàn)了內(nèi)存機(jī)密性,CPU狀態(tài)機(jī)密性,執(zhí)行完整性以及部分的I/O保護(hù)。
● 內(nèi)存機(jī)密性:TD(Trust Domain)內(nèi)部存儲的數(shù)據(jù)以明文形式存儲在處理器封裝中。然而,當(dāng)數(shù)據(jù)從處理器轉(zhuǎn)移到主內(nèi)存時(shí),處理器使用僅對處理器可知的TD特定加密密鑰對其進(jìn)行加密。加密是以緩存行粒度進(jìn)行的,使外設(shè)設(shè)備無法讀取或篡改TD的私有內(nèi)存而不被檢測到。處理器能夠檢測到從主內(nèi)存加載數(shù)據(jù)時(shí)可能發(fā)生的任何篡改。
● CPU狀態(tài)機(jī)密性:TDX通過在安全域之間的所有上下文切換期間管理TD的虛擬CPU狀態(tài),保護(hù)免受同時(shí)執(zhí)行的進(jìn)程的影響。狀態(tài)存儲在TD的元數(shù)據(jù)中,使用TD的密鑰在主內(nèi)存中進(jìn)行保護(hù)。在上下文切換期間,TDX從內(nèi)部處理器寄存器和緩沖區(qū)(例如轉(zhuǎn)換后備緩存(TLB)條目或分支預(yù)測緩沖區(qū))中清除或隔離TD特定的狀態(tài),以保持TD信息的保護(hù)。
● 執(zhí)行完整性:TDX保護(hù)TD的執(zhí)行免受主機(jī)干擾,確保在中斷后TD在預(yù)期指令和預(yù)期狀態(tài)下恢復(fù)其計(jì)算。它能夠檢測虛擬CPU狀態(tài)的惡意更改,以及位于私有內(nèi)存中的指令的注入、修改或刪除。然而,TDX對于控制流完整性不提供額外的保證。TD的所有者有責(zé)任使用現(xiàn)有的基于編譯或硬件輔助的控制流完整性強(qiáng)制執(zhí)行技術(shù),如控制流強(qiáng)制執(zhí)行技術(shù)(CET)。
● I/O保護(hù):外設(shè)設(shè)備或加速器處于TD的信任邊界之外,不應(yīng)允許其訪問TD的私有內(nèi)存。為了支持虛擬化的I/O,TD可以選擇顯式共享內(nèi)存進(jìn)行數(shù)據(jù)傳輸。然而,TDX對于共享內(nèi)存區(qū)域中的數(shù)據(jù)不提供任何機(jī)密性和完整性保護(hù)。TD的所有者有責(zé)任實(shí)施適當(dāng)?shù)臋C(jī)制,例如使用像傳輸層安全(TLS)這樣的安全通信通道,以保護(hù)離開TD信任邊界的數(shù)據(jù)。TDX2.0計(jì)劃包括可信I/O虛擬化來解決這些問題。
2. TDX依賴的硬件技術(shù)
機(jī)密計(jì)算 Intel TDX確保TD(Trust Domain)的內(nèi)存和虛擬CPU狀態(tài)的機(jī)密性和完整性,確保它們不會被在同一臺機(jī)器上執(zhí)行的其他安全域訪問或篡改。這是通過以下幾種方式實(shí)現(xiàn)的:
(1)內(nèi)存訪問控制,
(2)運(yùn)行時(shí)內(nèi)存加密,以及
(3)由Intel簽名的TDX模塊處理安全敏感的TD管理操作。 如圖所示,TDX依賴于一系列現(xiàn)有的英特爾技術(shù),包括虛擬化技術(shù)(VT)、總體內(nèi)存加密(TME)/多密鑰總體內(nèi)存加密(MKTME)和軟件保護(hù)擴(kuò)展(SGX)。下面,我們將對這些基礎(chǔ)技術(shù)進(jìn)行概述,并解釋它們在TDX中的使用方式。
參考:https://github.com/intel/tdx-tools/wiki/API-&-Specifications 2.1. 虛擬化技術(shù)(VT)
VT(Virtualization Technology)是TDX的基礎(chǔ)。TDX是基于虛擬機(jī)的可信執(zhí)行環(huán)境(TEE),它依賴于VT來實(shí)現(xiàn)TD之間的隔離。具有VT-x技術(shù)的處理器具有一組特殊的指令集,稱為虛擬機(jī)擴(kuò)展(VMX),它使虛擬化得以控制。具有VT-x技術(shù)的處理器可以運(yùn)行在兩種模式下:VMX根模式和VMX非根模式。虛擬機(jī)監(jiān)控程序(hypervisor)在VMX根模式下運(yùn)行,而虛擬機(jī)客戶機(jī)(guest VM)在VMX非根模式下運(yùn)行。VT-x定義了兩個(gè)新的轉(zhuǎn)換,即虛擬機(jī)進(jìn)入(VM entry)和虛擬機(jī)退出(VMexit),用于在客戶機(jī)和虛擬機(jī)監(jiān)控程序之間進(jìn)行切換。虛擬機(jī)控制結(jié)構(gòu)(VMCS)是一種存儲模式轉(zhuǎn)換的虛擬機(jī)和宿主狀態(tài)信息的數(shù)據(jù)結(jié)構(gòu)。它還控制哪些客戶機(jī)操作會導(dǎo)致虛擬機(jī)退出。IntelVT-x利用擴(kuò)展頁表(EPT)實(shí)現(xiàn)了第二級地址轉(zhuǎn)換(SLAT)。每個(gè)客戶機(jī)內(nèi)核維護(hù)自己的頁表,將客戶機(jī)虛擬地址(GVA)轉(zhuǎn)換為客戶機(jī)物理地址(GPA)。虛擬機(jī)監(jiān)控程序管理EPT,將GPA映射到主機(jī)物理地址(HPA)。Intel VT for Directed I/O(VT-d)使得可以對設(shè)備訪問進(jìn)行隔離和限制,以便管理設(shè)備的實(shí)體可以進(jìn)行控制。它包括I/O設(shè)備分配、DMA重映射、中斷重映射和中斷發(fā)送。借助VT-d的支持,虛擬機(jī)可以通過虛擬到物理地址轉(zhuǎn)換直接訪問物理I/O內(nèi)存,其中的IOMMU起到了幫助的作用。VT-d還提供了在虛擬機(jī)之間進(jìn)行I/O設(shè)備分配的靈活性,并消除了虛擬機(jī)監(jiān)控程序處理中斷和DMA傳輸?shù)男枨?。在新的威脅模型中,不再信任虛擬化管理程序(hypervisor),因此管理TD的功能已經(jīng)封裝在TDX模塊中。TDX模塊和TD在新的SEAM VMX根/非根模式下運(yùn)行,并具有額外的保護(hù)措施。TDX仍然利用EPT(擴(kuò)展頁表)來管理GPA(Guest Physical Address)到HPA(Host PhysicalAddress)的轉(zhuǎn)換。但目前,對于每個(gè)TD,它維護(hù)了兩個(gè)EPT,一個(gè)用于私有(加密)內(nèi)存,另一個(gè)用于共享(未加密)內(nèi)存。
2.2. 總體內(nèi)存加密(TME)/多密鑰總體內(nèi)存加密(MKTME)
TME使用單個(gè)臨時(shí)密鑰對整個(gè)計(jì)算機(jī)的內(nèi)存進(jìn)行加密。密鑰在引導(dǎo)時(shí)通過硬件隨機(jī)數(shù)生成器和集成到系統(tǒng)芯片組中的安全措施的組合生成。內(nèi)存加密由每個(gè)內(nèi)存控制器上的加密引擎執(zhí)行。加密過程使用NIST標(biāo)準(zhǔn)的128位或256位密鑰的AES-XTS算法。MKTME(Multi-key Total MemoryEncryption)擴(kuò)展了TME,支持多個(gè)密鑰和以頁面粒度的內(nèi)存加密。對于每個(gè)內(nèi)存事務(wù),MKTME根據(jù)主機(jī)密鑰標(biāo)識符(HKID)選擇一個(gè)加密密鑰來加密內(nèi)存。HKID占據(jù)物理地址的頂部,可由BIOS在系統(tǒng)引導(dǎo)期間設(shè)置HKID的范圍。MKTME允許使用軟件提供的密鑰,并引入了一個(gè)新的指令PCONFIG,用于編程與特定HKID相關(guān)聯(lián)的密鑰和加密模式。這些?HKID,密鑰?對存儲在每個(gè)MKTME加密引擎中的密鑰加密表(KET)中。KET中的密鑰從不離開處理器,也不會暴露給軟件。在TDX中,MKTME模塊負(fù)責(zé)控制TD的內(nèi)存加密。HKID空間被劃分為私有HKID和共享HKID。私有HKID僅用于加密TD的私有內(nèi)存。TDX模塊仍然利用MKTME來保護(hù)TD的內(nèi)存。
2.3. 軟件保護(hù)擴(kuò)展(SGX)
Intel SPR CPU是需要Intel SGX的輔助才能完成遠(yuǎn)程認(rèn)證的。Intel SGX在ISA中添加了18條新指令,使開發(fā)人員能夠?qū)ζ鋺?yīng)用程序進(jìn)行分區(qū),并保護(hù)選定的代碼和數(shù)據(jù)在安全區(qū)域(enclaves)中。SGX使用基于硬件的內(nèi)存加密來保護(hù)安全區(qū)域的內(nèi)容。SGX 創(chuàng)建了新的設(shè)備(/dev/sgx)支持一些ioctl()調(diào)用。CPU的訪問控制ioctl()禁止了外部的代碼對內(nèi)部區(qū)域的內(nèi)存進(jìn)行訪問, 并在離開最后一級緩存之前對其進(jìn)行加密。SGX固件使用PRMRR寄存器來保留一片被稱為Enclave PageCache(EPC)的物理內(nèi)存區(qū)域。處理器中有一個(gè)稱為Memory Encryption Engine(MEE)或者Total Memory Encryption (TME) 的硬件單元。安全區(qū)域頁面緩存(EPC)是一個(gè)特殊的內(nèi)存區(qū)域,包含安全區(qū)域的代碼和數(shù)據(jù),其中每個(gè)頁面使用內(nèi)存加密引擎(MEE)進(jìn)行加密。安全區(qū)域頁面緩存映射(EPCM)存儲頁面的元數(shù)據(jù),例如配置、權(quán)限和類型。在引導(dǎo)時(shí),密鑰被生成并用于解密CPU內(nèi)部的加密頁面的內(nèi)容。這些密鑰由MEE控制,并且從不暴露給外部。因此,只有這個(gè)特定的CPU才能解密內(nèi)存。CPU將這些密鑰內(nèi)部存儲,并阻止任何軟件訪問它們。此外,非安全區(qū)域中的特權(quán)軟件不被允許讀取或?qū)懭隕PC或EPCM頁面。禁止的幾個(gè)API定義在了arch/x86/include/asm/sgx.h。使用SGX_IOCTL_ENCLAVE_CREATE 創(chuàng)建一個(gè)新的enclave,使用SGX_IOCTL_ENCLAVE_ADD_PAGE 向其中添加數(shù)據(jù)頁。然后使用SGX_IOCTL_ENCLAVE_INIT 準(zhǔn)備運(yùn)行。最后一個(gè)操作需要傳入一個(gè)包含enclave數(shù)據(jù)哈希和適當(dāng)簽名的初始化令牌。SGX沒有辦法在創(chuàng)建了enclave后刪除它。特權(quán)級(ring-0)的ENCLS函數(shù)用于構(gòu)建這些私有的代碼和數(shù)據(jù)區(qū)域。非特權(quán)級(ring-3)的ENCLU函數(shù)允許應(yīng)用程序進(jìn)入并在這些私有的代碼和數(shù)據(jù)區(qū)域內(nèi)執(zhí)行。Enclave只能通過一組固定的入口點(diǎn)進(jìn)入。每個(gè)入口點(diǎn)一次只能容納一個(gè)硬件線程。當(dāng)使用ENCLS函數(shù)從常規(guī)二進(jìn)制文件加載enclave時(shí),只有enclave內(nèi)部的線程可以訪問其內(nèi)存。支持SGX2的系統(tǒng)還支持對已初始化的enclave進(jìn)行更改和刪除頁面。TDX利用了SGX提供的遠(yuǎn)程認(rèn)證機(jī)制來進(jìn)行遠(yuǎn)程認(rèn)證。值得注意的是,Intel SPR CPU是需要Intel SGX的輔助才能完成遠(yuǎn)程認(rèn)證的。但是對于后續(xù)的Intel CPU,并不一定會用到SGX。Intel SPR CPU的下一代是 Intel EMR CPU,再往后一代是Intel DMR CPU。Intel EMR 的TDX 還是需要啟用SGX,并且每個(gè)socket需要預(yù)留128MB的內(nèi)存用于SGX PRM。從Intel DMR之后,TDX的認(rèn)證不依賴于SGX,而是基于S3M(Secure SoftwareStack Memory)。然而,TDX仍然需要為TDX模塊預(yù)留內(nèi)存,但這時(shí)每個(gè)插槽只需要32-48MB基于以上三種技術(shù),Intel TDX 建立了TDX Module。
3. TDX Module的軟件實(shí)現(xiàn)原理
下面,我們解釋TDX的系統(tǒng)架構(gòu)、內(nèi)存保護(hù)機(jī)制、I/O模型、認(rèn)證以及未來計(jì)劃服務(wù)于大模型和AI的功能。
3.1. 系統(tǒng)架構(gòu)
TDX模塊提供了兩組接口函數(shù):面向啟用了TDX的虛擬化監(jiān)視程序的主機(jī)端接口函數(shù)和面向TD的客戶端接口函數(shù)。TDX模塊加載和執(zhí)行在SEAM RANGE中,這是由UEFI/BIOS保留的系統(tǒng)內(nèi)存部分。P-SEAM Loader也位于SEAM RANGE中,用于安裝和更新TDX模塊。安全仲裁模式(SEAM)是VMX架構(gòu)的擴(kuò)展,提供了兩種新的執(zhí)行模式:SEAM VMX根模式和SEAM VMX非根模式。啟用了TDX的虛擬化監(jiān)視程序在傳統(tǒng)的VMX根模式下運(yùn)行,并使用SEAMCALL指令調(diào)用TDX模塊的主機(jī)端接口函數(shù)(函數(shù)名稱以TDH開頭)。執(zhí)行SEAMCALL指令時(shí),邏輯處理器從VMX根模式轉(zhuǎn)換為SEAM VMX根模式,并開始執(zhí)行TDX模塊內(nèi)的代碼。一旦TDX模塊完成任務(wù),通過執(zhí)行SEAMRET指令返回到虛擬化監(jiān)視程序中的VMX根模式。另一方面,TD在SEAM VMX非根模式下運(yùn)行。TD可以通過TD退出或調(diào)用TDCALL指令陷入TDX模塊。在這兩種情況下,邏輯處理器從SEAM VMX非根模式轉(zhuǎn)換為SEAM VMX根模式,并在TDX模塊的上下文中開始執(zhí)行。處理TDCALL的客戶端接口函數(shù)的名稱以TDG開頭。
3.2. 內(nèi)存保護(hù)機(jī)制
TDX利用VMX的安全保密模式(SEAM)來強(qiáng)制執(zhí)行TD的內(nèi)存隔離。安全保密模式(SEAM)是虛擬機(jī)擴(kuò)展(VMX)架構(gòu)的擴(kuò)展,定義了一個(gè)稱為SEAM根的新的VMX根模式。SEAM根模式用于托管經(jīng)過CPU驗(yàn)證的模塊,使其能夠創(chuàng)建作為來賓VM的可信域(TD)。與傳統(tǒng)的虛擬機(jī)類似,TD無法訪問其他安全域(如SMM、hypervisor、TDX模塊和其他虛擬機(jī)/TD)的內(nèi)存。使用VMX,hypervisor維護(hù)擴(kuò)展頁表(EPT)來實(shí)施內(nèi)存隔離。然而,由于不再信任hypervisor,TDX將內(nèi)存管理的任務(wù)轉(zhuǎn)移到了TDX模塊上,該模塊控制TD私有內(nèi)存的地址轉(zhuǎn)換。TDX用共享來賓物理地址(GPA)用于幫助TD訪問共享內(nèi)存。安全擴(kuò)展頁表(secure EPT)用于翻譯私有GPA,確保地址翻譯的完整性,并防止從共享內(nèi)存中獲取TD代碼。目前的目標(biāo)是使用TD專用密鑰對私有內(nèi)存訪問進(jìn)行加密和保護(hù),提升安全性。物理地址元數(shù)據(jù)表(PAMT)用于跟蹤頁面分配、頁面初始化和翻譯旁路緩沖區(qū)(TLB)的一致性。
TDX內(nèi)存分為兩類:私有內(nèi)存和共享內(nèi)存。私有內(nèi)存受到完整的TDX保護(hù),僅虛擬化監(jiān)視程序可以訪問其內(nèi)容。共享內(nèi)存用于虛擬機(jī)與虛擬化監(jiān)視程序之間的共享,并不具備完整的TDX保護(hù)。TDX利用MKTME對TD的私有內(nèi)存和其元數(shù)據(jù)進(jìn)行加密。多密鑰全內(nèi)存加密(MKTME)是一個(gè)引擎,旨在使用AES-128-XTS提供內(nèi)存加密,實(shí)現(xiàn)全面的數(shù)據(jù)保護(hù)。MKTME負(fù)責(zé)通過內(nèi)存控制器對通過內(nèi)存?zhèn)鬟f的數(shù)據(jù)進(jìn)行透明的內(nèi)存加密和解密。TDX模塊在寫入內(nèi)存時(shí)對特定的緩存行編程,以使用MKTME加密所需的密鑰。這些密鑰與嵌入在物理地址中的HKID相關(guān)聯(lián)。MKTME解碼HKID,并使用引用的加密密鑰執(zhí)行加密操作。在TDX中,MKTME用TD Owner位與一個(gè)內(nèi)存段(對應(yīng)一個(gè)緩存行)相關(guān)聯(lián)。TD Owner位存儲在與這些段相關(guān)聯(lián)的錯(cuò)誤校正碼(ECC)內(nèi)存中。TDX模塊通過將私有HKID附加到物理地址來控制將物理內(nèi)存頁面轉(zhuǎn)換為安全內(nèi)存。HKID編碼在物理地址的高位。私有HKID的集合由TDX控制,只能用于TD和TDX模塊。當(dāng)內(nèi)存控制器寫入具有私有HKID的物理地址時(shí),它將TD Owner位設(shè)置為1。當(dāng)寫入沒有私有HKID的地址時(shí),它將清除TD Owner位。每個(gè)緩存行讀取時(shí)都會執(zhí)行訪問控制。讀取請求經(jīng)過內(nèi)存控制器,只有在SEAM模式下執(zhí)行的進(jìn)程才能讀取TD Owner位設(shè)置為1的緩存行。任何非SEAM模式的讀取請求在嘗試讀取此類緩存行時(shí)將收到全零數(shù)據(jù)。在構(gòu)建TD時(shí),不受信任的hypervisor從普通內(nèi)存中選擇內(nèi)存頁面以成為安全內(nèi)存的一部分。TDX模塊逐漸將這些頁面移動(dòng)到安全內(nèi)存中,并將其用于每個(gè)個(gè)體TD的元數(shù)據(jù)和主內(nèi)存。在這些頁面可以用于主內(nèi)存之前,TD必須明確接受它們。TDX模塊通過維護(hù)一個(gè)物理地址元數(shù)據(jù)表(Physical Address Metadata Table,PAMT)來執(zhí)行安全內(nèi)存設(shè)置的完整性檢查。Guest VM訪問共享內(nèi)存需要通過TD虛擬機(jī)的許可,訪問共享內(nèi)存是通過TDCALL完成的。TDCALL會觸發(fā)Linux讀取 #VE info 結(jié)構(gòu)(TDG.VP.VEINFO.GET), 之后,TD虛擬機(jī)通過頁表項(xiàng)中的一位來選擇私有或共享模式。共享映射的內(nèi)容由Hypervisor完全控制。虛擬機(jī)應(yīng)該只使用共享映射與虛擬化監(jiān)視程序進(jìn)行通信。在啟動(dòng)時(shí),所有的TDX客戶機(jī)內(nèi)存都是私有的。TD虛擬機(jī)利用現(xiàn)有的內(nèi)存加密輔助函數(shù)實(shí)現(xiàn)私有和共享之間的轉(zhuǎn)換。set_memory_decrypted()函數(shù)將一段頁面范圍轉(zhuǎn)換為共享狀態(tài),而set_memory_encrypted()函數(shù)將內(nèi)存重新轉(zhuǎn)換為私有狀態(tài)。
3.3. I/O模型
在Linux中針對TDX的客戶機(jī)支持中,所有MMIO區(qū)域和DMA緩沖區(qū)都被映射為TD內(nèi)的共享內(nèi)存。Linux客戶機(jī)必須使用SWIOTLB在統(tǒng)一位置分配和轉(zhuǎn)換DMA緩沖區(qū),以防止來自I/O的惡意輸入。驅(qū)動(dòng)程序(如virtio_net、virtio_console、virtio_blk、9pnet_virtio、virtio_vsock)是共享內(nèi)存的主要調(diào)用者。TD虛擬機(jī)通過改進(jìn)的SWIOTLB函數(shù)和ioremap()函數(shù)將內(nèi)存在啟動(dòng)時(shí)轉(zhuǎn)換為共享狀態(tài),用于處理DMA緩沖區(qū)。對于一致性內(nèi)存,TD虛擬機(jī)使用force_dma_unencrypted()函數(shù)強(qiáng)制取消DMA緩沖區(qū)的加密狀態(tài)。虛擬設(shè)備的內(nèi)存映射IO(MMIO)實(shí)現(xiàn)為共享內(nèi)存。Guest VM在訪問設(shè)備的MMIO區(qū)域時(shí)必須小心,除非已準(zhǔn)備好處理#VE異常。通常情況下,TDX中的MMIO區(qū)域會在客戶機(jī)中觸發(fā)#VE異常。然后,客戶機(jī)的#VE處理程序會在客戶機(jī)內(nèi)部對MMIO指令進(jìn)行模擬,并將其轉(zhuǎn)換為對主機(jī)的受控TDCALL,而不是將客戶機(jī)狀態(tài)暴露給主機(jī)。通過其他方式(如overlay)進(jìn)行的MMIO訪問可能會導(dǎo)致OOPS錯(cuò)誤。
3.4. 認(rèn)證
在啟用TDX的機(jī)器上,驗(yàn)證者在TD內(nèi)操作,并負(fù)責(zé)處理遠(yuǎn)程驗(yàn)證請求。當(dāng)來自挑戰(zhàn)者(如租戶)的請求到達(dá)時(shí),驗(yàn)證者通過生成TD報(bào)告提供TD正確實(shí)例化的證據(jù)。該報(bào)告作為證據(jù)由TDX模塊生成,并由報(bào)告托管區(qū)簽名。它包含了TDX的TCB(可信計(jì)算基)和加載在TD中的軟件組件的測量結(jié)果。報(bào)告還包括由Intel頒發(fā)的證書作為錨定的證書鏈。在收到報(bào)告后,挑戰(zhàn)者通過檢查報(bào)告并確定驗(yàn)證者是否在真正的啟用TDX的平臺上運(yùn)行,并且TD是否具有預(yù)期的軟件測量結(jié)果來驗(yàn)證其真實(shí)性。如果報(bào)告成功驗(yàn)證,挑戰(zhàn)者可以繼續(xù)與驗(yàn)證者建立安全通道或向驗(yàn)證者發(fā)布秘密信息。
3.5. 未來計(jì)劃的功能
Linux社區(qū)除了CPU上的機(jī)密計(jì)算, 還計(jì)劃支持GPU上的機(jī)密計(jì)算。以及CPU GPU 協(xié)同合作時(shí)候的機(jī)密計(jì)算。微軟與NVIDIA合作,在Azure上引入GPU加速的機(jī)密計(jì)算。目前,Nvidia A100 部分支持TEE的功能,并可以和Intel SGX共同協(xié)作,提供CPU GPU協(xié)同工作的機(jī)密虛擬機(jī)。H100的TEE功能由Nvidia官方全面支持。NVIDIA和微軟將GPU加速計(jì)算與機(jī)密計(jì)算相結(jié)合,借助NVIDIA A100 Tensor Core GPU中的Ampere Protected Memory (APM)支持和硬件保護(hù)的虛擬機(jī), 用于先進(jìn)的人工智能工作負(fù)載, 使得企業(yè)將能夠使用敏感數(shù)據(jù)集訓(xùn)練和部署更準(zhǔn)確的模型。APM在數(shù)據(jù)通過PCIe總線從CPU傳輸?shù)紾PU或從GPU傳輸?shù)紺PU時(shí),使用由NVIDIA設(shè)備驅(qū)動(dòng)程序和GPU之間安全交換的密鑰對數(shù)據(jù)進(jìn)行加密。數(shù)據(jù)解密僅在GPU內(nèi)部的硬件保護(hù)、隔離環(huán)境或GPU內(nèi)的隔離區(qū)域中進(jìn)行,這樣可以對數(shù)據(jù)進(jìn)行處理,用于訓(xùn)練AI模型或提供AI推理結(jié)果。與其他Azure機(jī)密計(jì)算解決方案類似,NVIDIA A100 GPU中的APM功能支持基于NVIDIA在制造過程中分配的唯一GPU身份的加密證明。使用遠(yuǎn)程證明,組織可以獨(dú)立驗(yàn)證GPU的安全狀態(tài),并確保他們的數(shù)據(jù)僅在GPU的機(jī)密隔離區(qū)域內(nèi)進(jìn)行處理。此外,Nvidia還和Linux社區(qū)合作, 從 Linuxv6.3 開始支持Nvidia H100 TEE。
4. TDX的hypervisor實(shí)現(xiàn)
如果要寫一個(gè)針對TDX的hypervisor,要搞清楚其TDX加載過程,接著解釋了TDX物理和線性內(nèi)存布局,TD 的內(nèi)存管理,以及跨安全域進(jìn)行上下文切換。下面,我們詳細(xì)解釋這一部分。
4.1. TDX 加載和初始化
TDX 模塊的工作主要是三塊兒,TD dispatch, VMM dispatch 和 TD transition. TDX 加載開始于加載Intel Non-Persistent SEAM Loader(NP-SEAM Loader)。NP-SEAM Loader是一個(gè)Intel認(rèn)證代碼模塊(ACM)。ACM是在處理器的內(nèi)部RAM中運(yùn)行的由Intel簽名的模塊。NP-SEAM Loader由Intel可信執(zhí)行技術(shù)(TXT)通過GETSEC[ENTERACCS]函數(shù)進(jìn)行認(rèn)證和加載。NP-SEAMLoader包含了Intel持久性SEAM Loader(P-SEAM Loader)的映像,然后由NP-SEAM Loader進(jìn)行驗(yàn)證和加載。P-SEAM Loader負(fù)責(zé)安裝或更新TDX模塊。P-SEAM Loader和TDX模塊都加載在SEAM RANGE中,該范圍是通過UEFI/BIOS保留的系統(tǒng)內(nèi)存的一部分。范圍的基地址和大小由IA32_SEAMRR_PHYS_BASE和IA32_SEAMRR_PHYS_MASK MSR指定。該范圍被劃分為Module_Range用于TDX模塊和P_SEAMLDR_Range用于P-SEAM Loader。這兩個(gè)模塊在SEAM VMX根模式下運(yùn)行,并使用SEAMCALL / SEAMRET與外部軟件進(jìn)行交互。NP-SEAM Loader、P-SEAM Loader和TDX模塊均由Intel提供和簽名,建立了一個(gè)信任鏈來引導(dǎo)TDX模塊的啟動(dòng)。P-SEAM Loader提供了一個(gè)SEAMCALL接口函數(shù)seamldr_install,用于加載TDX模塊。TDX模塊的映像預(yù)先加載到一個(gè)內(nèi)存緩沖區(qū)中(不在SEAM RANGE內(nèi))。緩沖區(qū)的物理地址和seam_sigstruct(TDX模塊的簽名)作為參數(shù)傳遞給seamldr_install函數(shù)。seam_sigstruct包含TDX模塊的哈希值和安全版本號(SVN),每個(gè)邏輯處理器(LP)堆棧頁的數(shù)量,每個(gè)LP數(shù)據(jù)頁的數(shù)量以及全局?jǐn)?shù)據(jù)頁的數(shù)量。這些數(shù)字由seamldr_install函數(shù)用于確定TDX模塊各個(gè)內(nèi)存區(qū)域的物理/線性地址和大小。所有邏輯處理器(LPs)按順序調(diào)用seamldr_install,在每個(gè)LP上,seamldr_install會檢查LP是否已經(jīng)處于由其他LP開始的安裝會話中,并清除LP的VMCS緩存。最后一個(gè)LP會檢查seamldr_install的參數(shù),驗(yàn)證各個(gè)模塊的簽名,在SEAM RANGE中確定TDX模塊各個(gè)內(nèi)存區(qū)域的物理和線性地址以及大?。捍a、數(shù)據(jù)、堆棧、頁表、sysinfo_table、keyhole和keyhole-edit,將區(qū)域的物理地址映射到其線性地址,將TDX模塊的二進(jìn)制映像加載到SEAMRANGE中,設(shè)置TDX模塊的sysinfo_table,在每個(gè)LP上設(shè)置SEAM Transfer VMCS。最后,在P-SEAM Loader的數(shù)據(jù)區(qū)域記錄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模塊進(jìn)行全局初始化。然后,虛擬化管理程序?qū)γ總€(gè)邏輯處理器(LP)進(jìn)行SEAMCALL[TDH.SYS.LP.INIT] 調(diào)用,以檢查和初始化每個(gè)LP的參數(shù),比如keyhole,數(shù)據(jù)區(qū)域和堆棧區(qū)域。接下來,虛擬化管理程序分配一個(gè)全局私有HKID,并通過SEAMCALL[TDH.SYS.CONFIG]將其傳遞給TDX模塊,該調(diào)用還初始化了Trust DomainMemory Region (TDMR)。每個(gè)處理器套件上的 SEAMCALL[TDH.SYS.KEY.CONFIG] 生成一個(gè)TDX全局私有密鑰,并將該密鑰與該HKID綁定。該密鑰用于加密存儲每個(gè)TD的Physical AddressMetadata Table (PAMT)和Trust Domain Root (TDR)的內(nèi)存。最后,虛擬化管理程序多次調(diào)用SEAMCALL[TDH.SYS.TDMR.INIT]逐步初始化每個(gè)TDMR的PAMT。TDMR里面存了每個(gè)TD(Trust Domain)的元數(shù)據(jù), 包括Trust Domain Root(TDR),Trust Domain Control Structure(TDCS),Trust Domain Virtual Processor State(TDVPS)和 Secure EPT(SEPT)。
4.2. TDX物理和線性內(nèi)存布局
TDX模塊在Module_Range內(nèi)的物理內(nèi)存布局如下所示。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TDX 的物理內(nèi)存布局圖,參考https://www.intel.com/content/www/us/en/developer/articles/technical/intel-trust-domain-extensions.html TDX 的物理內(nèi)存布局以一個(gè)4 KB的頁面開始,該頁面保存TDX模塊的sysinfo_table。sysinfo_table包含由NP-SEAM Loader的MCHECK填充的2 KB平臺信息,以及由P-SEAM Loader填充的下一個(gè)2 KB,其中包含TDX模塊的信息,如SEAM RANGE的基地址和大小、內(nèi)存區(qū)域的基線性地址、LP數(shù)量和私有HKID的范圍。在sysinfo_table之后,是每個(gè)LP的VMCS區(qū)域。每個(gè)LP都有一個(gè)4 KB的SEAM Transfer VMCS。在每個(gè)LP的VMCS區(qū)域之后,是數(shù)據(jù)區(qū)域,該區(qū)域被劃分為每個(gè)LP的數(shù)據(jù)區(qū)域和全局?jǐn)?shù)據(jù)區(qū)域。接下來是TDX模塊的4級頁表,然后是每個(gè)LP的堆棧區(qū)域,最后是TDX模塊的可執(zhí)行代碼區(qū)域。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TDX 的線性內(nèi)存布局圖,參考https://www.intel.com/content/www/us/en/developer/articles/technical/intel-trust-domain-extensions.html ? TDX模塊維護(hù)一個(gè)頁表來進(jìn)行地址轉(zhuǎn)換, 并維護(hù)自己的線性內(nèi)存布局。上圖展示了TDX模塊線性地址空間的布局,該布局由P-SEAM Loader通過構(gòu)建TDX模塊的頁表來建立。為了防止內(nèi)存破壞攻擊,P-SEAM Loader對線性地址的第34到46位進(jìn)行隨機(jī)化處理,并把區(qū)域的線性地址和大小記錄在sysinfo_table的字段中。
4.3. TD 的內(nèi)存管理
TD的內(nèi)存管理定義在TDX module的vmm dispatcher API 里面。TDX 上有兩類memory,E820和Convertible memory range (CMR)。E820 由BIOS設(shè)置,是host內(nèi)核可用內(nèi)存范圍。CMR是可轉(zhuǎn)換內(nèi)存范圍用于TD來賓私有頁面,相當(dāng)于SGX的EPC, 由TDX Module設(shè)置。CMR里面有一段叫做Trust Domain Memory Region(TDMR),由VMM配置。在TDMR里面又一段叫做PhysicalAddress Metadata Table(PAMT , AKA 物理地址元數(shù)據(jù)表),是TDMR的一個(gè)子集,是用來強(qiáng)制執(zhí)行額外的屬性。具體來說,TDs(可信域)可以訪問兩類內(nèi)存 。私有內(nèi)存用于保存TD的機(jī)密數(shù)據(jù),共享內(nèi)存用于與不受信任的外部實(shí)體進(jìn)行通信。TD的私有內(nèi)存通過為該TD分配的獨(dú)特的、臨時(shí)的內(nèi)存加密密鑰,提高了加密的機(jī)密性和完整性保護(hù)。除了私有內(nèi)存和共享內(nèi)存, TD客戶環(huán)境中的內(nèi)存可以未接受的內(nèi)存或者內(nèi)存映射的I/O(MMIO)。
● 私有內(nèi)存 - TD一般將其所有私有代碼和數(shù)據(jù)定位在使用私有GPA映射的私有內(nèi)存中。TD分配的私有密鑰有助于對使用“共享”位設(shè)置為0的GPA的所有內(nèi)存訪問進(jìn)行加密和保護(hù)完整性。所有使用“共享”位設(shè)置為1的GPA的共享內(nèi)存訪問可能會使用由虛擬機(jī)管理的共享密鑰進(jìn)行加密和保護(hù)完整性。私有內(nèi)存由VMM通過SEAMCALL[TDH.MEM.PAGE.ADD]或TDVF通過TDCALL[TDG.MEM.PAGE.ACCEPT]創(chuàng)建,頁面表中的S位清除。
● 共享內(nèi)存 - 共享內(nèi)存用于與TD外部的代理進(jìn)行通信,以執(zhí)行諸如網(wǎng)絡(luò)訪問、存儲服務(wù)、調(diào)用虛擬化服務(wù)等I/O操作。共享內(nèi)存在客戶物理地址(GPA)中,最高位被指定為“共享”位,用于指示該GPA是否映射私有內(nèi)存(當(dāng)“共享”位為0時(shí))或映射共享內(nèi)存(當(dāng)“共享”位為1時(shí))。共享內(nèi)存由VMM通過SEAMCALL[TDH.MEM.PAGE.ADD]或TDVF通過TDCALL[TDG.MEM.PAGE.ACCEPT]創(chuàng)建,頁面表中的S位設(shè)置。
● 未接受的內(nèi)存 - 由VMM通過SEAMCALL[TDH.MEM.PAGE.AUG]創(chuàng)建,但尚未被TDVF接受。
● 內(nèi)存映射的I/O(MMIO) - 通過TDVF通過TDVMCALL<#VE.RequestMMIO>訪問的共享內(nèi)存。
Intel-TDX模塊提供安全EPT管理功能給虛擬機(jī)管理器(VMM),用于向安全EPT添加或刪除映射,并通過執(zhí)行安全策略來維護(hù)內(nèi)存布局的完整性。用于構(gòu)建安全EPT的內(nèi)存被設(shè)計(jì)為使用唯一的、每個(gè)TD的內(nèi)存加密密鑰進(jìn)行加密和完整性保護(hù)。CPU會阻止TD將頁表結(jié)構(gòu)和可執(zhí)行代碼定位在共享內(nèi)存中。如果代碼獲取或頁表訪問位于共享內(nèi)存中,CPU會引發(fā)頁故障(#PF)。Intel-TDX模塊pamt_get_block利用物理地址元數(shù)據(jù)表(Physical-Address-Metadata Table,PAMT) 來確保映射到TD的安全EPT的頁面不能映射到其他任何TD的安全EPT中。PAMT作為一個(gè)跟蹤數(shù)據(jù)結(jié)構(gòu),幫助確保頁面只能在安全EPT中映射到一個(gè)GPA。它提供給VMM函數(shù)來向安全EPT添加4K, 2M或1G的映射。PAMT還跟蹤頁面大小和類型,以確保在從安全EPT中取消映射頁面時(shí)進(jìn)行正確的TLB失效操作。這有助于維護(hù)內(nèi)存映射的完整性和一致性。當(dāng)使用安全EPT或共享EPT進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換時(shí),這些轉(zhuǎn)換會被緩存到CPU的TLB(Translation Lookaside Buffer)中。TLB為每個(gè)轉(zhuǎn)換關(guān)聯(lián)一個(gè)標(biāo)簽,以標(biāo)識創(chuàng)建該轉(zhuǎn)換的TD。這樣可以實(shí)現(xiàn)高效的地址轉(zhuǎn)換,并減少重復(fù)轉(zhuǎn)換操作的開銷?;诎踩獷PT的地址轉(zhuǎn)換架構(gòu)支持將大頁映射到安全/共享EPT,并在適當(dāng)?shù)那闆r下將轉(zhuǎn)換緩存為大頁。TD的地址轉(zhuǎn)換
lock_sept_check_and_walk_private_gpa -> lock_sept_check_and_walk_any_gpa ->secure_ept_walk 遵循類似于傳統(tǒng)虛擬機(jī) two-level page walk。因此,在地址轉(zhuǎn)換方面,TD中的軟件和傳統(tǒng)虛擬機(jī)中軟件開銷差不多。在TD執(zhí)行時(shí),虛擬機(jī)管理器(VMM)通過擴(kuò)展頁表(EPT)幫助為TD分配和映射使用的內(nèi)存到TD的GPA,提供GPA到物理地址(PA)的轉(zhuǎn)換。在TD執(zhí)行時(shí)會有兩個(gè)EPT用于TD:一個(gè)安全EPT用于提供私有GPA到PA的轉(zhuǎn)換,以及一個(gè)共享EPT用于提供共享GPA到PA的轉(zhuǎn)換。信任域(TD)使用的客戶物理內(nèi)存由TD私有密鑰或基于GPA共享位(基于GPAW的GPA )進(jìn)行加密。TD操作系統(tǒng)可以在Host虛擬機(jī)管理器(VMM)配置的固定私有GPA空間上運(yùn)行。通常,Host OS會管理物理頁框數(shù)據(jù)庫,用于記錄(客戶)物理內(nèi)存分配的狀態(tài)。為了避免為大量共享GPA空間擴(kuò)展頁框數(shù)據(jù)庫,TD操作系統(tǒng)可以通過管理物理內(nèi)存狀態(tài)屬性來指示是否使用TD私有密鑰或VMM密鑰對其進(jìn)行加密。然后,TD客戶操作系統(tǒng)可以使用TDG.VP.VMCALL(MapGPA) 在固定的GPA映射內(nèi)請求Host虛擬機(jī)管理器(VMM)將GPA范圍映射為私有或共享內(nèi)存映射, 或者共享I/O內(nèi)存的別名映射到該GPA空間中的共享內(nèi)存。此API還可用于將頁面映射從私有轉(zhuǎn)換為共享。在此操作中傳遞的GPA范圍可以通過起始地址中的GPA.Shared位來指示映射是請求用于共享內(nèi)存還是私有內(nèi)存。例如,為了與VMM交換數(shù)據(jù),TD可以使用此TDG.VP.VMCALL請求將GPA范圍映射為共享內(nèi)存(例如,用于半虛擬化IO)通過共享EPT。如果指定的起始GPA是私有GPA(GPA.S位清除),則此MapGPA TDG.VP.VMCALL可以用于請求HostVMM映射特定的私有頁面(該映射可能涉及將支持物理頁從共享頁轉(zhuǎn)換為私有頁)。在這種情況下, VMM必須將GPA從共享EPT區(qū)域取消映射,并使TD VCPU的TLB和緩存無效,刷新TLB和緩存,并刪除映射,以確保不存在陳舊的映射。類似地,如果共享頁已分配給任何設(shè)備用于IO,那么VMM應(yīng)使IOTLB無效并清除任何待處理的IO事務(wù)(例如,通過排隊(duì)等待描述符)以刪除IO側(cè)的陳舊映射。然后,應(yīng)刷新所有數(shù)據(jù)緩存的內(nèi)容。具體流程是,VMM可以選擇私有GPA空間的一個(gè)頁面,并用TDG.VP.VMCALL(MapGPA),并將GPA.S=1進(jìn)行映射。VMM可以使用TDH.MEM.RANGE.BLOCK, TDH.MEM.TRACK和TDH.MEM.SEPT.REMOVE從S-EPT映射中移除受影響的GPA。VMM可以使用直接內(nèi)存存儲重新獲取該頁面,并在由VMM管理的共享EPT中為TD操作系統(tǒng)映射共享GPA的別名。稍后,TD操作系統(tǒng)可能需要將GPA用作私有頁,通過使用相同的TDG.VP.VMCALL(MapGPA),其中GPA被指定為私有GPA(GPA.S=0),來請求HostVMM將該頁面與共享EPT解除關(guān)聯(lián),并執(zhí)行TDH.MEM.PAGE.AUG以為私有GPA設(shè)置待處理EPT映射。成功完成TDG.VP.VMCALL流程后,TD客戶可以使用TDG.MEM.PAGE.ACCEPT來重新初始化該頁,使用TD私有密鑰,并將S-EPT映射標(biāo)記為活動(dòng)狀態(tài)。
4.4. 跨安全域進(jìn)行上下文切換
TDX有兩種類型的上下文切換:(1)hypervisor和TDX模塊之間,(2)TD和TDX模塊之間。Hypervisor 通過SEAMCALL接口函數(shù)與TDX模塊進(jìn)行交互, 處理器從VMX根模式轉(zhuǎn)換到SEAMVMX根模式,加載TDX模塊的SEAM Transfer VMCS。在Module_Range中,SEAM TransferVMCS區(qū)域的位置和布局從SEAMRR_Base開始。Module_Range的第一個(gè)4 KB頁面是sysinfo_table。從SEAMRR_Base + 4 KB開始,有一個(gè)由每個(gè)LP的SEAM Transfer VMCS區(qū)域組成的數(shù)組。每個(gè)區(qū)域是一個(gè)4 KB頁面。這個(gè)數(shù)組以LP的標(biāo)識符(LP_ID)作為索引。當(dāng)執(zhí)行SEAMCALL指令時(shí),處理器根據(jù)當(dāng)前的LP_ID來搜索VMCS地址。地址的確定方式是:SEAMRR_Base + 4 KB + (LP_ID × 4 KB)。TDX模塊的狀態(tài)存儲在VMCS的主機(jī)狀態(tài)區(qū)域中。主機(jī)RIP被設(shè)置為TDX模塊的tdx_seamcall_entry_point,主機(jī)CR3被設(shè)置為TDX模塊PML4基址的物理地址。此外,主機(jī)FS_BASE被設(shè)置為sysinfo_table的線性地址,主機(jī)GS_BASE被設(shè)置為每個(gè)LP的數(shù)據(jù)區(qū)域的線性地址。當(dāng)LP通過SEAMCALL指令轉(zhuǎn)換到TDX模塊時(shí),存儲在SEAM Transfer VMCS中的信息被加載到處理器中。因此,F(xiàn)S_BASE和GS_BASE現(xiàn)在分別指向TDX模塊的sysinfo_table和本地?cái)?shù)據(jù)區(qū)域。CR3寄存器指向TDX模塊的頁表,從而將內(nèi)存管理單元(MMU)切換到TDX模塊的線性地址空間。TDX模塊開始處理SEAMCALL并將其分派給相應(yīng)的接口函數(shù)。
在TDX虛擬化實(shí)現(xiàn)中,同步的TDCALL或異步的TD退出被設(shè)計(jì)為陷入TDX模塊。這由TD TransferVMCS控制,在創(chuàng)建TD的虛擬CPU時(shí)設(shè)置,并存儲在TD的TDVPS中。TDVPS使用TD的私鑰進(jìn)行加密。因此,TD Transfer VMCS對于不受信任的hypervisor是不可訪問的。當(dāng)TD調(diào)用TDCALL或觸發(fā)TD退出時(shí),LP加載存儲在TD Transfer VMCS中的TDX模塊的狀態(tài)以進(jìn)行上下文切換。某些TD退出需要hypervisor來輔助模擬某些操作,如端口I/O、HLT、CPUID等等。所有的TD退出首先陷入TDX模塊,TDX模塊向TD注入一個(gè)虛擬化異常(VE)來處理退出。TD的客戶機(jī)內(nèi)核包含一個(gè)相應(yīng)的VE處理程序,該處理程序準(zhǔn)備了一個(gè)最小化的參數(shù)集,并調(diào)用TDCALL重新進(jìn)入TDX模塊。此時(shí),TDX模塊可以安全地要求hypervisor處理請求,最小化地暴露敏感信息。
5. 總結(jié)
綜上所述,Intel Trust Domain Extensions (Intel TDX) 可以用于部署硬件隔離的虛擬機(jī)(VM)稱為Trust Domains(TDs)。Intel TDX的設(shè)計(jì)目的是將TD虛擬機(jī)與虛擬機(jī)管理器(VMM)、Hypervisor和主機(jī)平臺上的其他非-TD軟件進(jìn)行隔離。Intel TDX模塊利用專門為Intel TDX設(shè)計(jì)的指令集架構(gòu),同時(shí)借助系統(tǒng)芯片(SoC)中的MKTME(Multi-Key Total Memory Encryption)引擎的支持。該模塊充當(dāng)主機(jī)虛擬機(jī)管理器(VMM)和客戶端Trust Domains(TDs)之間的中間層。TDs需要使用Guest-Host-Communication Interface(GHCI)與Intel TDX模塊和主機(jī)VMM進(jìn)行通信。GHCI提供了一種標(biāo)準(zhǔn)化的方法,供TDs與Intel TDX模塊進(jìn)行交互,并與主機(jī)VMM交換信息。通過利用指令集架構(gòu)和MKTME引擎以及GHCI,Intel TDX模塊促進(jìn)了TDs與主機(jī)VMM之間的安全通信和協(xié)調(diào),確保了TDs與底層平臺的隔離和保護(hù)。Intel TDX可用于增強(qiáng)保密計(jì)算,通過幫助保護(hù)TD免受各種軟件攻擊,同時(shí)有助于減少TD的可信計(jì)算基礎(chǔ)(TCB)。
責(zé)任編輯:彭菁
-
Linux
+關(guān)注
關(guān)注
87文章
11212瀏覽量
208723 -
計(jì)算
+關(guān)注
關(guān)注
2文章
442瀏覽量
38705 -
模型
+關(guān)注
關(guān)注
1文章
3116瀏覽量
48661
原文標(biāo)題:Linux對機(jī)密計(jì)算的支持
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論