Retomar na reinicialização

No Android 11, as atualizações OTA podem ser aplicadas usando a atualização A/B. ou de atualização A/B virtual, combinados com o comando RecoverySystem métodos da classe. Após a reinicialização do dispositivo para aplicar uma atualização OTA, A retomada na reinicialização (RoR, na sigla em inglês) desbloqueia o armazenamento criptografado por credenciais (CE) do dispositivo.

Embora os parceiros possam combinar esse processo com um recurso do sistema OTA que se aplique são atualizadas quando se espera que o dispositivo fique inativo no Android 11, em Os parceiros do Android 12 não precisam de outro sistema OTA . O processo de RoR fornece segurança e conveniência adicionais aos usuários porque as atualizações podem ser feitas durante períodos de inatividade do dispositivo, enquanto o Android 12 as funcionalidades de atualização baseadas em servidor e de múltiplos clientes, juntas, segurança de tipo no nível do hardware.

Embora você precise fornecer permissão de dispositivo para o android.hardware.reboot_escrow para oferecer suporte a RoR no Android 11, não é necessário fazer isso para ativar baseada em servidor no Android 12 e mais recentes, porque não use a HAL.

Contexto

A partir do Android 7, a Inicialização direta foi compatível com o Android, que permite que os apps em um dispositivo sejam iniciados antes que o armazenamento CE seja desbloqueado pelo o usuário. A implementação do suporte de inicialização direta proporcionou aos usuários uma melhor antes que o fator de conhecimento da tela de bloqueio (LSKF) precise ser inserido após a inicialização.

O RoR permite que o armazenamento CE de todos os apps em um dispositivo seja desbloqueado, incluindo os que não oferecem suporte à inicialização direta, quando a reinicialização é iniciada após uma atualização OTA. Esse recurso permite que os usuários recebam notificações de todos os Apps instalados após a reinicialização.

Modelo de ameaça

A implementação de RoR deve garantir que, quando um dispositivo cair para as mãos, é extremamente difícil para o invasor recuperar a CE- dados criptografados, mesmo que o dispositivo esteja ligado, o armazenamento CE esteja desbloqueado e o dispositivo é desbloqueado pelo usuário depois de receber uma atualização OTA. Pessoa com informações privilegiadas a resistência a ataques devem ser eficazes mesmo se o atacante obter acesso ao transmitir chaves de assinatura criptográficas.

Especificamente, o armazenamento CE não pode ser lido por um invasor que tenha do dispositivo e tem estes recursos e limitações:

Recursos

  • Pode usar a chave de assinatura de qualquer fornecedor ou empresa para assinar mensagens arbitrárias.
  • Pode fazer com que o dispositivo receba uma atualização OTA.
  • Pode modificar a operação de qualquer hardware (como um processador de aplicativos, ou memória flash), exceto conforme detalhado em Limitações abaixo. (No entanto, tal modificação envolve um atraso de pelo menos uma hora e um que destrói o conteúdo da RAM.

Limitações

  • Não pode modificar a operação de hardware resistente a adulterações (por exemplo, um Titan M).
  • Não pode ler a RAM do dispositivo ativo.
  • Não consegue adivinhar as credenciais do usuário (PIN, padrão, senha) ou causar elas sejam inseridas.

Solução

O sistema de atualização de RoR do Android 12 oferece segurança contra invasores muito sofisticados, usando senhas e senhas Os PINs permanecem no dispositivo. Eles nunca são enviados aos servidores do Google nem armazenados neles. Isso é uma visão geral do processo que garante que os níveis de segurança fornecidos sejam similar a um sistema RoR baseado em hardware e em nível de dispositivo:

  • O Android aplica proteções criptográficas aos dados armazenados em um dispositivo.
  • Todos os dados são protegidos por chaves armazenadas no ambiente de execução confiável (TEE).
  • O TEE só libera as chaves quando o sistema operacional em execução é aprovado Autenticação criptográfica (inicialização verificada).
  • O serviço RoR em execução nos servidores do Google protege os dados do CE armazenando um secret que podem ser recuperados somente por tempo limitado. Isso funciona em todo o ecossistema Android.
  • Uma chave criptográfica protegida pelo PIN do usuário é usada para desbloquear o dispositivo. e descriptografar o armazenamento de CE.
    • Quando uma reinicialização noturna é programada, o Android solicita que o usuário entre o PIN e, em seguida, calcula uma senha sintética (SP).
    • Em seguida, ele criptografa o SP duas vezes: uma com uma chave K_s armazenada na RAM e outra com uma chave K_k armazenada no TEE.
    • O SP duplamente criptografado é armazenado em disco e o SP é apagado da RAM. As duas chaves são geradas recentemente e usadas apenas uma vez.
  • No momento da reinicialização, o Android confia o K_s ao servidor. Comprovante com K_k são criptografados antes de serem armazenados no disco.
  • Após a reinicialização, o Android usa K_k para descriptografar o comprovante, que é enviado para o servidor para recuperar K_s.
    • K_k e K_s são usados para descriptografar o SP armazenado no disco.
    • O Android usa o SP para desbloquear o armazenamento CE e permitir a inicialização normal do app.
    • K_k e K_s são descartados.

As atualizações que protegem seu smartphone podem acontecer no momento mais conveniente para você: enquanto dorme.

Repetição do PIN do chip

Em certas condições, o código PIN de um chip é verificado a partir de um cache, um processo chamado repetição do PIN do chip.

Um chip com um PIN ativado também precisa passar por um código PIN integrado verificação (uma repetição do PIN do chip) após uma reinicialização automática para restaurar a rede celular conectividade (necessária para chamadas telefônicas, mensagens SMS e serviços de dados). O PIN do chip e as informações do chip correspondente (o ICCID e o slot do chip número) sejam armazenados juntos de forma segura. O PIN armazenado pode ser recuperado e usado para verificação somente após uma reinicialização autônoma. Se o dispositivo for está protegido, o PIN do chip será armazenado com chaves protegidas pelo LSKF. Se o chip tiver com o PIN ativado, a interação com o servidor RoR requer uma conexão Wi-Fi para a atualização OTA e o RoR baseado no servidor, que garante a funcionalidade básica (com conexão celular) após a reinicialização.

O PIN do chip é criptografado novamente e armazenado sempre que o usuário ativa os verifica ou modifica. O PIN do chip será descartado se uma das seguintes condições for verdadeira ocorre:

  • O chip é removido ou redefinido.
  • O usuário desativa o PIN.
  • Ocorreu uma reinicialização não iniciada por RoR.

O PIN do chip armazenado só pode ser usado uma vez após a reinicialização do RoR. apenas por um período muito curto (20 segundos), se os detalhes do chip correspondência de cartão. O PIN do chip armazenado nunca sai do app TelephonyManager e e não podem ser recuperadas por módulos externos.

Diretrizes de implementação

No Android 12, a RoR baseada em servidores e múltiplos clientes oferecem uma carga mais leve para os parceiros quando eles enviam atualizações OTA. As atualizações necessárias podem ocorrer durante inatividades convenientes do dispositivo, como durante as horas de sono estabelecidas.

Para garantir que as atualizações OTA durante esses períodos não interrompam os usuários, usam o modo escuro para reduzir a emissão de luz. Para isso, peça que o dispositivo o carregador de inicialização pesquisa pelo motivo da string unattended. Se unattended for true, colocar o dispositivo no modo escuro. É responsabilidade de cada OEM reduzir as emissões sonoras e de luz.

Se você está fazendo upgrade para o Android 12 ou lançando dispositivos com Android 12, você não precisa fazer nada para implementar a nova funcionalidade RoR.

Há uma nova chamada no fluxo de múltiplos clientes, isPreparedForUnattendedUpdate, mostrados abaixo:

@RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
            android.Manifest.permission.REBOOT})
public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)

Não é necessário implementar isso, porque a HAL foi descontinuada Android 12

Gerente de telefonia

O cliente OTA invoca a API do sistema TelephonyManager quando uma reinicialização é iminente no Android 12. Esta API move todos os códigos PIN armazenados em cache de do estado AVAILABLE para o estado REBOOT_READY. O sistema TelephonyManager A API é protegida pelo REBOOT atual Permissão de manifesto.

 /**
    * The unattended reboot was prepared successfully.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_SUCCESS = 0;

   /**
    * The unattended reboot was prepared, but the user will need to manually
    * enter the PIN code of at least one SIM card present in the device.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED = 1;

   /**
    * The unattended reboot was not prepared due to generic error.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_ERROR = 2;

   /** @hide */
   @Retention(RetentionPolicy.SOURCE)
   @IntDef(prefix = {"PREPARE_UNATTENDED_REBOOT_"},
           value = {
                   PREPARE_UNATTENDED_REBOOT_SUCCESS,
                   PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED,
                   PREPARE_UNATTENDED_REBOOT_ERROR
           })
   public @interface PrepareUnattendedRebootResult {}

   /**
    * Prepare TelephonyManager for an unattended reboot. The reboot is
    * required to be done shortly after the API is invoked.
    *
    * Requires system privileges.
    *
    * <p>Requires Permission:
    *   {@link android.Manifest.permission#REBOOT}
    *
    * @return {@link #PREPARE_UNATTENDED_REBOOT_SUCCESS} in case of success.
    * {@link #PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED} if the device contains
    * at least one SIM card for which the user needs to manually enter the PIN
    * code after the reboot. {@link #PREPARE_UNATTENDED_REBOOT_ERROR} in case
    * of error.
    * @hide
    */
   @SystemApi
   @RequiresPermission(android.Manifest.permission.REBOOT)
   @PrepareUnattendedRebootResult
   public int prepareForUnattendedReboot()

A API do sistema TelephonyManager é usada por APKs com privilégios.

Teste

Para testar a nova API, execute este comando:

    adb shell cmd phone unattended-reboot

Esse comando só funciona quando o shell está sendo executado como raiz (adb root).

Somente Android 11

O restante desta página se refere ao Android 11.

Desde julho de 2020, as implementações do RoR HAL são divididas em duas categorias:

  1. Se o hardware SoC oferecer suporte à persistência de RAM entre reinicializações, os OEMs poderão usar a implementação padrão no AOSP (Default RAM Escrow).
  2. Se o hardware do dispositivo ou SoC for compatível com um enclave de hardware seguro (um disco rígido com um coprocessador de segurança de rede (RAM) e ROM próprios), além de fazer o mesmo seguintes:
    • Detecte uma reinicialização da CPU principal.
    • Ter uma fonte de timer de hardware que persiste entre as reinicializações. Ou seja, o enclave deve ser capaz de detectar a reinicialização e expirar um timer definido antes da reiniciar o dispositivo.
    • Suporte ao armazenamento de uma chave sob garantia na RAM/ROM do enclave de modo que não possa pode ser recuperada com ataques off-line. Ele deve armazenar a chave RoR de forma que impossibilita que invasores ou pessoas com informações privilegiadas a recuperem.

Garantia de RAM padrão

O AOSP tem uma implementação da HAL RoR usando a persistência de RAM. Para que isso funcione, os OEMs precisam garantir que os SoCs ofereçam suporte à persistência de RAM entre as reinicializações. Alguns SoCs não conseguem manter o conteúdo da RAM durante uma reinicialização, então Os OEMs são aconselhados a consultar seus parceiros de SoC antes de ativar essa HAL padrão. A referência canônica para isso na seção a seguir.

Fluxo de atualização OTA usando RoR

O app cliente OTA no smartphone precisa ter a Manifest.permission.REBOOT (link em inglês) e Manifest.permission.RECOVERY para chamar os métodos necessários implementar a RoR. Com esse pré-requisito, o fluxo de uma siga estas etapas:

  1. o app cliente OTA faz o download da atualização.
  2. O app cliente OTA chama para RecoverySystem#prepareForUnattendedUpdate, que aciona o PIN, o padrão ou a senha do usuário no bloquear a tela no próximo desbloqueio.
  3. O usuário desbloqueia o dispositivo na tela de bloqueio, e o dispositivo está pronto para que a atualização seja aplicada.
  4. O app cliente OTA chama para RecoverySystem#rebootAndApply, que imediatamente aciona uma reinicialização.

No final desse fluxo, o dispositivo é reinicializado e o RoR desbloqueia o armazenamento criptografado por credenciais (CE). Para apps, isso aparece como um desbloqueio normal do usuário, então ele recebe todos os sinais, como ACTION_LOCKED_BOOT_COMPLETED (em inglês) e ACTION_BOOT_COMPLETED (link em inglês) que fazem normalmente.

Modificar configurações do produto

Um produto marcado como compatível com o recurso RoR no Android 11 precisa incluir uma implementação da HAL RestartEscrow e incluir o arquivo XML do marcador de recursos. A implementação padrão funciona bem em dispositivos que usam a reinicialização com estado salvo (quando a a energia da DRAM permanece ligada durante a reinicialização).

Reiniciar marcador de recurso de garantia

O marcador de elemento também precisa estar presente:

PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.reboot_escrow.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.reboot_escrow.xml

Implementação de HAL de garantia de reinicialização padrão

Para usar a implementação padrão, você precisa reservar 65536 (0x10.000) bytes. Nunca gravar os bytes no armazenamento não volátil para garantir que as propriedades de segurança persistem.

Mudanças na árvore de dispositivos do kernel do Linux

Na árvore de dispositivos do kernel do Linux, você precisa reservar memória para uma região pmem. O exemplo a seguir mostra a reserva de 0x50000000:

  reserved-memory {
    my_reservation@0x50000000 {
      no-map;
      reg = <0x50000000 0x10000>;
    }
  }

  reboot_escrow@0 {
    compatible = "pmem-region";
    reg = <0x50000000 0x10000>;
  };

Verifique se você tem um novo dispositivo no diretório de bloqueio com um nome como /dev/block/pmem0 (como pmem1 ou pmem2).

Mudanças no Device.mk

Supondo que o novo dispositivo da etapa anterior tenha o nome pmem0, é necessário garanta que as novas entradas a seguir sejam adicionadas a vendor/<oem>/<product>/device.mk:

# Resume on Reboot support
PRODUCT_PROPERTY_OVERRIDES += \
    ro.rebootescrow.device=/dev/block/pmem0
PRODUCT_PACKAGES += \
    android.hardware.rebootescrow-service.default
Regras do SELinux

Adicione estas novas entradas ao file_contexts do dispositivo:

/dev/block/pmem0  u:object_r:rebootescrow_device:s0
/vendor/bin/hw/android\.hardware\.rebootescrow-service\.default  u:object_r:hal_rebootescrow_default_exec:s0