安全性

為防止在 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 規範的替代管理程序必須提供類似的屬性。

  • 除非網頁擁有者明確共用,否則 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 而言,可用性是指主機為訪客分配足夠的資源,讓訪客執行設計好的工作。

主機的職責包括排定 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 的安全模型。

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