本文件說明 AVF 的常見用途。
隔離編譯
防護 VM 是軟體安全區,可提供安全環境來編譯安全性敏感的程式碼。這個環境允許將 bootclasspath
和系統伺服器 JAR (由 APEX 更新觸發) 的編譯作業從早期啟動移至重新啟動前,並大幅縮短 APEX 更新啟動時間。
實作項目位於 com.android.compos
APEX。這個元件為選用元件,可使用makefile 納入。
安全性目標是誠實地編譯已驗證的輸入內容,並在隔離狀態下產生輸出內容;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 中的服務會透過簽章保護輸出檔案。