安全性

為避免在 pVM 中執行任意酬載,Android 虛擬化架構 (AVF) 採用分層安全性做法,每個層級都會加入額外執行機制。以下列出 AVF 安全層:

  • Android 會確保只有具備 pVM 權限的應用程式,才能建立或檢查 pVM。

  • 引導程式:引導程式可確保只有 Google 或裝置供應商簽署的 pVM 映像檔才能啟動,並遵循 Android 驗證啟動程序。這個架構表示執行 pVM 的應用程式無法內含自己的核心。

  • pVM 可為在 pVM 中執行的酬載提供深入防護,例如 SELinux。深層防禦機制不允許將資料對應為可執行檔 (neverallow execmem),並確保 W^X 可用於所有檔案類型。

安全性模型

機密性、完整性和可用性 (CIA 三要素) 是一種用於制定資訊安全政策的模型:

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

機密性和完整性

機密性源自 pKVM 虛擬機器管理程序強制執行的記憶體隔離屬性。pKVM 會追蹤個別實體記憶體頁面的記憶體擁有權,以及擁有者要求共用頁面的任何要求。pKVM 會確保只有獲授權的 pVM (主機和訪客) 在其階段 2 頁面表格中對應特定頁面,而這些表格由虛擬機器管理程序控制。在這個架構中,除非擁有者明確與其他 pVM 共用,否則 pVM 擁有的記憶體內容會保持私密。

為了維護機密性,系統中代表 pVM 執行記憶體存取作業的任何實體也適用這些限制,也就是支援 DMA 的裝置和在較高權限層級執行的服務。晶片系統 (SoC) 供應商必須滿足一套新規定,才能支援 pKVM。否則無法提供保密性。

完整性適用於記憶體中的資料運算。pVM 無法:

  • 未經同意即修改彼此的記憶體。
  • 影響彼此的 CPU 狀態。

這些規定是由管理程序強制執行。不過,如果必須套用其他解決方案 (例如 dm-verity 或 AuthFS),虛擬資料儲存空間也會發生資料完整性問題。

這些原則與 Linux 提供的程序隔離機制沒有什麼不同,在 Linux 中,記憶體頁面的存取權會透過階段 1 頁面表和程序間的 kernel 情境切換控制。不過,與整個 Linux 核心相比,負責強制執行這些屬性的 pKVM 的 EL2 部分,攻擊面小了三個數量級 (約 1 萬行,相較於 2 千萬行程式碼),因此可為依賴程序隔離功能的用途提供更強的安全保障。

由於 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 執行個體的 DICE 憑證鏈和複合裝置 ID (CDI),只能由該特定執行個體衍生。

訪客 OS

Microdroid 是 pVM 中執行的 OS 範例。Microdroid 包含以 U-boot 為基礎的引導程式、GKI、部分 Android 使用者空間,以及酬載啟動器。這些屬性會在任何 pVM (包括主機) 遭到入侵時保留。在 pVM 中執行的其他作業系統應提供類似的屬性。

  • 如果無法驗證 boot.imgsuper.imgvbmeta.imgvbmeta\_system.img,MicroDroid 就無法啟動。

  • 如果 APK 驗證失敗,Microdroid 就不會啟動。

  • 即使 APK 已更新,同一個 Microdroid 例項仍無法啟動。

  • 如果任何 APEX 無法通過驗證,Microdroid 就不會啟動。

  • 如果在客體 pVM 外部修改 instance.img,Microdroid 就不會啟動 (或會以清除的初始狀態啟動)。

  • Microdroid 會為啟動鏈提供認證。

  • 對與訪客 pVM 共用的磁碟映像檔進行任何 (未簽署) 修改,都會導致 pVM 端發生 I/O 錯誤。

  • 提供給 pVM 執行個體的 DICE 憑證鏈和 CDIs,只能由該特定執行個體衍生。

  • 寫入加密儲存空間磁碟區的資料屬於機密資料,但在加密區塊的細節層級,並未提供復原保護機制。此外,其他任意外部竄改資料區塊的行為,會導致該區塊對 Microdroid 而言看起來像是垃圾,而非明確偵測為 I/O 錯誤。

Android

以下是 Android 在擔任主機時維護的屬性,但在主機遭到入侵時,這些屬性就不再適用:

  • 訪客 pVM 無法直接與其他訪客 pVM 互動 (例如建立 vsock 連線)。

  • 只有主機 pVM 中的 VirtualizationService 可以建立與 pVM 的通訊管道。

  • 只有使用平台金鑰簽署的應用程式,才能要求建立、擁有或與 pVM 互動的權限。

  • 在主機 pVM 執行時,系統不會重複使用用於設定主機和 pVM 之間 vsock 連線的 ID (稱為內容 ID)。舉例來說,您無法將執行中的 pVM 替換為其他 pVM。

適用地區

在 pVM 的情況下,「可用性」是指主機將足夠的資源分配給邀請對象,讓邀請對象執行其應執行的工作。

主機的職責包括為 pVM 的虛擬 CPU 排程。與傳統的 Type-1 管理程序 (例如 Xen) 不同,KVM 會明確做出設計決策,將工作負載排程委派給主機核心。考量目前排程器的大小和複雜度,這個設計決策可大幅縮減信任運算基礎 (TCB) 的大小,並讓主機做出更明智的排程決策,以便提升效能。不過,惡意房主可以選擇永不安排房客。

同樣地,pKVM 也會將實體中斷處理工作委派給主機核心,以降低管理程序的複雜度,並讓主機負責排程。我們會盡力確保轉送訪客中斷的結果只會導致服務拒絕 (中斷太少、太多或誤導中斷)。

最後,主機的虛擬機器監視器 (VMM) 程序負責分配記憶體,並提供網路卡等虛擬裝置。惡意 VMM 可能會扣留訪客的資源。

雖然 pKVM 不會向訪客提供可用性,但設計可保護主機免受惡意訪客影響,因為主機隨時可以搶先或終止訪客,並回收其資源。

安全啟動

資料會與 pVM 的執行個體綁定,安全啟動功能可確保對執行個體資料的存取權。執行個體首次啟動時,系統會隨機為 pVM 產生密碼鹽值,並從已載入的映像檔中擷取詳細資料 (例如驗證公開金鑰和雜湊),藉此佈建執行個體。這項資訊會用於驗證 pVM 例項的後續啟動作業,並確保例項的機密資訊只會發布給通過驗證的映像檔。這個程序會在 pVM 中的每個載入階段執行:pVM 韌體、pVM ABL、Microdroid 等等。

DICE 會為每個載入階段提供認證金鑰組,其中公開部分會在該階段的 DICE 憑證中認證。這個金鑰組合可以在啟動期間變更,因此也會產生密封的祕密,這個祕密可在 VM 例項重新啟動時保持穩定,因此適合用於保護持續性狀態。密封密鑰對 VM 非常重要,因此不應直接使用。相反地,封存金鑰應從封存密鑰衍生,而封存密鑰應盡早銷毀。

每個階段都會將以確定方式編碼的 CBOR 物件交給下一個階段。這個物件包含機密和 DICE 憑證鏈結,其中包含累積的狀態資訊,例如上一個階段是否已安全載入。

已解鎖的裝置

使用 fastboot oem unlock 解鎖裝置時,系統會清除使用者資料。這項程序可防止使用者資料遭到未經授權的存取。當裝置解鎖時,pVM 的私人資料也會失效。

解鎖後,裝置擁有者就能自由重新刷新通常受驗證開機程序保護的分割區,包括包含 pKVM 實作項目的分割區。因此,在未解鎖的裝置上,pKVM 不會受到信任,無法維持安全性模型。

遠端使用者可以檢查金鑰認證憑證中的裝置已驗證的啟動狀態,觀察這項可能不安全的狀態。