Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Cifrado de disco completo

El cifrado de disco completo es el proceso de codificar todos los datos del usuario en un dispositivo Android mediante una clave cifrada. Una vez que un dispositivo está encriptado, todos los datos creados por el usuario se encriptan automáticamente antes de enviarlos al disco y todas las lecturas desencriptan automáticamente los datos antes de devolverlos al proceso de llamada.

El cifrado de disco completo se introdujo en Android en 4.4, pero Android 5.0 introdujo estas nuevas características:

  • Se creó un cifrado rápido, que solo cifra los bloques usados ​​en la partición de datos para evitar que el primer arranque tarde mucho tiempo. Actualmente, solo los sistemas de archivos ext4 y f2fs admiten el cifrado rápido.
  • Se ha añadido la forceencrypt bandera fstab para cifrar en el primer arranque.
  • Se agregó soporte para patrones y cifrado sin contraseña.
  • Se agregó almacenamiento respaldado por hardware de la clave de cifrado utilizando la capacidad de firma de Trusted Execution Environment (TEE) (como en un TrustZone). Ver Almacenar la clave cifrada para más detalles.

Precaución: los dispositivos actualizados a Android 5.0 y luego cifrados pueden ser devueltos a un estado sin cifrar por Restablecer datos de fábrica. Los nuevos dispositivos Android 5.0 cifrados en el primer arranque no se pueden devolver a un estado sin cifrar.

Cómo funciona el cifrado de disco completo de Android

Cifrado de disco completo Android se basa en dm-crypt , que es una característica del núcleo que funciona en la capa de dispositivo de bloque. Debido a esto, las obras de cifrado con MultiMediaCard Embedded (eMMC) y dispositivos similares flash que se presentan al núcleo como dispositivos de bloque. El cifrado no es posible con YAFFS, que se comunica directamente con un chip flash NAND sin procesar.

El algoritmo de cifrado es 128 Advanced Encryption Standard (AES) con encadenamiento de bloques de cifrado (CBC) y ESSIV: SHA256. La clave maestra está encriptada con AES de 128 bits a través de llamadas a la biblioteca OpenSSL. Debe utilizar 128 bits o más para la clave (siendo 256 opcional).

Nota: OEM pueden utilizar 128 bits o superior para cifrar la clave maestra.

En la versión de Android 5.0, hay cuatro tipos de estados de cifrado:

  • defecto
  • ALFILER
  • contraseña
  • patrón

En el primer arranque, el dispositivo crea una clave maestra de 128 bits generada aleatoriamente y luego la codifica con una contraseña predeterminada y sal almacenada. La contraseña predeterminada es: "default_password" Sin embargo, el hash resultante también se firma a través de un TEE (como TrustZone), que utiliza un hash de la firma para cifrar la clave maestra.

Puede encontrar la contraseña por defecto definido en el Android Open Source Project cryptfs.cpp archivo.

Cuando el usuario establece el PIN / contraseña o contraseña en el dispositivo, solo se vuelve a cifrar y almacenar la clave de 128 bits. (PIN de usuario / contraseña es decir cambios. / patrón no causan re-cifrado de datos de usuario.) Tenga en cuenta que el dispositivo gestionado puede estar sujeto a restricciones PIN, patrón o contraseña.

Encriptación es administrado por init y vold . init llama vold , y Vold conjuntos de propiedades a eventos de disparo en init. Otras partes del sistema también miran las propiedades para realizar tareas como informar el estado, solicitar una contraseña o solicitar el restablecimiento de fábrica en caso de un error fatal. Para invocar funciones de cifrado en vold , el sistema utiliza la herramienta de línea de comandos vdc 's cryptfs comandos: checkpw , restart , enablecrypto , changepw , cryptocomplete , verifypw , setfield , getfield , mountdefaultencrypted , getpwtype , getpw y clearpw .

Con el fin de cifrar, descifrar o limpiar /data , /data no deben ser montadas. Sin embargo, con el fin de mostrar ninguna interfaz de usuario (IU), el marco debe iniciar y requiere el marco /data ejecutar. Para resolver este dilema, un sistema de archivos temporales se monta en /data . Esto permite que Android solicite contraseñas, muestre el progreso o sugiera una eliminación de datos según sea necesario. Se impone la limitación de que el fin de interruptor del sistema de ficheros temporal a la verdadera /data del sistema de archivos, el sistema debe detener todos los procesos con los archivos abiertos en el sistema de archivos temporales y reiniciar los procesos en el verdadero /data del sistema de ficheros. Para ello, todos los servicios deben estar en uno de tres grupos: core , main , y late_start .

  • core : Nunca apague después de comenzar.
  • main : abajo cerrado y reinicie después de que se introduzca la contraseña del disco.
  • late_start : no comienza hasta después de /data ha descifrado y montado.

Para activar estas acciones, el vold.decrypt propiedad se establece en varias cadenas . Para matar y reiniciar los servicios, las init comandos son:

  • class_reset : Detiene un servicio, pero permite que se reanudará con class_start.
  • class_start : Reinicia un servicio.
  • class_stop : Detiene un servicio y añade un SVC_DISABLED bandera. Servicios detenidos no responden a class_start .

Flujos

Hay cuatro flujos para un dispositivo cifrado. Un dispositivo se cifra solo una vez y luego sigue un flujo de arranque normal.

  • Cifre un dispositivo previamente sin cifrar:
    • Cifrar un nuevo dispositivo con forceencrypt : encriptación obligatoria en el primer arranque (a partir de Android L).
    • Cifrar un dispositivo existente: cifrado iniciado por el usuario (Android K y versiones anteriores).
  • Arranque un dispositivo encriptado:
    • Iniciar un dispositivo encriptado sin contraseña: iniciar un dispositivo encriptado que no tiene una contraseña establecida (relevante para dispositivos con Android 5.0 y posterior).
    • Iniciar un dispositivo encriptado con una contraseña: iniciar un dispositivo encriptado que tiene una contraseña establecida.

Además de estos flujos, el dispositivo también puede fallar para cifrar /data . Cada uno de los flujos se explica en detalle a continuación.

Cifre un nuevo dispositivo con forceencrypt

Este es el primer arranque normal para un dispositivo Android 5.0.

  1. Detectar sistema de archivos sin cifrar con forceencrypt bandera

    /data no están cifrados, pero necesita ser debido forceencrypt mandatos de IT. Desmontar /data .

  2. Inicio de encriptación /data

    vold.decrypt = "trigger_encryption" disparadores init.rc , lo que hará que vold para cifrar /data sin contraseña. (Ninguno está configurado porque debe ser un dispositivo nuevo).

  3. Monte tmpfs

    vold monta un tmpfs /data (utilizando los tmpfs Opciones de ro.crypto.tmpfs_options ) y establece la propiedad vold.encrypt_progress a 0. vold prepepares los TMPFS /data para arrancar un sistema y conjuntos de cifrado la propiedad vold.decrypt a: trigger_restart_min_framework

  4. Traiga el marco para mostrar el progreso

    Debido a que el dispositivo prácticamente no tiene datos para cifrar, la barra de progreso a menudo no aparecerá porque el cifrado ocurre muy rápido. Ver Cifrar un dispositivo existente para más detalles acerca de la interfaz de usuario progreso.

  5. Cuando /data están cifrados, acabar con el marco

    vold conjuntos vold.decrypt a trigger_default_encryption que comienza el defaultcrypto servicio. (Esto inicia el flujo de abajo para montar un userdata encriptado predeterminado.) trigger_default_encryption comprueba el tipo de cifrado para ver si /data se cifran con o sin una contraseña. Debido a que los dispositivos Android 5.0 están encriptados en el primer arranque, no debería haber una contraseña establecida; Por lo tanto, descifrar y punto de montaje /data .

  6. Monte /data

    init entonces montajes /data en un tmpfs RAMDISK utilizando parámetros que recoge desde ro.crypto.tmpfs_options , que se fija en init.rc .

  7. Iniciar marco

    Conjunto vold a trigger_restart_framework , que continúa el proceso de arranque habitual.

Cifrar un dispositivo existente

Esto es lo que sucede cuando se cifra un dispositivo Android K sin cifrar o un dispositivo anterior que se ha migrado a L.

Este proceso lo inicia el usuario y se denomina "encriptación in situ" en el código. Cuando un usuario selecciona encriptar un dispositivo, la interfaz de usuario se asegura de que la batería esté completamente cargada y el adaptador de CA esté enchufado para que haya suficiente energía para finalizar el proceso de encriptación.

Advertencia: Si el dispositivo se queda sin energía y se apaga antes de que haya terminado de encriptación, los datos del archivo se deja en un estado parcialmente cifrada. El dispositivo debe restablecerse de fábrica y se perderán todos los datos.

Para activar el cifrado in-situ, vold se inicia un bucle para leer cada sector del dispositivo de bloque real y luego escribir al dispositivo de bloques de cifrado. vold comprueba si un sector está en uso antes de la lectura y la escritura, lo que hace mucho más rápido cifrado en un nuevo dispositivo que tiene poco o nada de datos.

Estado del dispositivo: Conjunto ro.crypto.state = "unencrypted" y ejecutar el on nonencrypted init gatillo para continuar el arranque.

  1. Comprobar contraseña

    La interfaz de usuario llama vold con el comando cryptfs enablecrypto inplace donde passwd es una contraseña de bloqueo de pantalla del usuario.

  2. Derriba el marco

    vold comprueba los errores, devuelve -1 si no se puede cifrar, e imprime un motivo en el registro. Si se puede cifrar, se establece la propiedad vold.decrypt a trigger_shutdown_framework . Esto causa init.rc para detener los servicios en las clases late_start y main .

  3. Crea un pie de página criptográfico
  4. Crea un archivo de ruta de navegación
  5. Reiniciar
  6. Detectar archivo de ruta de navegación
  7. Inicio de encriptación /data

    vold luego activa el mapeo de cifrado, lo que crea un dispositivo de bloques de cifrado virtual que hace mapeo sobre el dispositivo de bloque real, pero encripta cada sector, como está escrito, y descifra cada sector, ya que se lee. vold luego crea y escribe a cabo los metadatos de cifrado.

  8. Mientras se encripta, monte tmpfs

    vold montajes tmpfs /data (utilizando las opciones de tmpfs ro.crypto.tmpfs_options ) y establece la propiedad vold.encrypt_progress a 0. vold prepara los TMPFS /data para arrancar un sistema de cifrado y establece la propiedad vold.decrypt a: trigger_restart_min_framework

  9. Traiga el marco para mostrar el progreso

    trigger_restart_min_framework causa init.rc para iniciar la main clase de servicios. Cuando el marco ve que vold.encrypt_progress se establece en 0, que nos lleva a la barra de progreso de la interfaz de usuario, que pregunta en que la propiedad cada cinco segundos y actualiza una barra de progreso. Las actualizaciones de bucle cifrado vold.encrypt_progress cada vez que se cifra a otra por ciento de la partición.

  10. Cuando /data están cifrados, actualizar el pie de página cripto

    Cuando /data se cifran con éxito, vold borra la bandera ENCRYPTION_IN_PROGRESS en los metadatos.

    Cuando el dispositivo se desbloquea con éxito, la contraseña se utiliza para cifrar la clave maestra y se actualiza el pie de página criptográfico.

    Si el reinicio falla por alguna razón, vold establece la propiedad vold.encrypt_progress a error_reboot_failed y la interfaz de usuario debe mostrar un mensaje que pide al usuario que pulse un botón para reiniciar el sistema. No se espera que esto ocurra nunca.

Iniciar un dispositivo cifrado con cifrado predeterminado

Esto es lo que sucede cuando inicia un dispositivo cifrado sin contraseña. Dado que los dispositivos Android 5.0 se cifran en el primer arranque, no debería haber ninguna contraseña establecida y por lo tanto este es el estado de cifrado predeterminada.

  1. Detectar cifrados /data sin contraseña

    Detectar que el dispositivo Android está cifrada porque /data no se pueden montar y una de las banderas encryptable o forceencrypt se establece.

    vold conjuntos vold.decrypt a trigger_default_encryption , que inicia el defaultcrypto servicio. trigger_default_encryption comprueba el tipo de cifrado para ver si /data se cifran con o sin una contraseña.

  2. Descifrar / datos

    Crea el dm-crypt dispositivo sobre el dispositivo de bloque por lo que el dispositivo está listo para su uso.

  3. Montaje / datos

    vold continuación, monta el descifrado de bienes /data la partición y luego se prepara la nueva partición. Se establece la propiedad vold.post_fs_data_done a 0 y luego establece vold.decrypt a trigger_post_fs_data . Esto causa init.rc para ejecutar sus post-fs-data comandos. Se va a crear los directorios o enlaces necesarios y después fijar los vold.post_fs_data_done a 1.

    Una vez vold ve el 1 de esa propiedad, que establece la propiedad vold.decrypt a: trigger_restart_framework. Esto causa init.rc para iniciar servicios de la clase main de nuevo y también iniciar los servicios en la clase late_start por primera vez desde el inicio.

  4. Iniciar marco

    Ahora se inicia el marco de todos sus servicios utilizando los descifrados /data , y el sistema está listo para su uso.

Iniciar un dispositivo cifrado sin cifrado predeterminado

Esto es lo que sucede cuando inicia un dispositivo cifrado que tiene una contraseña establecida. La contraseña del dispositivo puede ser un pin, patrón o contraseña.

  1. Detectar dispositivo encriptado con contraseña

    Detectar que el dispositivo Android está cifrada porque la bandera ro.crypto.state = "encrypted"

    vold conjuntos vold.decrypt a trigger_restart_min_framework porque /data se cifran con una contraseña.

  2. Monte tmpfs

    init conjuntos de cinco propiedades para guardar las opciones iniciales dadas para montar /data con los parámetros pasados desde init.rc . vold utiliza estas propiedades para configurar el mapeo crypto:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (ASCII número hexadecimal de 8 dígitos precedidos por 0x)
  3. Inicie el marco para solicitar la contraseña

    El marco se inicia y se ve que vold.decrypt se establece en trigger_restart_min_framework . Esto le dice al marco que se está iniciando en un tmpfs /data en disco y que necesita para obtener la contraseña de usuario.

    Sin embargo, primero debe asegurarse de que el disco esté encriptado correctamente. Se envía el comando cryptfs cryptocomplete a vold . vold devuelve 0 si el cifrado se completó con éxito, -1 en caso de error interno o -2 si el cifrado no fue completada con éxito. vold determina esto mirando en los metadatos de cifrado para el CRYPTO_ENCRYPTION_IN_PROGRESS bandera. Si está configurado, el proceso de cifrado se interrumpió y no hay datos utilizables en el dispositivo. Si vold devuelve un error, la interfaz de usuario debe mostrar un mensaje al usuario para reiniciar el sistema y restablecimiento de fábrica en el dispositivo, y dar al usuario un botón de prensa para hacerlo.

  4. Descifrar datos con contraseña

    Una vez cryptfs cryptocomplete tiene éxito, se muestra el marco de una interfaz de usuario pidiendo la contraseña del disco. Los controles de interfaz de usuario la contraseña enviando el comando cryptfs checkpw a vold . Si la contraseña es correcta (que se determina mediante el montaje con éxito los descifrados /data a una ubicación temporal, y luego desmontarlo), vold guarda el nombre del dispositivo de bloques descifrada en la propiedad ro.crypto.fs_crypto_blkdev y devuelve el estado 0 a la interfaz de usuario . Si la contraseña es incorrecta, devuelve -1 a la interfaz de usuario.

  5. Detener marco

    Los pone de interfaz de usuario hasta un gráfico de arranque de cifrado y luego llama vold con el comando cryptfs restart . vold establece la propiedad vold.decrypt a trigger_reset_main , lo que provoca init.rc hacer class_reset main . Esto detiene todos los servicios en la clase principal, que permite a los TMPFS /data para ser desmontado.

  6. Monte /data

    vold continuación, monta el descifrado de bienes /data partición y prepara la nueva partición (que nunca puede haber sido preparado si se ha cifrado con la opción, que no está soportada en el primer comunicado de barrido). Se establece la propiedad vold.post_fs_data_done a 0 y luego establece vold.decrypt a trigger_post_fs_data . Esto causa init.rc para ejecutar sus post-fs-data comandos. Se va a crear los directorios o enlaces necesarios y después fijar los vold.post_fs_data_done a 1. Una vez vold ve el 1 de esa propiedad, que establece la propiedad vold.decrypt a trigger_restart_framework . Esto causa init.rc para iniciar servicios de la clase main de nuevo y también iniciar los servicios en la clase late_start por primera vez desde el inicio.

  7. Iniciar marco completo

    Ahora se inicia el marco de todos sus servicios utilizando el descifrado /data sistema de archivos, y el sistema está listo para su uso.

Falla

Un dispositivo que no se puede descifrar puede estar mal por varias razones. El dispositivo comienza con la serie normal de pasos para arrancar:

  1. Detectar dispositivo encriptado con contraseña
  2. Monte tmpfs
  3. Inicie el marco para solicitar la contraseña

Pero una vez que se abre el marco, el dispositivo puede encontrar algunos errores:

  • La contraseña coincide pero no puede descifrar los datos
  • El usuario ingresa una contraseña incorrecta 30 veces

Si estos errores no se resuelven, pedirle al usuario que limpie la fábrica:

Si vold detecta un error durante el proceso de cifrado, y si no hay datos se ha destruido todavía y el marco se ha terminado, vold establece la propiedad vold.encrypt_progress a error_not_encrypted . La interfaz de usuario solicita al usuario que reinicie y le advierte que el proceso de cifrado nunca se inició. Si el error se produce después de que el marco ha sido derribado, pero antes de que la barra de progreso de interfaz de usuario se ha terminado, vold se reiniciará el sistema. Si el reinicio falla, se establece vold.encrypt_progress a error_shutting_down y devuelve -1; pero no habrá nada para detectar el error. No se espera que esto suceda.

Si vold detecta un error durante el proceso de cifrado, se establece vold.encrypt_progress a error_partially_encrypted devoluciones y -1. La interfaz de usuario debe mostrar un mensaje que indique que el cifrado falló y proporcionar un botón para que el usuario restablezca el dispositivo de fábrica.

Almacenamiento de la clave cifrada

La clave cifrada se almacena en los metadatos criptográficos. El respaldo de hardware se implementa mediante el uso de la capacidad de firma de Trusted Execution Environment (TEE). Anteriormente, ciframos la clave maestra con una clave generada aplicando scrypt a la contraseña del usuario y al salt almacenado. Para hacer que la clave sea resistente contra ataques fuera de la caja, ampliamos este algoritmo firmando la clave resultante con una clave TEE almacenada. La firma resultante se convierte luego en una clave de longitud adecuada mediante una aplicación más de scrypt. Luego, esta clave se utiliza para cifrar y descifrar la clave maestra. Para almacenar esta clave:

  1. Genere una clave de cifrado de disco (DEK) aleatoria de 16 bytes y sal de 16 bytes.
  2. Aplique scrypt a la contraseña de usuario y la sal para producir la clave intermedia 1 de 32 bytes (IK1).
  3. Rellene IK1 con cero bytes al tamaño de la clave privada vinculada al hardware (HBK). Específicamente, rellenamos como: 00 || IK1 || 00..00; un byte cero, 32 bytes IK1, 223 bytes cero.
  4. Firme IK1 acolchado con HBK para producir IK2 de 256 bytes.
  5. Aplique scrypt a IK2 y sal (la misma sal que en el paso 2) para producir IK3 de 32 bytes.
  6. Utilice los primeros 16 bytes de IK3 como KEK y los últimos 16 bytes como IV.
  7. Cifre DEK con AES_CBC, con la clave KEK y el vector de inicialización IV.

Cambiar la contraseña

Cuando un usuario decide cambiar o eliminar la contraseña de configuración, la interfaz de usuario envía el comando cryptfs changepw a vold , y vold vuelve a cifrar la clave maestra de disco con la nueva contraseña.

Propiedades de cifrado

vold y init se comunican entre sí mediante el establecimiento de propiedades. A continuación, se muestra una lista de propiedades disponibles para el cifrado.

Propiedades Vold

Propiedad Descripción
vold.decrypt trigger_encryption Cifre la unidad sin contraseña.
vold.decrypt trigger_default_encryption Verifique la unidad para ver si está encriptada sin contraseña. Si lo es, descifrar y montarlo, otra serie vold.decrypt a trigger_restart_min_framework.
vold.decrypt trigger_reset_main Establecido por vold para apagar la interfaz de usuario solicitando la contraseña del disco.
vold.decrypt trigger_post_fs_data Establecido por vold de preparación /data con los directorios necesarios, et al.
vold.decrypt trigger_restart_framework Establecido por vold para iniciar el marco real y todos los servicios.
vold.decrypt trigger_shutdown_framework Establecido por vold para apagar el marco completo para iniciar el cifrado.
vold.decrypt trigger_restart_min_framework Establecido por vold para iniciar la interfaz de usuario de la barra de progreso para el cifrado o preguntar por el password, dependiendo del valor de ro.crypto.state .
vold.encrypt_progress Cuando se inicia el marco, si se establece esta propiedad, ingrese al modo de interfaz de usuario de la barra de progreso.
vold.encrypt_progress 0 to 100 La interfaz de usuario de la barra de progreso debe mostrar el valor de porcentaje establecido.
vold.encrypt_progress error_partially_encrypted La interfaz de usuario de la barra de progreso debe mostrar un mensaje de que el cifrado falló y darle al usuario la opción de restablecer el dispositivo de fábrica.
vold.encrypt_progress error_reboot_failed La interfaz de usuario de la barra de progreso debe mostrar un mensaje que diga que se completó el cifrado y darle al usuario un botón para reiniciar el dispositivo. No se espera que ocurra este error.
vold.encrypt_progress error_not_encrypted La interfaz de usuario de la barra de progreso debe mostrar un mensaje que indique que se produjo un error, que no se cifraron ni se perdieron datos, y que el usuario tenga un botón para reiniciar el sistema.
vold.encrypt_progress error_shutting_down La interfaz de usuario de la barra de progreso no se está ejecutando, por lo que no está claro quién responderá a este error. Y de todos modos, nunca debería suceder.
vold.post_fs_data_done 0 Establecido por vold justo antes de vold.decrypt a trigger_post_fs_data .
vold.post_fs_data_done 1 Conjunto de init.rc o init.rc justo después de terminar la tarea post-fs-data .

propiedades de inicio

Propiedad Descripción
ro.crypto.fs_crypto_blkdev Establecido por el vold comando checkpw para su uso posterior por el vold comando de restart .
ro.crypto.state unencrypted Conjunto por init para decir este sistema está funcionando con un sin cifrar /data ro.crypto.state encrypted . Establecido por init para decir este sistema se está ejecutando con una cifrados /data .

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

Estas propiedades se establecen cinco por init cuando se intenta montar /data con parámetros pasados desde init.rc . vold las utiliza para configurar el mapeo de cifrado.
ro.crypto.tmpfs_options Conjunto de init.rc con las opciones de inicio debe utilizar cuando se monta el tmpfs /data del sistema de ficheros.

Acciones de inicio

on post-fs-data
on nonencrypted
on property:vold.decrypt=trigger_reset_main
on property:vold.decrypt=trigger_post_fs_data
on property:vold.decrypt=trigger_restart_min_framework
on property:vold.decrypt=trigger_restart_framework
on property:vold.decrypt=trigger_shutdown_framework
on property:vold.decrypt=trigger_encryption
on property:vold.decrypt=trigger_default_encryption