用途

本文說明 AVF 的常見用途。

隔離編譯

防護 VM 是軟體安全區,可提供安全環境來編譯安全性敏感的程式碼。這個環境可將 bootclasspath 和系統伺服器 JAR (由 APEX 更新觸發) 的編譯作業從早期啟動移至重新啟動前,大幅縮短 APEX 更新後的啟動時間。

實作項目位於 com.android.compos APEX 中。這個元件為選用元件,可使用makefile 納入。

隔離編譯

圖 1. 在主系列更新中編譯 JAR

安全性目標是誠實地編譯已驗證的輸入內容,並在隔離狀態下產生輸出內容;Android 是不可信任的用戶端,因此無法以任何方式變更編譯輸出內容,只能導致編譯失敗 (當 Android 改用啟動時刻編譯時)。

只有在整個編譯期間沒有錯誤時,VM 中的編譯服務才會產生簽章。Android 可以從 VM 擷取公開金鑰,用於驗證簽名。

VM 的索引鍵是由 VM 的 DICE 設定檔產生,該設定檔由 VM 掛載的 APEX 和 APK 定義,以及其他 VM 參數 (例如可偵錯性)。

為判斷公開金鑰是否來自非預期的 VM,Android 會啟動 VM,以確定金鑰是否正確。每次更新 APEX 後,VM 都會在早期啟動時啟動。

在 Protected VM 的已驗證啟動程序中,編譯服務只會執行已驗證的程式碼。因此,程式碼可以決定只接受符合特定條件的輸入內容,例如只接受名稱和 fs-verity 摘要皆在許可清單中定義的輸入檔案。

任何 VM 公開的 API 都是攻擊面。系統會假設所有輸入檔案和參數皆來自不受信任的用戶端,因此必須在處理前進行驗證和審查。

VM 會驗證輸入/輸出檔案完整性,並將檔案儲存在 Android 上,做為不受信任的檔案伺服器,如下所示:

  • 使用 fs-verity 演算法前,必須先驗證輸入檔案的內容。如要讓輸入檔案在 VM 中可用,必須在提供 VM DICE 設定檔的容器 (APK) 中提供其根雜湊。有了可信的根雜湊值,攻擊者就無法在未被偵測到的情況下竄改輸入內容。
  • 輸出檔案的完整性必須在 VM 中維持。即使輸出檔案儲存在 Android 上,在產生期間,完整性仍會以相同的 fs-verity 樹狀結構格式維持,但可以動態更新。最終輸出檔案可透過根雜湊值識別,該值會在 VM 中隔離。VM 中的服務會透過簽章保護輸出檔案。