安全性

為避免在 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 提供的程序隔離不同,因為在第 1 階段頁面資料表和核心程序之間的核心環境切換,會控管記憶體頁面的存取權。然而,與整個 Linux kernel 相比,強制執行這些屬性的 pKVM 的 EL2 部分少了三大攻擊面 (大約 1 萬至 2,000 萬行的程式碼),因此對於對必須依賴程序隔離的應用情況而言較不敏感,也能提供更強大的保證。

由於規模龐大,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 啟動為基礎的系統啟動載入程式、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 憑證鏈結和 CDI,只能透過該特定執行個體衍生。

  • 寫入加密儲存空間磁碟區的內容屬於機密性質,但無法按加密區塊精細程度復原。此外,其他任意外部竄改的資料區塊,會導致封鎖區塊顯示為 Microdroid 中的垃圾,而不是明確被偵測為 I/O 錯誤。

Android

這些屬性會由 Android 維護做為主機,但在主機遭駭的情況下並不真實:

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

  • 只有主機 pVM 中的 VirtualizationService 才能為 pVM 建立通訊管道。

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

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

適用國家/地區

在 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 不會受信任以維持安全性模型。

遠端方可以透過檢查金鑰認證憑證中的驗證啟動狀態,來觀察這項可能不安全的狀態。