安全虛擬化SEV簡單介紹

什麼是SEV

SEV是由AMD提出的安全虛擬化Secure Encrypted Virtualization技術的英文首字母的縮寫。簡單來說就是主內存控制器具備了加密功能可以對虛擬機內存數據進行保護。在真正介紹SEV之前,我們首先要弄清楚兩個關鍵的基本概念:SVM、SME。下面先簡單瞭解一下SVM和SME。

什麼是SVM

SVM即AMD Secure Virtual Machine的縮寫。這是由AMD提供的虛擬化技術,用來X86上支持基於硬件的虛擬化技術,通過硬件提供的輔助加速功能,可以有效提高虛擬化性能。Intel也提供了與之對應的虛擬機技術及VT-x。
爲了支持虛擬化技術,AMD虛擬機框架做了以下設計:

  1. 提供VMM(即Hypervisor)和Guest(即虛擬機)之間的快速切換機制。
  2. 攔截虛擬機中特定指令和事件的能力。
  3. 對內存提供外部(DMA)訪保護。
  4. 輔助中斷處理和虛擬中斷(Virtual Interrupt)支持。
  5. 對屬於Guest和Host(宿主機)的TLB使用標籤來減少虛擬化的開銷。

關於SVM技術的更多細節本文不展開介紹,有興趣的同學可以查看AMD APM卷二的第15章。這裏對上面列出的五項內容稍微說明一下:

  1. 硬件虛擬化,簡單點說就是虛擬機的代碼指令能夠在宿主機上運行直接運行,無需進行軟件轉換或者翻譯。但是,硬件(主要是CPU)需要維護Hypervisor和Guest的運行上下文環境,確保互相不產生影響。因此,AMD提供了一組虛擬化相關的指令(如VMRUN、VMSAVE、VMLOAD等等),以及定義了描述運行上下文環境的數據結構VMCB(Virtual Machine Control Block)以及VMSA(Virtual Machine Save Area)。其中VMCB供VMM配置,用來控制虛擬機的運行,包括啓動那些硬件特性、攔截那些事件或指令等等;而VMSA用來保存虛擬機運行態相關的寄存器,包括GPR、System Register等。有了這些基礎,CPU在運行虛擬機的代碼指令時就可以做到快速切換,互不影響。CPU在運行虛擬機代碼指令時會進入Guest Mode,而運行宿主機代碼時切換到Host Mode。通過模式切換,CPU內部可以很好地區分當前的運行環境,然後做出對應的處理。
  2. 宿主機CPU可以直接運行虛擬機代碼指令,但並不是任意指令都可以執行,例如IO指令(IN、OUT等),因爲沒有真實硬件的支持,所以在CPU執行某些類型的指令時,需要Hypervisor介入,進行模擬或處理。此外,還有些情況需要Guest告知Hypervisor狀態進行了轉換,由Hypervisor跟蹤以及維護虛擬機的狀態,例如系統寄存器的讀寫等。由於這些原因,需要Hypervisor可以有選擇地攔截一些指令以及事件。
  3. 主要是防止Guest或者Host通過設備訪問彼此的內容,這裏是處於安全考慮,不做過多描述。
  4. 由於Guest Mode下虛擬機缺少真正的APIC組件,因此需要支持。虛擬中斷用於向虛擬機注入中斷事件,模擬真實的中斷流程。
  5. 引入了ASID(Address Space Identifier)的概念,用來對屬於Host和Guest的TLB進行區分,從而減少開銷。對於Shadow Paging或者Nested Paging來說,Guest中切換進程時可以不用Flush TLB,即使CR3發生改變,從而減少Host和Guest的模式切換。

這裏着重提及一下Nested Paging,因爲這是實現SEV所需要的基礎之一。Nested Paging即使用兩級頁錶轉換,一級是從GVA(Guest Virtual Address)到GPA(Guest Physical Address)的轉換,標記爲gCR3,一級是從GPA到HPA(Host Physical Address)的轉換,標記爲nCR3。Host和Guest各自維護自己的CR3,gCR3由Guest自己維護,通過Guest內的#PF異常處理並更新,nCR3由Host維護,通過Host內的#NPF異常處理並更新。Nested Paging如下圖所示:

在這裏插入圖片描述

SME介紹

SME是Secure Memory Encryption的縮寫。AMD在DRAM的控制器中添加了加解密模塊,用來控制內內存數據的加密和解密,如下圖所示:
在這裏插入圖片描述

OS和Hypervisor通過頁表來控制對內存頁的加密解密。一旦SME使能,物理地址的47 bit(也稱C-bit,即enCrypted)用來標記對應內存頁是否通過加解密保護。內存頁在頁表PTE中的C-bit置1,則表示該頁面被加密。訪問該內存頁時,加密和解密過程有內存控制器自動完成,具體過程如下圖所示:
Address Mapping

有了上面的基礎,我們來簡單瞭解一下SEV的工作原理。

SEV介紹

SEV主要的思想是爲虛擬機內存進行加密保護,而且不同虛擬機之間以及宿主機不能直接讀取或者竊取到虛擬機內存數據。SEV提供的虛擬機內存數據的加密功能,可以保護虛擬機內存免受物理攻擊,跨虛擬機和來自Hypervisor的攻擊。SEV功能使能後,物理地址的43 bit至47 bit分別用來標誌ASID和C-bit,在通過頁表訪問虛擬機內存時,虛擬機的物理地址回攜帶與虛擬機對應的ASID的Tag,用來判斷是訪問哪個虛擬機的數據,或者是操作哪個虛擬機的數據。虛擬機的ASID在頁表遍歷時使用,用來區分TLB。在緩存(Cache)中,C-bit和ASID用來區分Cache Line。內存控制器中ASID用來區分虛擬機加密密鑰(VEK),由於物理地址中的ASID是由硬件自動添加,軟件無法直接修改,因此,從內存中讀取的數據由內存控制器使用與之對應的VEK進行加解密。SEV模型如下圖所示:
SEV Model

開啓SEV功能的同時,要求Host使能SME功能,且虛擬機的VMCB中開啓NPT功能,這是爲了保證Nest Paging的工作過程中C-bit的控制不被軟件干擾。由於有兩級頁表,因此會存在兩級頁表中PTE的C-bit組合,決定如何對最終的虛擬機內存頁如何進行加解密,過程如下圖所示:
在這裏插入圖片描述

雖然虛擬機內容數據被內存控制器自動加解密,但是啓動虛擬機會存在虛擬機第一條指令是如何啓動的問題,這裏就需要提到SEV的另外一個關鍵組件PSP,即AMD Platform Secure Processor,一個32 bit的微控制器(Arm® Cortex®-A5),被集成到SOC內部。PSP主要完成的關鍵操作如下:

  1. 用來管理和維護SEV虛擬機狀態以及安全信息相關的上下文,並提供一系列API。
  2. 爲SEV虛擬機配置VEK,並映射到具體的ASID。
  3. 可以加密SEV虛擬機內存數據進行加解密,以支持對Guest BIOS等啓動代碼的初始加密操作。

總結

SEV是在SVM、SME的基礎上對虛擬機進行保護提供的安全增加功能,主要完成對虛擬機內存數據的保護,其主要安全組件設計PSP和內存控制器等,更具體的細節建議查看官方白皮書以及SPEC。

參考:
1: AMD SEV官網.
2: AMD64 Architecture Programmer’s Manual Volume 2.

寫在文末

本文難免會有錯誤,如有錯誤,歡迎指出。轉載請標明出處。
作者:
Artie Ding
郵箱:
[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章