Bloquear e desbloquear o carregador de inicialização

Por padrão, a maioria dos dispositivos Android é fornecida com um carregador de inicialização bloqueado, o que significa que os usuários não podem atualizar o carregador de inicialização ou as partições do dispositivo. Se necessário, você e os usuários do dispositivo com as Opções do desenvolvedor ativadas podem desbloquear o carregador de inicialização para atualizar novas imagens.

Acesse o carregador de inicialização

Para emitir comandos fastboot, você precisa estar no modo de carregador de inicialização. Uma maneira de fazer isso é enviar o comando adb adb reboot bootloader. Alguns smartphones também permitem que você reinicie o carregador de inicialização pressionando uma combinação de teclas (geralmente diminuir o volume) ao inicializar o dispositivo.

Desbloquear o carregador de inicialização

No modo do carregador de inicialização, execute o comando fastboot flashing unlock no dispositivo para desbloqueá-lo e permitir que as partições sejam atualizadas novamente. Após a configuração, o modo de desbloqueio persiste entre as reinicializações.

Os dispositivos precisam negar o comando fastboot flashing unlock, a menos que o get_unlock_ability esteja definido como 1. Se ela estiver definida como 0, o usuário precisará inicializar para a tela inicial. Abra o menu Configurações > Sistema > Opções do desenvolvedor e ative a opção Desbloqueio de OEM, que define get_unlock_ability como 1. Após a configuração, esse modo persiste após as reinicializações e redefinições para a configuração original.

Quando o comando fastboot flashing unlock é enviado, o dispositivo precisa solicitar que os usuários avisem que podem encontrar problemas com imagens não oficiais. Depois que o usuário confirmar o aviso, o dispositivo precisará redefinir para a configuração original para evitar acesso não autorizado a dados. O carregador de inicialização precisa redefinir o dispositivo mesmo que não seja possível reformatá-lo corretamente. Somente após uma redefinição, a sinalização persistente pode ser definida para que o dispositivo possa ser atualizado novamente.

Toda a RAM que ainda não foi substituída precisa ser redefinida durante o processo fastboot flashing unlock. Essa medida impede ataques que leem o conteúdo restante da RAM da inicialização anterior. Da mesma forma, os dispositivos desbloqueados precisam limpar a RAM a cada inicialização (a menos que isso crie um atraso inaceitável), mas precisam deixar a região usada para o ramoops do kernel.

Bloquear o carregador de inicialização

Para bloquear o carregador de inicialização e redefinir o dispositivo, execute o comando fastboot flashing lock no dispositivo. Os dispositivos destinados ao varejo precisam ser enviados no estado bloqueado (com get_unlock_ability retornando 0) para garantir que os invasores não possam comprometer o dispositivo instalando um novo sistema ou imagem de inicialização.

Definir propriedades de bloqueio e desbloqueio

A propriedade ro.oem_unlock_supported precisa ser definida no tempo de build com base na compatibilidade do dispositivo com o desbloqueio com atualização flash.

  • Se o dispositivo oferecer suporte ao desbloqueio com flash, defina ro.oem_unlock_supported como 1.
  • Se o dispositivo não tiver suporte ao desbloqueio com flash, defina ro.oem_unlock_supported como 0.

Se o dispositivo for compatível com o desbloqueio com atualização flash, o carregador de inicialização precisará indicar o status de bloqueio definindo a variável de linha de comando do kernel androidboot.flash.locked como 1, se bloqueado, ou como 0, se desbloqueado. Essa variável precisa ser definida no bootconfig em vez de na linha de comando do kernel no Android 12.

Para dispositivos compatíveis com dm-verity, use ro.boot.verifiedbootstate para definir o valor de ro.boot.flash.locked como 0. Isso desbloqueia o carregador de inicialização se o estado de inicialização verificado estiver laranja.

Proteger seções críticas

Os dispositivos precisam oferecer suporte ao bloqueio e desbloqueio de seções críticas, que são definidas conforme o necessário para inicializar o dispositivo no carregador de inicialização. Essas seções podem incluir fusíveis, partições virtuais para um hub de sensor, carregador de inicialização de primeiro estágio e muito mais. Para bloquear seções críticas, você precisa usar um mecanismo que impede que o código (kernel, imagem de recuperação, código OTA etc.) em execução no dispositivo modifique deliberadamente qualquer seção crítica. As OTAs não podem atualizar seções críticas se o dispositivo estiver em estado crítico de bloqueio.

A transição do estado bloqueado para o desbloqueado precisa exigir uma interação física com o dispositivo. Essa interação é semelhante aos efeitos da execução do comando fastboot flashing unlock, mas exige que o usuário pressione um botão físico no dispositivo. Os dispositivos não podem permitir a transição programática de lock critical para unlock critical sem interação física e não podem ser enviados no estado unlock critical.