Bloquear e desbloquear o carregador de inicialização

Por padrão, a maioria dos dispositivos Android vem 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 para desenvolvedores ativadas) podem desbloquear o carregador de inicialização para instalar novas imagens.

Acessar 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 no carregador de inicialização pressionando uma combinação de teclas (geralmente o volume para baixo) durante a inicialização do dispositivo.

Desbloquear o carregador de inicialização

No modo do carregador de inicialização, para desbloquear o carregador de inicialização e permitir que as partições sejam reflashadas, execute o comando fastboot flashing unlock no dispositivo. Após a configuração, o modo de desbloqueio persiste nas reinicializações.

Os dispositivos precisam negar o comando fastboot flashing unlock, a menos que o get_unlock_ability esteja definido como 1. Se definido como 0, o usuário precisa inicializar na tela inicial, abrir o menu Configurações > Sistema > Opções do desenvolvedor e ativar a opção Desbloqueio de OEM, que define get_unlock_ability como 1. Depois da configuração, esse modo persiste em reinicializações e redefinições de dados de fábrica.

Quando o comando fastboot flashing unlock for enviado, o dispositivo vai pedir aos usuários para avisar que eles podem encontrar problemas com imagens não oficiais. Depois que o usuário confirmar o aviso, o dispositivo precisará fazer uma redefinição de dados para a configuração original para evitar o acesso não autorizado a dados. O carregador de inicialização precisa redefinir o dispositivo, mesmo que não consiga reformá-lo corretamente. Somente após uma redefinição, a flag persistente pode ser definida para que o dispositivo possa ser reflashado.

Toda a RAM que ainda não foi sobrescrita 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 momento da criação com base na compatibilidade do dispositivo com o desbloqueio por piscar.

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

Se o dispositivo oferecer suporte ao desbloqueio de 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 estiver bloqueado ou como 0 se estiver desbloqueado. Essa variável precisa ser definida no bootconfig, e não 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 verificada 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 como tudo o que é 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 sensores, carregador de inicialização de primeiro estágio e muito mais. Para bloquear seções críticas, use 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 vão atualizar seções críticas se o dispositivo estiver em estado de bloqueio crítico.

A transição do estado bloqueado para o desbloqueado exige uma interação física com o dispositivo. Essa interação é semelhante aos efeitos de 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.