Todas as chaves do KeyMint precisam ser vinculadas a uma raiz de confiança do dispositivo. A raiz de confiança é uma string de bits 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 estar 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, sem deixar de oferecer proteção
contra reversão.
Para implementar essa vinculação de versão, o app confiável (TA, na sigla em inglês) do KeyMint precisa de uma maneira de receber com segurança a versão atual do SO e os níveis de patch, além de 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, na sigla em inglês):
- Os níveis de patch e a versão do SO
podem ser incluídos
em
vbmeta.imgpara 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 structque contém os dados de confirmação de identidade (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 ao carregador de inicialização, para que ele possa fornecer o hash ao KeyMint.
- O
boot.imgpode continuar armazenando níveis de patch no cabeçalho. system.imgpode continuar armazenando níveis de patch e a versão do SO em propriedades somente leitura.vendor.imgarmazena 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 ao KeyMint.
As tags a seguir descrevem as informações de versão das partições relevantes:
Tag::VENDOR_PATCHLEVEL: partiçãovendorTag::BOOT_PATCHLEVEL: partiçãobootTag::OS_PATCHLEVELeTag::OS_VERSION: partiçãosystem;Tag::OS_VERSIONé removido do cabeçalhoboot.img
As implementações do KeyMint precisam tratar todos os níveis de patch de forma independente. As chaves podem ser usadas 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. Em seguida, o Keystore executa IKeyMintDevice::upgradeKey
para gerar um novo keyblob vinculado aos níveis de patch atuais (e,
em seguida, o Keystore exclui o keyblob anterior com uma chamada
para IKeyMintDevice::deleteKey).