為避免在 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.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 不會受到信任,無法維持安全性模型。
遠端使用者可以檢查金鑰認證憑證中的裝置已驗證的啟動狀態,觀察這項可能不安全的狀態。