為避免在 pVM 中執行任意酬載,Android 虛擬化架構 (AVF) 採用分層安全性方法,在每個層級中加入額外執行機制。以下列出 AVF 安全層:
Android 會確保只有具備 pVM 權限的應用程式,才能建立或檢查 pVM。
引導程式:引導程式可確保只有 Google 或裝置供應商簽署的 pVM 映像檔才能啟動,並遵循 Android Verified Boot 程序。這個架構表示執行 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.img
、super.img
、vbmeta.img
或vbmeta\_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 不會受信任以維持安全性模型。
遠端使用者可以檢查金鑰認證憑證中的裝置已驗證的啟動狀態,觀察這項可能不安全的狀態。