安全性

為防止在 pVM 中執行任意酬載,Android Virtualization Framework (AVF) 採用分層安全防護方法,每個層級都會新增額外的強制措施。以下列出 AVF 安全層:

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

  • 開機載入程式:開機載入程式可確保只有 Google 或裝置供應商簽署的 pVM 映像檔可以開機,並遵守 Android 驗證啟動程序。這項架構表示執行 pVM 的應用程式無法自行組合核心。

  • pVM 提供縱深防禦機制,例如 SELinux,可保護在 pVM 中執行的酬載。縱深防禦會禁止將資料對應為可執行檔 (neverallow execmem),並確保所有檔案類型都符合 W^X

安全性模型

機密性、完整性和可用性 (CIA 三要素) 組成一個模型,旨在引導資訊安全政策:

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

機密性和完整性

機密性源自 pKVM Hypervisor 強制的記憶體隔離屬性。pKVM 會追蹤個別實體記憶體頁面的記憶體擁有權,以及擁有者要求共用頁面的任何要求。pKVM 會確保只有具備權限的 pVM (主機和訪客) 才能在 Hypervisor 控制的第 2 階段頁面表格中,對應指定的頁面。這項架構可確保 pVM 擁有的記憶體內容保持私密,除非擁有者明確與其他 pVM 共用。

為維護機密性,系統中代表 pVM 執行記憶體存取的任何實體也受到限制,包括支援 DMA 的裝置和在更高權限層執行的服務。晶片系統 (SoC) 供應商必須符合一組新的規定,才能支援 pKVM。否則無法提供機密性。

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

  • 未經同意修改對方的記憶內容。
  • 互相影響 CPU 狀態。

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

這些原則與 Linux 提供的程序隔離機制相同,都是透過第 1 階段頁面表控制記憶體頁面的存取權,並在程序之間進行核心內容切換。不過,與整個 Linux 核心 (約 1 萬行對 2 千萬行程式碼) 相比,pKVM 的 EL2 部分 (負責強制執行這些屬性) 的攻擊面小了三個數量級,因此對於過於敏感而無法依賴程序隔離的用途,可提供更強大的保障。

由於 pKVM 的大小適中,因此適合進行正式驗證。我們正積極支援學術研究,目標是正式證明實際 pKVM 二進位檔的這些屬性。

本頁的其餘部分將說明 pKVM 周圍各個元件提供的機密性和完整性保證。

管理程序

pKVM 是以 KVM 為基礎的管理程序,可將 pVM 和 Android 隔離到互不信任的執行環境中。即使任何 pVM (包括主機) 遭到入侵,這些屬性仍會成立。符合 AVF 規範的替代 Hypervisor 必須提供類似的屬性。

  • 除非網頁擁有者明確共用,否則 pVM 無法存取屬於其他實體的網頁,例如 pVM 或管理程序。這項規則包含主機 pVM,且適用於 CPU 和 DMA 存取。

  • 在 pVM 使用的頁面傳回主機之前 (例如 pVM 遭到毀損時),系統會清除該頁面。

  • 在後續裝置啟動時,OS 系統啟動載入程式執行前,系統會清除所有 pVM 的記憶體和 pVM 韌體。

  • 如果附加 SJTAG 等硬體偵錯工具,pVM 就無法存取先前鑄造的鍵。

  • 如果無法驗證初始映像檔,pVM 韌體就不會啟動。

  • 如果 instance.img 的完整性遭到破壞,pVM 韌體就不會啟動。

  • 提供給 pVM 執行個體的 DICE 憑證鏈結和複合裝置 ID (CDI) 只能由該特定執行個體衍生。

訪客 OS

Microdroid 是在 pVM 中執行的 OS 範例。Microdroid 包含以 U-boot 為基礎的系統啟動載入程式、GKI、Android 使用者空間的子集,以及酬載啟動器。如果任何 pVM (包括主機) 遭到入侵,這些屬性就會保留。在 pVM 中執行的替代 OS 應提供類似的屬性。

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

  • 如果 APK 驗證失敗,Microdroid 將無法啟動。

  • 即使更新 APK,系統也不會啟動相同的 Microdroid 執行個體。

  • 如果任何 APEX 驗證失敗,Microdroid 就不會啟動。

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

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

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

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

  • 寫入加密儲存空間磁碟區的內容會受到保護,但加密區塊的細微程度無法提供回溯保護。此外,如果任意外部竄改資料區塊,Microdroid 會將該區塊視為垃圾資料,而不是明確偵測為 I/O 錯誤。

Android

這些是 Android 維護的屬性,但如果主機遭到入侵,這些屬性就不會成立:

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

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

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

  • 設定主機與 pVM 之間的vsock連線時,所用的 ID (稱為內容 ID (CID)) 不會在主機 pVM 執行時重複使用。舉例來說,您無法替換正在執行的 pVM。

可用性

就 pVM 而言,「可用性」是指主機為訪客分配足夠的資源,讓訪客執行設計好的工作。

主機的職責包括排定 pVM 的虛擬 CPU。與傳統的第 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 私有資料也會失效。

解鎖後,裝置擁有者就能重新刷寫通常受驗證開機程序保護的分割區,包括含有 pvmfw 和 pKVM 實作項目的分割區。因此,解鎖的裝置無法信任,無法維護 pVM 的安全模型。

遠端人員可以檢查金鑰認證憑證中的已驗證啟動狀態,觀察這個可能不安全的狀態。