用途

本文檔包含 AVF 的常見用例。

隔離編譯

作為軟體安全飛地,受保護的虛擬機器提供了編譯安全敏感程式碼的安全環境。此環境允許將bootclasspath和系統伺服器 JAR(由 APEX 更新觸發)的編譯從早期啟動移至重新啟動之前,並顯著減少 APEX 更新後的啟動時間。

實作位於com.android.compos APEX 中。該元件是可選的,可以使用makefile包含在內。

隔離編譯

圖 1.在主線更新上編譯 JAR

安全目標是真實地編譯經過驗證的輸入並獨立地產生輸出; Android 作為不受信任的用戶端,除了導致編譯失敗(當 Android 回退到啟動時編譯時)之外,無法以任何方式更改編譯輸出。

只有當整個編譯過程沒有錯誤時,虛擬機器中的編譯服務才會產生簽章。 Android 可以從 VM 檢索公鑰以進行簽署驗證。

VM 的金鑰是根據 VM 的 DICE 設定檔產生的,該設定檔由安裝到 VM 的 APEX 和 APK 以及其他 VM 參數(例如可偵錯性)定義。

為了確定公鑰是否來自意外的 VM,Android 會啟動 VM 以確定金鑰是否正確。每次 APEX 更新後,VM 會在早期啟動時啟動。

透過受保護的虛擬機器的驗證啟動,編譯服務僅執行經過驗證的程式碼。因此,程式碼可以確定僅接受滿足特定條件的輸入,例如,僅接受在允許清單中定義其名稱和fs-verity摘要的輸入檔案。

虛擬機器中任何暴露的 API 都是攻擊面。所有輸入檔案和參數都假定來自不受信任的用戶端,並且在處理之前必須經過驗證和審查。

輸入/輸出檔案的完整性由VM驗證,檔案儲存在Android作為不受信任的檔案伺服器上,如下:

  • 輸入檔案的內容在使用前必須使用fs-verity演算法進行驗證。為了使輸入檔在 VM 中可用,必須在有助於 VM 的 DICE 設定檔的容器 (APK) 中提供其根雜湊。利用受信任的根哈希,攻擊者無法在不被發現的情況下篡改輸入。
  • 必須在虛擬機器中維護輸出檔案的完整性。即使輸出檔案儲存在 Android 上,在產生過程中,也會使用相同的fs-verity樹格式來維護完整性,但可以動態更新。最終的輸出檔案可以透過根哈希來識別,該根哈希在虛擬機器中是隔離的。 VM中的服務透過簽章保護輸出檔。