安全性

為了防止在 pVM 內執行任意有效負載,Android 虛擬化框架 (AVF) 使用分層安全方法,其中每一層都添加額外的強制措施。以下是 AVF 安全層的清單:

  • Android – Android 確保只有具有 pVM 權限的應用程式才允許建立或檢查 pVM。

  • 引導程式 – 引導程式確保僅允許 Google 或裝置供應商簽署的 pVM 映像啟動,並遵守Android 驗證啟動程式。這種架構意味著運行 pVM 的應用程式無法捆綁自己的核心。

  • pVM – pVM 為 pVM 中運行的有效負載提供深度防禦,例如使用SELinux 。深度防禦不允許將資料對應為可執行檔( neverallow execmem )並確保W^X適用於所有檔案類型。

安全模型

機密性、完整性和可用性,也稱為 CIA 三元組,是一個旨在指導資訊安全策略的模型:

  • 保密是一組限制資訊存取的規則。
  • 完整性是資訊可信賴和準確的保證。
  • 可用性是授權實體可靠存取資訊的保證。

請注意,pKVM 旨在維護訪客的機密性和完整性,但不是可用性。這些原則影響著架構各方面的設計決策,從虛擬機器管理程式到使用者空間元件。

保密和誠信

機密性源自於 pKVM 管理程式強制執行的記憶體隔離屬性。 pKVM 追蹤各個實體記憶體頁面的記憶體所有權以及所有者對共享頁面的任何請求。 pKVM 確保只有授權的 pVM(主機和來賓)才會將給定頁面對應到由管理程式控制的第 2 階段頁表中。該架構認為,pVM 擁有的記憶體內容保持私有,除非所有者明確與另一個 pVM 共享它。

維護機密性的限制還擴展到系統中代表 pVM 執行記憶體存取的任何實體,即在更高特權層中運行的具有 DMA 功能的設備和服務。 SoC 供應商必須滿足一組新的要求才能支援 pKVM,否則無法提供機密性。

完整性適用於記憶體和計算中的資料:

  • 未經同意,pVM 不能修改彼此的記憶體。
  • pVM 不能影響彼此的 CPU 狀態。

這些要求由虛擬機器管理程式強制執行。但虛擬資料儲存也會出現資料完整性問題,必須套用其他解決方案,例如 dm-verity 或 AuthFS。

這些原則與 Linux 提供的進程隔離沒有什麼不同,其中對記憶體頁面的存取是透過第一階段頁表和進程之間的核心上下文切換來控制的。然而,pKVM 的EL2 部分強制執行這些屬性,與整個Linux 核心相比,其攻擊面大約只有一半(大約1 萬行程式碼與2000 萬行程式碼),因此為過於敏感而無法依賴的用例提供了更強的保證。關於進程隔離。

鑑於其規模,pKVM 適合形式驗證。我們正在積極支持學術研究,旨在在實際的 pKVM 二進位上正式證明這些屬性。

本文檔的其餘部分涵蓋了 pKVM 周圍每個元件提供的機密性和完整性保證。

管理程式

pKVM 是一個基於 KVM 的虛擬機器管理程序,它將 pVM 和 Android 隔離到相互不信任的執行環境中。即使在任何 pVM(包括主機)內發生洩露,這些屬性仍然有效。符合 AVF 的替代虛擬機器管理程式需要提供類似的屬性。

  • pVM 無法存取屬於另一個實體(例如 pVM 或虛擬機器管理程式)的頁面,除非頁面擁有者明確共用。此規則包括主機 pVM 並適用於 CPU 和 DMA 存取。
  • 在 pVM 使用的頁面返回主機之前,例如當 pVM 被銷毀時,它會被擦除。
  • 在作業系統引導程式在後續設備啟動中運作之前,一次設備啟動的所有 pVM 和 pVM 韌體的記憶體都會被清除。
  • 當連接硬體偵錯器(例如 SJTAG)時,pVM 無法存取其先前建立的金鑰。
  • 如果 pVM 韌體無法驗證初始映像,則它不會啟動。
  • 如果instance.img的完整性受到損害,pVM 韌體將不會啟動。
  • 提供給 pVM 執行個體的開機憑證鏈 (BCC) 和複合設備識別碼 (CDI) 只能由該特定實例衍生。

訪客作業系統

Microdroid是在 pVM 中運行的作業系統的範例。 Microdroid 由基於 U-boot 的引導程式、GKI 和 Android 用戶空間的子集以及有效負載啟動器組成。即使在任何 pVM(包括主機)內發生洩露,這些屬性仍然有效。在 pVM 中運行的替代作業系統應該提供類似的屬性。

  • 如果無法驗證boot.imgsuper.imgvbmeta.imgvbmeta\_system.img Microdroid 將無法啟動。
  • 如果 APK 驗證失敗,Microdroid 將無法啟動。
  • 即使更新了 APK,同一個 Microdroid 實例也不會啟動。
  • 如果任何 APEX 驗證失敗,Microdroid 將不會啟動。
  • 如果在 guest pVM 外部修改了instance.img ,Microdroid 將不會啟動(或以乾淨的初始狀態啟動)。
  • Microdroid 提供啟動鏈證明。
  • 共享給 guest pVM 的磁碟映像的任何(未簽署)修改都會導致 pVM 端出現 I/O 錯誤。
  • 提供給 pVM 實例的 BCC 和 CDI 只能由該特定實例衍生。
  • 對加密儲存磁碟區的寫入是保密的,但是在加密區塊的粒度上沒有回滾保護。此外,對資料區塊的其他任意外部篡改會導致該區塊對 Microdroid 來說顯示為垃圾,而不是被明確檢測為 I/O 錯誤。

安卓

這些是由 Android 作為主機維護的屬性,但在主機受損的情況下並不適用:

  • 來賓 pVM 無法直接與其他來賓 pVM 互動(例如,建立 vsock 連線)。
  • 只有主機 pVM 中的VirtualizationService才能與 pVM 建立通訊通道(注意:它可以將已建立的通道傳遞給其他人)。
  • 只有使用平台金鑰簽署的應用程式才能請求建立、擁有 pVM 或與 pVM 互動的權限。
  • 用於在主機和 pVM 之間設定vsock連線的識別碼(稱為上下文識別碼 (CID))在主機 pVM 運行時不會重複使用。例如,不可能將正在運行的 pVM 替換為另一個。

可用性

在 pVM 的上下文中,可用性是指主機向來賓分配足夠的資源,以便來賓可以執行其設計執行的任務。

主機的職責包括調度 pVM 的虛擬 CPU。 KVM 與傳統的 Type-1 虛擬機器管理程式(例如 Xen)不同,它做出了明確的設計決策,將工作負載調度委託給主機核心。考慮到當今調度程序的規模和複雜性,此設計決策顯著減小了可信任運算庫 (TCB) 的規模,並使主機能夠做出更明智的調度決策以優化效能。然而,惡意主機可以選擇從不安排訪客。

同樣,pKVM 還將實體中斷處理委託給主機內核,以降低虛擬機器管理程式的複雜性並讓主機負責調度。我們努力確保來賓中斷的轉送只會導致拒絕服務(中斷太少、太多或錯誤路由)。

最後,主機的虛擬機器監視器(VMM)進程負責分配記憶體並提供虛擬設備,例如網路卡。惡意 VMM 可以扣留來賓的資源。

儘管 pKVM 不向來賓提供可用性,但該設計可以保護主機的可用性免受惡意來賓的影響,因為主機始終可以搶佔或終止來賓並回收其資源。

安全啟動

資料與 pVM 的執行個體綁定,安全啟動可確保對實例資料的存取受到控制。實例的首次啟動透過為 pVM 隨機生成秘密鹽並從載入的映像中提取詳細資訊(例如驗證公鑰和雜湊值)來配置它。此資訊用於驗證 pVM 實例的後續啟動,並確保實例的機密僅發佈到經過驗證的映像。此過程發生在 pVM 內的每個載入階段:pVM 韌體、pVM ABL、Microdroid 等。

DICE 為每個載入階段提供一個證明金鑰對,其公共部分在該階段的 BCC 條目中進行了認證。此金鑰對可以在啟動之間更改,因此也可以衍生出密封秘密,該秘密對於虛擬機器實例在重新啟動後保持穩定,因此適合保護持久狀態。密封秘密對於虛擬機器來說非常有價值,因此不應直接使用。相反,密封密鑰應從密封秘密中導出,並且密封秘密應儘早銷毀。

每個階段都會將確定性編碼的CBOR物件傳遞給下一個階段。該物件包含機密和 BCC,其中包含累積的狀態訊息,例如最後階段是否安全載入。

解鎖的設備

當使用fastboot oem unlock解鎖裝置時,使用者資料將會被清除。此程序可保護使用者資料免遭未經授權的存取。當設備解鎖時,pVM 私有的資料也會失效。

一旦解鎖,設備擁有者就可以自由地刷新通常受驗證啟動保護的分區,包括包含 pKVM 實現的分區。因此,解鎖設備上的 pKVM 不會被信任來維護安全模型。

遠端方可以透過檢查金鑰證明憑證中裝置的已驗證啟動狀態來觀察這種潛在的不安全狀態。