Reanudar en reinicio

En Android 11, las actualizaciones inalámbricas se pueden aplicar usando mecanismos de actualización A/B o actualización A/B virtual, combinados con los métodos de clase RecoverySystem. Después de que un dispositivo se reinicia para aplicar una actualización inalámbrica, la opción de reanudar en el reinicio (RoR) desbloquea el almacenamiento de credenciales encriptadas (CE) del dispositivo.

Si bien los socios pueden vincular este proceso con una función del sistema inalámbrico que aplica actualizaciones cuando se espera que el dispositivo esté inactivo en Android 11, en Android 12, los socios no necesitan una función adicional del sistema inalámbrico. El proceso de RoR proporciona seguridad y conveniencia adicionales a los usuarios, ya que las actualizaciones se pueden realizar durante los tiempos de inactividad del dispositivo, mientras que las funciones de actualización de varios clientes y basadas en el servidor de Android 12 en conjunto proporcionan seguridad de tipos de dispositivos a nivel de hardware.

Si bien debes otorgar permiso de dispositivo para que la función android.hardware.reboot_escrow admita RoR en Android 11, no necesitas hacerlo para habilitar la RoR basada en el servidor en Android 12 y versiones posteriores, ya que no usan la HAL.

Información general

A partir de Android 7, Android admite el inicio directo, que permite que las apps de un dispositivo se inicien antes de que el usuario desbloquee el almacenamiento CE. La implementación de la compatibilidad con el inicio directo les brindó a los usuarios una mejor experiencia antes de que se ingresara el Factor de conocimiento de pantalla de bloqueo (LSKF) después del inicio.

RoR permite desbloquear el almacenamiento CE de todas las apps en un dispositivo, incluidas aquellas que no admiten el inicio directo, cuando se inicia un reinicio luego de una actualización inalámbrica. Esta función permite que los usuarios reciban notificaciones de todas sus apps instaladas después del reinicio.

Modelo de amenazas

Una implementación de RoR debe garantizar que, cuando un dispositivo caiga en las manos de un atacante, este le resulte extremadamente difícil recuperar los datos encriptados CE del usuario, incluso si el dispositivo está encendido, se desbloquea el almacenamiento CE y el usuario desbloquea el dispositivo después de recibir una actualización inalámbrica. La resistencia a los ataques de usuarios con información privilegiada debe ser eficaz incluso si el atacante obtiene acceso a las claves de firma criptográfica de transmisión.

Específicamente, no debe leer el almacenamiento CE si un atacante tiene el dispositivo físicamente y tiene las siguientes capacidades y limitaciones:

Funciones

  • Se puede usar la clave de firma de cualquier proveedor o empresa para firmar mensajes arbitrarios.
  • Puede hacer que el dispositivo reciba una actualización inalámbrica.
  • Pueden modificar el funcionamiento de cualquier hardware (como un procesador de aplicaciones o una memoria flash), excepto en los casos que se detallan en la sección Limitaciones más adelante. (Sin embargo, esa modificación implica un retraso de al menos una hora y un reinicio que destruye el contenido de la RAM).

Limitaciones

  • No se puede modificar el funcionamiento del hardware resistente a alteraciones (por ejemplo, un Titan M).
  • No se puede leer la RAM del dispositivo activo.
  • No puede adivinar las credenciales del usuario (PIN, patrón, contraseña) ni generar que se ingresen de otra forma.

Solución

El sistema de actualización de RoR de Android 12 brinda seguridad contra atacantes muy sofisticados y lo hace mientras las contraseñas y los PIN del dispositivo permanecen en el dispositivo, ya que nunca se envían a los servidores de Google ni se almacenan en ellos. Esta es una descripción general del proceso que garantiza que los niveles de seguridad proporcionados sean similares a un sistema RoR a nivel del dispositivo basado en hardware:

  • Android aplica protecciones criptográficas a los datos almacenados en un dispositivo.
  • Todos los datos están protegidos por claves almacenadas en el entorno de ejecución confiable (TEE).
  • El TEE solo libera las claves si el sistema operativo en ejecución pasa la autenticación criptográfica (inicio verificado).
  • El servicio de RoR que se ejecuta en los servidores de Google protege los datos de CE mediante el almacenamiento de un secreto que se puede recuperar solo por tiempo limitado. Esto funciona en todo el ecosistema de Android.
  • Se usa una clave criptográfica, protegida por el PIN de un usuario, para desbloquear el dispositivo y desencriptar el almacenamiento de CE.
    • Cuando se programa un reinicio nocturno, Android le solicita al usuario que ingrese su PIN y, luego, calcula una contraseña sintética (SP).
    • Luego, encripta el SP dos veces: una vez con una clave K_s almacenada en la RAM y otra con una clave K_k almacenada en TEE.
    • El SP con doble encriptación se almacena en el disco, y el SP se limpia de la RAM. Ambas claves se generaron de nuevo y se usan solo un reinicio.
  • Cuando es el momento de reiniciar, Android confía K_s al servidor. El recibo con K_k se encripta antes de almacenarse en el disco.
  • Después del reinicio, Android usa K_k para desencriptar el recibo y, luego, lo envía al servidor para recuperar K_s.
    • K_k y K_s se usan para desencriptar el PS almacenado en el disco.
    • Android usa el SP para desbloquear el almacenamiento de CE y permitir el inicio normal de la app.
    • Se descartan K_k y K_s.

Las actualizaciones que protegen tu teléfono pueden realizarse en un momento que te resulte conveniente: mientras duermes.

Reproducción del PIN de la SIM

En ciertas condiciones, el código PIN de una tarjeta SIM se verifica desde una caché, un proceso llamado reproducción del PIN de la SIM.

Una tarjeta SIM con un PIN habilitado también debe someterse a una verificación fluida del código PIN (reproducción del PIN de la SIM) después de un reinicio sin supervisión para restablecer la conectividad móvil (obligatoria para llamadas telefónicas, mensajes SMS y servicios de datos). El PIN de la SIM y la información de la tarjeta SIM correspondiente (el ICCID y el número de ranura de la SIM) se almacenan juntos de forma segura. El PIN almacenado se puede recuperar y usar para la verificación solo después de un reinicio sin supervisión exitoso. Si el dispositivo está protegido, el PIN de la SIM se almacena con claves protegidas por el LSKF. Si la SIM tiene el PIN habilitado, la interacción con el servidor RoR requiere una conexión Wi-Fi para la actualización inalámbrica y RoR basado en el servidor, lo que garantiza una funcionalidad básica (con conectividad móvil) después del reinicio.

El PIN de la SIM se vuelve a encriptar y se almacena cada vez que el usuario lo habilita, verifica o modifica correctamente. El PIN de la SIM se descarta si ocurre alguna de las siguientes situaciones:

  • Se quitará o restablecerá la SIM.
  • El usuario inhabilita el PIN.
  • Se produjo un reinicio no iniciado por RoR.

El PIN de la SIM almacenado solo se puede usar una vez después del reinicio iniciado por RoR y solo por un período muy breve (20 segundos), si los detalles de la tarjeta SIM coinciden. El PIN de la SIM almacenado nunca sale de la app de TelephonyManager y los módulos externos no pueden recuperarlo.

Lineamientos de implementación

En Android 12, las funciones de RoR de varios clientes y basadas en servidores proporcionan una carga más ligera a los socios cuando envían actualizaciones OTA. Las actualizaciones necesarias pueden ocurrir durante tiempos de inactividad en dispositivos convenientes, como durante las horas de suspensión designadas.

Para garantizar que las actualizaciones OTA durante esos períodos no interrumpan a los usuarios, usa el modo oscuro para mitigar las emisiones de luz. Para ello, haz que el bootloader del dispositivo busque el motivo de la cadena unattended. Si unattended es true, coloca el dispositivo en modo oscuro. Ten en cuenta que es responsabilidad de cada OEM mitigar las emisiones de sonido y luz.

Si actualizas a Android 12 o lanzas dispositivos con esta versión, no necesitas hacer nada para implementar la nueva funcionalidad de RoR.

A continuación, se muestra una llamada nueva en el flujo de varios clientes, isPreparedForUnattendedUpdate:

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

No necesitas implementar esto porque la HAL dejó de estar disponible a partir de Android 12.

TelephonyManager

El cliente inalámbrico invoca la API del sistema TelephonyManager cuando un reinicio es inminente en Android 12. Esta API traslada todos los códigos PIN almacenados en caché del estado AVAILABLE al estado REBOOT_READY. La API del sistema TelephonyManager está protegida por el permiso existente del manifiesto REBOOT.

 /**
    * 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()

Los APK con privilegios usan la API del sistema TelephonyManager.

Prueba

Para probar la nueva API, ejecuta este comando:

    adb shell cmd phone unattended-reboot

Este comando solo funciona cuando la shell se ejecuta como raíz (adb root).

Solo para Android 11

El resto de esta página se aplica a Android 11.

A partir de julio de 2020, las implementaciones de la HAL de RoR se dividen en dos categorías:

  1. Si el hardware del SoC admite la persistencia de RAM en los reinicios, los OEM pueden usar la implementación predeterminada en AOSP (custodia predeterminada de RAM).
  2. Si el hardware del dispositivo o SoC admite un enclave de hardware seguro (un coprocesador de seguridad discreto con su propia RAM y ROM), además, debe hacer lo siguiente:
    • Detecta el reinicio de la CPU principal.
    • Tener una fuente de temporizador de hardware que persista en los reinicios Es decir, el enclave debe poder detectar el reinicio y vencer un temporizador establecido antes del reinicio.
    • Se admite el almacenamiento de una clave de custodia en la RAM/ROM del enclave, de modo que no se pueda recuperar mediante ataques sin conexión. Debe almacenar la clave RoR de forma que sea imposible que los usuarios con información privilegiada o los atacantes puedan recuperarla.

Custodia predeterminada de RAM

AOSP tiene una implementación de la HAL de RoR que usa persistencia de RAM. Para que esto funcione, los OEMs deben asegurarse de que sus SoC admitan la persistencia de RAM después de los reinicios. Algunos SoC no pueden conservar el contenido de la RAM durante un reinicio, por lo que se recomienda a los OEM que consulten a sus socios de SoC antes de habilitar esta HAL predeterminada. La referencia canónica de esto se encuentra en la siguiente sección.

Flujo de actualización OTA a través de RoR

La app cliente de OTA en el teléfono debe tener los permisos Manifest.permission.REBOOT y Manifest.permission.RECOVERY para llamar a los métodos necesarios para implementar RoR. Con ese requisito previo establecido, el flujo de una actualización sigue estos pasos:

  1. La app cliente OTA descarga la actualización.
  2. La app cliente OTA llama a RecoverySystem#prepareForUnattendedUpdate, lo que activa al usuario a fin de que se le solicite su PIN, patrón o contraseña en la pantalla de bloqueo durante el siguiente desbloqueo.
  3. El usuario desbloquea el dispositivo en la pantalla de bloqueo y el dispositivo está listo para que se aplique la actualización.
  4. La app cliente de OTA llama a RecoverySystem#rebootAndApply, que activa un reinicio de inmediato.

Al final de este flujo, el dispositivo se reinicia y el mecanismo de RoR desbloquea el almacenamiento encriptado por credenciales (CE). Para las apps, aparece como un desbloqueo normal del usuario, por lo que reciben todos los indicadores, como ACTION_LOCKED_BOOT_COMPLETED y ACTION_BOOT_COMPLETED que normalmente hacen.

Modificar la configuración de los productos

Un producto marcado como compatible con la función RoR en Android 11 debe incluir una implementación de la HAL de Reiniciar Escrow, además del archivo en formato XML del marcador de funciones. La implementación predeterminada funciona bien en dispositivos que usan reinicio en tibio (cuando la alimentación a la DRAM permanece encendida durante el reinicio).

Reiniciar marcador de función de depósito

El marcador de componente también debe 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

Implementación predeterminada de HAL de depósito de reinicio

Para usar la implementación predeterminada, debes reservar 65,536 (0x10,00) bytes. Nunca escribas estos bytes en almacenamiento no volátil para garantizar la persistencia de las propiedades de seguridad.

Cambios en el árbol de dispositivos del kernel de Linux

En el árbol de dispositivos del kernel de Linux, debes reservar memoria para una región pmem. En el siguiente ejemplo, se muestra que se reserva 0x50000000:

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

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

Verifica que tengas un dispositivo nuevo en el directorio de bloques con un nombre como /dev/block/pmem0 (como pmem1 o pmem2).

Cambios en Device.mk

Si suponemos que el dispositivo nuevo del paso anterior se llama pmem0, debes asegurarte de que se agreguen las siguientes entradas nuevas 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
Reglas de SELinux

Agrega estas entradas nuevas al file_contexts del 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