在大模型時代,模型即服務(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社區合作, 從 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內的物理內存布局如下所示。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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)。
責任編輯:彭菁
-
Linux
+關注
關注
87文章
11342瀏覽量
210154 -
計算
+關注
關注
2文章
451瀏覽量
38847 -
模型
+關注
關注
1文章
3298瀏覽量
49075
原文標題:Linux對機密計算的支持
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論