所有 KeyMint 金鑰都必須繫結至裝置的信任根。信任根是位元字串,源自用於驗證啟動映像檔簽名的公開金鑰,以及引導程式鎖定狀態。
KeyMint 金鑰也必須綁定裝置的作業系統版本和修補程式等級。為支援 Treble 的模組結構,這個版本繫結會為每個分區 (boot
、system
和 vendor
) 提供個別的修補程式等級。這樣一來,每個分區都能獨立更新,同時仍提供回溯保護功能。
為了實作此版本繫結,KeyMint 信任的應用程式 (TA) 需要一種方法,可安全地接收目前的 OS 版本和修補程式等級,並確保接收的資訊與執行中系統的所有資訊相符。
- 搭載 Android 驗證開機程序 (AVB) 的裝置:
- 修補程式等級和 OS 版本可以納入
vbmeta.img
,這樣系統啟動載入程式就能將這些資訊提供給 KeyMint。 - 對於鏈結式分區,分區的版本資訊會位於鏈結式 VBMeta 中。
- 一般來說,版本資訊應位於
VBMeta struct
中,其中包含特定分區的驗證資料 (雜湊或雜湊樹)。
- 修補程式等級和 OS 版本可以納入
- 不支援 AVB 的裝置:
- 驗證開機程序實作項目需要向系統啟動載入程式提供版本中繼資料的雜湊值,以便系統啟動載入程式將雜湊值提供給 KeyMint。
boot.img
可以繼續在標頭中儲存修補程式等級。system.img
可以繼續在唯讀屬性中儲存修補程式層級和 OS 版本。vendor.img
會將修補程式級別儲存在唯讀屬性ro.vendor.build.version.security_patch
中。- 引導程式可將經過驗證啟動程序驗證的所有資料雜湊提供給 KeyMint。
以下標記說明相關區隔的版本資訊:
Tag::VENDOR_PATCHLEVEL
:vendor
分割區Tag::BOOT_PATCHLEVEL
:boot
分區Tag::OS_PATCHLEVEL
和OS_VERSION
:system
分區。(OS_VERSION
已從boot.img
標頭中移除)。
KeyMint 實作應獨立處理所有修補程式級別。如果所有版本資訊都與鍵相關聯的值相符,則可使用該鍵。如果目前的裝置版本比與鍵相關聯的任何值更新,則 KeyMint 會在任何嘗試使用鍵時傳回 KEY_REQUIRES_UPGRADE
錯誤。接著,KeyStore 會執行 IKeyMintDevice::upgradeKey()
,產生與目前修補程式級別繫結的新 KeyBlob (KeyStore 隨後會透過呼叫 IKeyMintDevice::deleteKey()
刪除先前的 KeyBlob)。