Vinculação de versão

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.
  • 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 leitura ro.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:

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().