Todas as chaves KeyMint precisam estar vinculadas a uma raiz de confiança do dispositivo. A raiz de confiança é um bitstring derivada da chave pública usada para verificar a assinatura da imagem de inicialização, junto com o estado de bloqueio do carregador de inicialização.
As chaves do KeyMint
também
precisam ser vinculadas à versão do sistema operacional e ao nível do patch do
dispositivo. Para oferecer suporte à estrutura modular do Treble, essa vinculação de versão inclui
níveis de patch separados para cada partição
(boot
, system
e vendor
). Isso permite
que cada partição seja atualizada de forma independente, além de oferecer proteção
de reversão.
Para implementar essa vinculação de versão, o app confiável (TA) do KeyMint precisa de uma maneira segura de receber a versão atual do SO e os níveis de patch e garantir que as informações recebidas correspondam a todas as informações sobre o sistema em execução.
- Dispositivos com inicialização verificada do Android (AVB):
- Os níveis de patch e a versão do SO
podem ser incluídos
em
vbmeta.img
para que o carregador de inicialização possa fornecê-los ao KeyMint. - Para partições encadeadas, as informações de versão da partição estão no VBMeta encadeado.
- Em geral, as informações de versão precisam estar no
VBMeta struct
que contém os dados de verificação (hash ou hashtree) de uma determinada partição.
- Os níveis de patch e a versão do SO
podem ser incluídos
em
- Dispositivos sem AVB:
- As implementações da inicialização verificada precisam fornecer um hash dos metadados da versão para o carregador de inicialização, para que ele possa fornecer o hash ao KeyMint.
boot.img
pode continuar armazenando níveis de patch no cabeçalho.system.img
pode continuar armazenando níveis de patch e a versão do SO em propriedades somente leitura.vendor.img
armazena o nível do patch na propriedade somente leituraro.vendor.build.version.security_patch
.- O carregador de inicialização pode fornecer um hash de todos os dados validados pela Inicialização verificada para o KeyMint.
As tags a seguir descrevem informações de versão das partições relevantes:
Tag::VENDOR_PATCHLEVEL
: partiçãovendor
Tag::BOOT_PATCHLEVEL
: partiçãoboot
Tag::OS_PATCHLEVEL
eOS_VERSION
: partiçãosystem
. OOS_VERSION
foi removido do cabeçalhoboot.img
.
As implementações do KeyMint precisam tratar todos os níveis de patch de forma independente. As chaves são
utilizáveis se todas as informações de versão corresponderem aos valores associados a uma chave. Se a
versão atual do dispositivo for mais recente do que qualquer valor associado a uma chave,
o KeyMint vai retornar o erro KEY_REQUIRES_UPGRADE
em qualquer tentativa de
usar a chave. O keystore executa IKeyMintDevice::upgradeKey()
para gerar um novo keyblob vinculado aos níveis de patch atuais. Em seguida,
o keystore exclui o keyblob anterior com uma chamada
para IKeyMintDevice::deleteKey()
.