Vinculação de versão

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.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 confirmação de identidade (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 ao carregador de inicialização, para que ele possa fornecer o hash ao KeyMint.
    • O 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 ao KeyMint.

As tags a seguir descrevem as 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 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).