Reanudación en el reinicio

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

Aunque los socios pueden vincular este proceso con una función del sistema inalámbrica 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ámbrica. El proceso de RoR proporciona seguridad y conveniencia adicional 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 brindan seguridad del tipo de nivel de hardware del dispositivo.

Si bien debes proporcionar permiso de dispositivo para que la función android.hardware.reboot_escrow admita RoR en Android 11, no es necesario que lo hagas para habilitar RoR basado en el servidor en Android 12 y versiones posteriores, ya que no usan el 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 de CE. La implementación de la compatibilidad con el inicio directo proporcionó a los usuarios una mejor experiencia antes de que se deba ingresar el factor de conocimiento de la pantalla de bloqueo (LSKF) después de un inicio.

La RoR permite desbloquear el almacenamiento de CE de todas las apps de un dispositivo, incluidas las que no admiten el inicio directo, cuando se inicia un reinicio después 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 manos de un atacante, sea extremadamente difícil para este recuperar los datos encriptados por la CE del usuario, incluso si el dispositivo está encendido, el almacenamiento de la CE está desbloqueado y el usuario desbloquea el dispositivo después de recibir una actualización OTA. La resistencia a los ataques de personas internas debe ser eficaz incluso si el atacante obtiene acceso a las claves de firma criptográfica de transmisión.

Específicamente, un atacante que tenga el dispositivo físicamente no debe leer el almacenamiento de CE, y tiene estas capacidades y limitaciones:

Funciones

  • Puede usar la clave de firma de cualquier proveedor o empresa para firmar mensajes arbitrarios.
  • Puede provocar que el dispositivo reciba una actualización inalámbrica.
  • Puede modificar el funcionamiento de cualquier hardware (como un procesador de aplicaciones o una memoria flash), excepto como se detalla en las Limitaciones a continuación. (Sin embargo, esa modificación implica una demora de al menos una hora y un ciclo de encendido que destruye el contenido de la RAM).

Limitaciones

  • No se puede modificar el funcionamiento del hardware resistente a la manipulación (por ejemplo, un chip Titan M).
  • No se puede leer la RAM del dispositivo en vivo.
  • No se pueden adivinar las credenciales del usuario (PIN, patrón o contraseña) ni hacer que se ingresen de otra manera.

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 en el dispositivo permanecen en él; nunca se envían ni se almacenan en los servidores de Google. Esta es una descripción general del proceso que garantiza que los niveles de seguridad proporcionados sean similares a los de un sistema RoR basado en hardware y a nivel del dispositivo:

  • 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 almacenando un secreto que se puede recuperar solo por un tiempo limitado. Esto funciona en todo el ecosistema de Android.
  • Se usa una clave criptográfica, protegida por el PIN del usuario, para desbloquear el dispositivo y desencriptar el almacenamiento de CE.
    • Cuando se programa un reinicio durante la noche, 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 vez con una clave K_k almacenada en TEE.
    • El SP con doble encriptación se almacena en el disco, y el SP se borra de la RAM. Ambas claves se generan de forma reciente y se usan solo para un reinicio.
  • Cuando llega 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 SP 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 mantienen la seguridad de tu teléfono pueden ocurrir en un momento conveniente para ti: mientras duermes.

Reproducción del PIN de la SIM

En determinadas condiciones, el código PIN de una tarjeta SIM se verifica desde una caché, un proceso llamado repetició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 (una repetición del PIN de la SIM) después de un reinicio sin supervisión para restablecer la conectividad celular (obligatoria para las llamadas telefónicas, los mensajes SMS y los servicios de datos). El PIN de la SIM y la información de la tarjeta SIM coincidente (el ICCID y el número de la 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 la LSKF. Si la SIM tiene habilitado el PIN, la interacción con el servidor de RoR requiere una conexión Wi-Fi para la actualización inalámbrica y el RoR basado en el servidor, lo que garantiza la funcionalidad básica (con conectividad celular) 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 quita o restablece la SIM.
  • El usuario inhabilita el PIN.
  • Se produjo un reinicio que no se inició con 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 corto (20 segundos) si coinciden los detalles de la tarjeta SIM. 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 el servidor proporcionan una carga más ligera a los socios cuando envían actualizaciones inalámbricas. Las actualizaciones necesarias pueden ocurrir durante los tiempos de inactividad convenientes del dispositivo, como durante las horas de descanso 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 Android 12, no necesitas hacer nada para implementar la nueva funcionalidad de RoR.

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

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

No es necesario que lo implementes, ya que el HAL dejó de estar disponible a partir de Android 12.

TelephonyManager

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

 /**
    * 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 APKs 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 root (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 RoR HAL se dividen en dos categorías:

  1. Si el hardware del SoC admite la persistencia de la RAM en todos los reinicios, los OEMs pueden usar la implementación predeterminada en AOSP (Custodia predeterminada de RAM).
  2. Si el hardware o el SoC del dispositivo admiten un enclave de hardware seguro (un coprocesador de seguridad discreto con su propia RAM y ROM), además, debe hacer lo siguiente:
    • Debe poder detectar un 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.
    • Admite el almacenamiento de una clave en custodia en la RAM o ROM del enclave para que no se pueda recuperar con ataques sin conexión. Debe almacenar la clave de RoR de una manera que impida que personas internas o atacantes la recuperen.

Garantía de RAM predeterminada

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

Flujo de actualización inalámbrica con RoR

La app cliente OTA del 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, 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, que activa que se le solicite al usuario su PIN, patrón o contraseña en la pantalla de bloqueo durante el próximo 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 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, esto aparece como un desbloqueo normal del usuario, por lo que reciben todos los indicadores, como ACTION_LOCKED_BOOT_COMPLETED y ACTION_BOOT_COMPLETED, que suelen recibir.

Modifica la configuración de los productos

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

Marcador de la función de depósito en garantía de reinicio

El marcador de componentes 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 (0x10000) bytes. Nunca escribas estos bytes en el almacenamiento no volátil para asegurarte de que las propiedades de seguridad persistan.

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 cómo 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