A inicialização verificada requer a verificação criptográfica de todos os códigos executáveis e dados que fazem parte da versão do Android que está sendo inicializada antes de ser usada. Isso inclui o kernel (carregado da partição boot
), a árvore de dispositivos (carregada da partição dtbo
), a partição system
, a partição vendor
e assim por diante.
Partições pequenas, como boot
e dtbo
, que são lidas apenas uma vez, normalmente são verificadas carregando todo o conteúdo na memória e calculando seu hash. Este valor de hash calculado é então comparado com o valor de hash esperado . Se o valor não corresponder, o Android não carregará. Para obter mais detalhes, consulte Fluxo de inicialização .
Partições maiores que não cabem na memória (como sistemas de arquivos) podem usar uma árvore hash onde a verificação é um processo contínuo que ocorre à medida que os dados são carregados na memória. Nesse caso, o hash raiz da árvore hash é calculado durante o tempo de execução e verificado em relação ao valor esperado do hash raiz . O Android inclui o driver dm-verity para verificar partições maiores. Se em algum momento o hash raiz calculado não corresponder ao valor esperado do hash raiz , os dados não serão usados e o Android entrará em estado de erro. Para obter mais detalhes, consulte corrupção de dm-verity .
Os hashes esperados são normalmente armazenados no final ou no início de cada partição verificada, em uma partição dedicada ou em ambos. Crucialmente, esses hashes são assinados (direta ou indiretamente) pela raiz da confiança. Por exemplo, a implementação do AVB oferece suporte a ambas as abordagens. Consulte Inicialização verificada do Android para obter detalhes.
Proteção contra reversão
Mesmo com um processo de atualização completamente seguro, é possível que uma exploração não persistente do kernel do Android instale manualmente uma versão mais antiga e vulnerável do Android, reinicie na versão vulnerável e, em seguida, use essa versão do Android para instalar uma exploração persistente. A partir daí, o invasor possui permanentemente o dispositivo e pode fazer qualquer coisa, inclusive desabilitar atualizações.
A proteção contra esta classe de ataques é chamada de Rollback Protection . A proteção contra reversão normalmente é implementada usando armazenamento inviolável para registrar a versão mais recente do Android e recusando a inicialização do Android se for inferior à versão gravada. As versões normalmente são rastreadas por partição.
Para obter mais detalhes sobre como o AVB lida com as proteções contra reversão, consulte o README do AVB.
Tratamento de erros de verificação
A verificação pode falhar no momento da inicialização (como se o hash calculado na partição boot
não corresponder ao hash esperado) ou no tempo de execução (como se o dm-verity encontrar um erro de verificação na partição system
). Se a verificação falhar no momento da inicialização, o dispositivo não poderá inicializar e o usuário final precisará seguir as etapas para recuperar o dispositivo.
Se a verificação falhar em tempo de execução, o fluxo será um pouco mais complicado. Se o dispositivo usar dm-verity, ele deverá ser configurado no modo restart
. No modo restart
, se for encontrado um erro de verificação, o dispositivo será reiniciado imediatamente com um sinalizador específico definido para indicar o motivo. O carregador de boot deve notar este sinalizador e mudar dm-verity para usar o modo E/S Error ( eio
) e permanecer neste modo até que uma nova atualização seja instalada.
Ao inicializar no modo eio
, o dispositivo mostra uma tela de erro informando ao usuário que foi detectada corrupção e o dispositivo pode não funcionar corretamente. A tela é exibida até que o usuário a ignore. No modo eio
, o driver dm-verity não reiniciará o dispositivo se um erro de verificação for encontrado; em vez disso, um erro EIO será retornado e o aplicativo precisará lidar com o erro.
A intenção é que o atualizador do sistema seja executado (para que um novo sistema operacional sem erros de corrupção possa ser instalado) ou o usuário possa obter o máximo possível de seus dados do dispositivo. Depois que o novo sistema operacional for instalado, o carregador de inicialização percebe o sistema operacional recém-instalado e volta ao modo de restart
.