用途

本頁面列出 AVF 的常見用途。

隔離編譯

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

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

隔離編譯

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

安全目標是如實編譯經過驗證的輸入內容,並在隔離狀態下產生輸出內容;Android 是不受信任的用戶端,無法以任何方式變更編譯輸出內容,只能導致編譯失敗 (Android 回復為開機時間編譯時)。

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

VM 的金鑰是從 VM 的 DICE 設定檔產生,由掛接至 VM 的 APEX 和 APK 定義,此外還會使用其他 VM 參數,例如可偵錯性。

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

透過受防護 VM 的驗證啟動功能,編譯服務只會執行經過驗證的程式碼。因此,程式碼可以判斷只接受符合特定條件的輸入內容,例如只接受名稱和 fs-verity 摘要在允許清單中定義的輸入檔案。

VM 暴露的任何 API 都是攻擊面。所有輸入檔案和參數都來自不受信任的用戶端,因此必須先經過驗證和審查,才能處理。

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

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

Linux 開發環境

傳統上,Android 是唯一不允許使用者在平台本身開發應用程式的主要作業系統。我們推出 Linux 開發環境,是為了向 Android 開發人員提供以 Linux 為基礎的開發環境。未來,我們計畫擴大這項工作,讓合作夥伴能夠實作創新的 VM 用途,例如執行圖形使用者介面應用程式,甚至是遊戲。

Linux 開發環境適用於特定裝置,並在非受保護的虛擬機器中執行。

Linux 開發環境應用實例

圖 2. Linux 開發環境應用實例。

Linux VM 的高階元件如下:

  • 終端機應用程式:提供終端機介面的 Android 應用程式。 這個應用程式會使用 WebView 連線至 VM 中執行的 Web 服務,以便進行互動。 這項應用程式預設為停用。在「開發人員設定」中啟用。
  • Android 虛擬化架構 (AVF):Android 現有的子系統,用於建立及管理 VM。支援這項功能時,只需要對自訂 OS 映像檔進行最少的修改。
  • 虛擬機器:AVF 產生的 VM。這個服務會代管終端機服務,AVF 專為終端機應用程式功能建立這個服務。
  • OS 映像檔:上游 Debian 提供的 OS 映像檔經過稍微修改,「終端機」應用程式會從外部 Google 伺服器下載這張圖片。這是 VM 作業的基礎。
  • 客體代理程式:VM 中的新軟體。並向 AVF 回報 OS 狀態,以及控管虛擬機器。
  • ttyd:在 VM 中執行的開放原始碼軟體,可透過 HTTP 實作終端機模擬。終端機應用程式的 WebView 會連線至該網址。
  • 網路共用管理員:現有的 Android 子系統。將虛擬機器連線至 Android 裝置,即可透過網路存取虛擬機器。