Todas las claves de KeyMint deben estar vinculadas a una raíz de confianza para el dispositivo. La raíz de confianza es una cadena de bits derivada de la clave pública que se usa para verificar la firma de la imagen de inicio, junto con el estado de bloqueo del bootloader.
Las claves de KeyMint también deben vincularse a la versión del sistema operativo y al nivel de parche del dispositivo. Para admitir la estructura modular de Treble, esta vinculación de versión incluye niveles de parche separados para cada partición (boot
, system
y vendor
). Esto permite que cada partición se actualice de forma independiente y, al mismo tiempo, proporciona protección contra la reversión.
Para implementar esta vinculación de versión, la app de confianza (TA) de KeyMint necesita una forma de recibir de forma segura la versión actual del SO y los niveles de parches, y de garantizar que la información que recibe coincida con toda la información sobre el sistema en ejecución.
- Dispositivos con inicio verificado de Android (AVB):
- Los niveles de parche y la versión del SO se pueden incluir en
vbmeta.img
, de modo que el bootloader pueda proporcionarlos a KeyMint. - En el caso de las particiones encadenadas, la información de la versión de la partición se encuentra en el VBMeta encadenado.
- En general, la información de la versión debe estar en el
VBMeta struct
que contiene los datos de verificación (hash o hashtree) de una partición determinada.
- Los niveles de parche y la versión del SO se pueden incluir en
- Dispositivos sin AVB:
- Las implementaciones de inicio verificado deben proporcionar un hash de los metadatos de la versión al bootloader, de modo que este pueda proporcionar el hash a KeyMint.
boot.img
puede seguir almacenando niveles de parches en el encabezado.system.img
puede seguir almacenando los niveles de parche y la versión del SO en propiedades de solo lectura.vendor.img
almacena el nivel de parche en la propiedad de solo lecturaro.vendor.build.version.security_patch
.- El bootloader puede proporcionar un hash de todos los datos validados por el inicio verificado a KeyMint.
Las siguientes etiquetas describen la información de versión de las particiones relevantes:
Tag::VENDOR_PATCHLEVEL
: Particiónvendor
Tag::BOOT_PATCHLEVEL
: Particiónboot
Tag::OS_PATCHLEVEL
yOS_VERSION
: Particiónsystem
. (OS_VERSION
se quita del encabezadoboot.img
).
Las implementaciones de KeyMint deben tratar todos los niveles de parches de forma independiente. Las claves se pueden usar si toda la información de la versión coincide con los valores asociados con una clave. Si la versión actual del dispositivo es más reciente que cualquier valor asociado con una clave, KeyMint muestra el error KEY_REQUIRES_UPGRADE
en cualquier intento de usar la clave. Luego, Keystore realiza IKeyMintDevice::upgradeKey()
para generar un nuevo keyblob que está vinculado a los niveles de parches actuales (y, posteriormente, Keystore borra el keyblob anterior con una llamada a IKeyMintDevice::deleteKey()
).