En Android 11, las actualizaciones OTA se pueden aplicar mediante 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 OTA, Resume-on-Reboot (RoR) desbloquea el almacenamiento de Credential Encrypted (CE) del dispositivo.
Aunque los socios pueden vincular este proceso con una función del sistema OTA 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 OTA. El proceso RoR brinda mayor seguridad y comodidad a los usuarios porque las actualizaciones se pueden realizar durante los tiempos de inactividad del dispositivo, mientras que las funcionalidades de actualización multicliente y basada en servidor de Android 12 brindan seguridad a nivel de hardware del dispositivo.
Aunque debe proporcionar permiso de dispositivo para la función android.hardware.reboot_escrow
para admitir RoR en Android 11, no necesita hacerlo para habilitar RoR basado en servidor en Android 12 y versiones posteriores, porque no usan HAL.
proporcione permisos de dispositivo para la función android.hardware.reboot_escrow
. No necesita hacer nada para habilitar RoR basado en servidor en Android 12, porque Android 12 y versiones posteriores no usan HAL.
Antecedentes
A partir de Android 7, Android admitió Direct Boot , que permite que las aplicaciones en un dispositivo se inicien antes de que el usuario desbloquee el almacenamiento CE. La implementación de la compatibilidad con el inicio directo proporcionó a los usuarios una mejor experiencia antes de que fuera necesario ingresar el Factor de conocimiento de la pantalla de bloqueo (LSKF) después de un inicio.
RoR permite desbloquear el almacenamiento CE de todas las aplicaciones en un dispositivo, incluidas aquellas que no son compatibles con Direct Boot, cuando se inicia un reinicio después de una actualización OTA. Esta función permite a los usuarios recibir notificaciones de todas sus aplicaciones instaladas, después del reinicio.
modelo de amenaza
Una implementación de RoR debe garantizar que cuando un dispositivo cae en manos de un atacante, es extremadamente difícil para el atacante recuperar los datos cifrados CE del usuario, incluso si el dispositivo está encendido, el almacenamiento CE está desbloqueado y el dispositivo está desbloqueado por el usuario después de recibir una actualización OTA. La resistencia a los ataques internos debe ser eficaz incluso si el atacante obtiene acceso a las claves de firma criptográfica de difusión.
Específicamente, el almacenamiento CE no debe ser leído por un atacante que tenga físicamente el dispositivo y tenga estas capacidades y limitaciones:
Capacidades
- Puede usar la clave de firma de cualquier proveedor o empresa para firmar mensajes arbitrarios.
- Puede hacer que el dispositivo reciba una actualización OTA.
- 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, dicha modificación implica tanto un retraso de al menos una hora como un ciclo de encendido que destruye el contenido de la RAM).
Limitaciones
- No se puede modificar el funcionamiento del hardware a prueba de manipulaciones (por ejemplo, un Titan M).
- No se puede leer la memoria RAM del dispositivo en vivo.
- No se pueden adivinar las credenciales del usuario (PIN, patrón, contraseña) ni hacer que se ingresen.
Solución
El sistema de actualización de Android 12 RoR brinda seguridad contra atacantes muy sofisticados, y lo hace mientras las contraseñas y los PIN del dispositivo permanecen en el dispositivo; 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 a nivel de 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 ( arranque verificado ).
- El servicio 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 un tiempo limitado . Esto funciona en todo el ecosistema de Android.
- Se utiliza una clave criptográfica, protegida por el PIN de un usuario, para desbloquear el dispositivo y descifrar el almacenamiento CE.
- Cuando se programa un reinicio nocturno, Android 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 RAM y otra vez con una claveK_k
almacenada en TEE. - El SP con doble cifrado se almacena en el disco y el SP se borra de la RAM. Ambas claves se generan recientemente y se utilizan para un solo reinicio .
- Cuando llega el momento de reiniciar, Android confía
K_s
al servidor. El recibo conK_k
se cifra antes de que se almacene en el disco. - Después del reinicio, Android usa
K_k
para descifrar el recibo y luego lo envía al servidor para recuperarK_s
.-
K_k
yK_s
se utilizan para descifrar el SP almacenado en el disco. - Android usa el SP para desbloquear el almacenamiento CE y permitir el inicio normal de la aplicación.
-
K_k
yK_s
se descartan.
-
Las actualizaciones que mantienen tu teléfono seguro pueden ocurrir en un momento conveniente para ti: mientras duermes.
Repetición de SIM-PIN
Bajo ciertas condiciones, el código PIN de una tarjeta SIM se verifica desde un caché, un proceso llamado repetición SIM-PIN.
Una tarjeta SIM con un PIN habilitado también debe someterse a una verificación de código PIN sin interrupciones (una repetición de SIM-PIN) después de un reinicio desatendido para restaurar la conectividad celular (requerido para llamadas telefónicas, mensajes SMS y servicios de datos). El PIN de la SIM y la información correspondiente de la tarjeta SIM (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 desatendido exitoso. Si el dispositivo está protegido, el PIN de la SIM se almacena con claves protegidas por LSKF. Si la SIM tiene su PIN habilitado, la interacción con el servidor RoR requiere una conexión WiFi para la actualización OTA y RoR basado en servidor, lo que garantiza la funcionalidad básica (con conectividad celular) después del reinicio.
El PIN de la tarjeta SIM se vuelve a cifrar y 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:
- La SIM se elimina o se restablece.
- El usuario deshabilita el PIN.
- Se ha producido un reinicio no iniciado por RoR.
El PIN de SIM almacenado solo se puede usar una vez después del reinicio iniciado por RoR, y solo por un tiempo muy corto (20 segundos), si los detalles de la tarjeta SIM coinciden. El PIN de SIM almacenado nunca sale de la aplicación TelephonyManager y no puede ser recuperado por módulos externos.
Pautas de implementación
En Android 12, las funciones RoR multicliente y basadas en servidor brindan una carga más liviana a los socios cuando envían actualizaciones OTA. Las actualizaciones necesarias pueden ocurrir durante tiempos de inactividad convenientes del dispositivo, como durante las horas de sueño designadas.
Para asegurarse de que las actualizaciones de OTA durante dichos períodos de tiempo no interrumpan a los usuarios, utilice el modo oscuro para mitigar las emisiones de luz. Para hacerlo, haga que el cargador de arranque del dispositivo busque la razón de la cadena unattended
. Si unattended
es true
, ponga el dispositivo en modo oscuro. Tenga en cuenta que es responsabilidad de cada OEM mitigar las emisiones de luz y sonido.
Si está actualizando a Android 12 o lanzando dispositivos Android 12, no necesita hacer nada para implementar la nueva funcionalidad RoR.
Hay una nueva llamada 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 necesita implementar esto, porque HAL está obsoleto a partir de Android 12.
Gestor de telefonía
El cliente OTA invoca la API del sistema TelephonyManager
cuando un reinicio es inminente en Android 12. Esta API mueve todos los códigos PIN en caché del estado AVAILABLE
al estado REBOOT_READY
. La API del sistema TelephonyManager
está protegida por el permiso REBOOT
Manifest 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 APK privilegiados utilizan la API del sistema TelephonyManager.
Pruebas
Para probar la nueva API, ejecute este comando:
adb shell cmd phone unattended-reboot
Este comando solo funciona cuando el shell se ejecuta como root ( adb root
).
Solo 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:
- Si el hardware de SoC admite la persistencia de RAM en los reinicios, los OEM pueden usar la implementación predeterminada en AOSP ( Fideicomiso de RAM predeterminado ).
- 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:
- Ser capaz de detectar un reinicio de la CPU principal.
- Tenga una fuente de temporizador de hardware que persista entre reinicios. Es decir, el enclave debe poder detectar el reinicio y expirar un temporizador establecido antes del reinicio.
- Admite el almacenamiento de una clave en custodia en la RAM/ROM del enclave de modo que no se pueda recuperar con ataques fuera de línea. Debe almacenar la clave RoR de manera que sea imposible recuperarla para los atacantes o personas internas.
Custodia de RAM predeterminada
AOSP tiene una implementación de RoR HAL usando persistencia RAM. Para que esto funcione, los OEM deben asegurarse de que sus SoC admitan la persistencia de RAM en 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 para esto en la siguiente sección.
Flujo de actualización OTA usando RoR
La aplicación de cliente 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 en su lugar, el flujo de una actualización sigue estos pasos:
- La aplicación cliente OTA descarga la actualización.
- La aplicación de cliente OTA llama a
RecoverySystem#prepareForUnattendedUpdate
lo que hace que se solicite al usuario su PIN, patrón o contraseña en la pantalla de bloqueo durante el próximo desbloqueo. - El usuario desbloquea el dispositivo en la pantalla de bloqueo y el dispositivo está listo para que se aplique la actualización.
- La aplicación de cliente OTA llama a
RecoverySystem#rebootAndApply
, lo que activa inmediatamente un reinicio.
Al final de este flujo, el dispositivo se reinicia y el mecanismo RoR desbloquea el almacenamiento de credenciales cifradas (CE). Para las aplicaciones, esto aparece como un desbloqueo de usuario normal, por lo que reciben todas las señales, como ACTION_LOCKED_BOOT_COMPLETED y ACTION_BOOT_COMPLETED que normalmente reciben.
Modificación de configuraciones de productos
Un producto marcado como compatible con la función RoR en Android 11 debe incluir una implementación de RebootEscrow HAL e incluir el archivo XML del marcador de funciones. La implementación predeterminada funciona bien en dispositivos que utilizan un reinicio en caliente (cuando la DRAM permanece encendida durante el reinicio).
Reiniciar marcador de función de depósito en garantía
El marcador de características 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 de HAL de depósito en garantía de reinicio predeterminado
Para usar la implementación predeterminada, debe reservar 65536 (0x10000) bytes. Nunca escriba estos bytes en un almacenamiento no volátil para garantizar 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, debe reservar memoria para una región pmem
. El siguiente ejemplo muestra la reserva de 0x50000000
:
reserved-memory {
my_reservation@0x50000000 {
no-map;
reg = <0x50000000 0x10000>;
}
}
reboot_escrow@0 {
compatible = "pmem-region";
reg = <0x50000000 0x10000>;
};
Verifique que tenga un nuevo dispositivo en el directorio de bloques con un nombre como /dev/block/pmem0
(como pmem1
o pmem2
).
Cambios en Device.mk
Suponiendo que su nuevo dispositivo del paso anterior se llame pmem0
, debe asegurarse 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
Agregue estas nuevas entradas a 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