Acabo de instalar Marshmallow en un Nexus 5 a través de una actualización actualizada. Estoy confundido sobre la forma en que funciona el cifrado. Tengo buenos conocimientos técnicos de cifrado en computadoras. Me gustaría obtener un conocimiento similar sobre Android 6.
Lo siguiente es lo que hice y cómo me confundí. Después de un restablecimiento de fábrica, configuré un PIN y luego cifré el dispositivo. En el arranque, me pidió mi PIN, que era de esperar. Luego eliminé el PIN y reinicié el dispositivo. No solicitó ningún PIN en el arranque, pero el dispositivo aún se informó como cifrado en el menú de configuración. Esto último es lo que me confunde, ya que esperaba que el PIN desbloqueara la clave de descifrado.
Preguntas:
- En el caso del cifrado sin PIN, ¿de dónde viene la clave de descifrado? Supongo que está almacenado en un chip similar a un TPM, ¿es esto correcto? Si es así, ¿qué impide que un hacker solicite esta clave del chip? ¿Comprueba el hash del firmware? ¿Algo más? Los detalles técnicos serían muy apreciados.
- En el caso del cifrado con un PIN, ¿se utiliza el PIN como un token adicional para acceder a la clave de descifrado? ¿O el proceso de descifrado funciona exactamente como si no hubiera PIN?
TL; DL respuesta:
La clave de descifrado se desbloquea con todo lo siguiente:
- El PIN (o contraseña, etc.) o una contraseña predeterminada si no hay ninguna
- Un TEE (un generador de firma respaldado por hardware que usa claves que no se pueden extraer)
- Una sal (fácilmente disponible pero que evita los ataques de las mesas arcoiris)
fuente
Respuestas:
Estoy citando el Manual de Android aquí , pero:
NOTA:
La fuente que he usado no es directamente relevante para Marshmallow pero es relevante para Lollipop y superior.
TL: DR
Solo abordaré las preguntas del OP ahora. Los detalles técnicos seguirán.
La clave de cifrado predeterminada proviene de una fuente de hardware (un chip similar a un TPM) y la contraseña predeterminada de AOSP definida como
default_password
en elcryptfs.c
archivo fuente, ver más abajo.Sí, no solo el valor predeterminado, sino que cualquier contraseña se convierte en una clave y se almacena en un chip similar a TPM, llamado TEE (abreviatura de "Entorno de ejecución de confianza", consulte a continuación para obtener más detalles).
Un pirata informático con acceso UART / JTAG a los chips en el SoC del dispositivo técnicamente podría obtener acceso a la clave TEE, o un núcleo personalizado puede filtrar esta información a un pirata informático. Algunas agencias de 3 letras en teorías de conspiración posiblemente se pueden asociar con el OEM para hacer que estos núcleos inseguros se utilicen en dispositivos de producción, pero no dejaría muchas tiendas. Nuevamente, vea la última sección de esta respuesta para más detalles.
Lo único que impide que un pirata informático tenga acceso a la clave es la gran cantidad de esfuerzo necesario para hacerlo.
dm-verity
. Sin embargo, esto es independiente del estado de cifrado.Fuente: guía de seguridad de AOSP aquí .
Visión general
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 predeterminada definida en el archivo cryptfs.c de Android Open Source Project .
Cuando el usuario establece el PIN / pase o contraseña en el dispositivo, solo la clave de 128 bits se vuelve a cifrar y se almacena. (es decir, los cambios de PIN / pase / patrón de usuario NO provocan el encriptado de la partición de datos de usuario).
Iniciar un dispositivo cifrado con cifrado predeterminado
Esto es lo que sucede cuando inicia un dispositivo encriptado sin contraseña. Debido a que los dispositivos Android 5.0 se cifran en el primer inicio, no debe haber una contraseña establecida y, por lo tanto, este es el estado de cifrado predeterminado.
Detecta que el dispositivo Android está encriptado porque / datos no se pueden montar y uno de los indicadores
encryptable
oforceencrypt
está configurado.vold
se establecevold.decrypt
entrigger_default_encryption
, que inicia eldefaultcrypto
servicio.trigger_default_encryption
comprueba el tipo de cifrado para ver si / data está cifrado con o sin contraseña.Crea el
dm-crypt
dispositivo sobre el dispositivo de bloque para que esté listo para usar.vold
luego monta la partición descifrada real / datos y luego prepara la nueva partición. Establece la propiedadvold.post_fs_data_done
en0
y luego establecevold.decrypt
entrigger_post_fs_data
. Esto haceinit.rc
que ejecute suspost-fs-data
comandos. Crearán los directorios o enlaces necesarios y luego se estableceránvold.post_fs_data_done
en1
.Una vez que
vold
ve el 1 de esa propiedad, que establece la propiedadvold.decrypt
a:trigger_restart_framework
. Esto haceinit.rc
que los servicios se inicienmain
nuevamente en clase y que también se inicien en clase late_start por primera vez desde el arranque.Ahora, el marco inicia todos sus servicios utilizando el descifrado / datos, y el sistema está listo para usar.
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.
Detecta que el dispositivo Android está encriptado porque la bandera
ro.crypto.state = "encrypted"
vold
se establecevold.decrypt
entrigger_restart_min_framework
porque / data se cifra con una contraseña.init
establece cinco propiedades para guardar las opciones de montaje iniciales dadas para / datos con parámetros pasados desdeinit.rc
.vold
usa estas propiedades para configurar el mapeo criptográfico:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(Número hexadecimal ASCII de 8 dígitos precedido por 0x)El marco se inicia y ve que
vold.decrypt
está configurado entrigger_restart_min_framework
. Esto le dice al framework que se está iniciando en untmpfs /data
disco y que necesita obtener la contraseña del usuario.Primero, sin embargo, debe asegurarse de que el disco esté encriptado correctamente. Envía el comando
cryptfs cryptocomplete
avold
.vold
devuelve 0 si el cifrado se completó con éxito, -1 en caso de error interno o -2 si el cifrado no se completó con éxito.vold
determina esto buscando en la metadata de cifrado laCRYPTO_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 y restablecer de fábrica el dispositivo, y darle al usuario un botón para presionar para hacerlo.Una vez que
cryptfs cryptocomplete
tiene éxito, el marco muestra una IU que solicita la contraseña del disco. La IU verifica la contraseña enviando el comandocryptfs checkpw
avold
. Si la contraseña es correcta (que se determina al montar con éxito el descifrado/data
en una ubicación temporal y luego desmontarlo), vold guarda el nombre del dispositivo de bloque descifrado en la propiedadro.crypto.fs_crypto_blkdev
y devuelve el estado 0 a la IU. Si la contraseña es incorrecta, devuelve -1 a la IU.La interfaz de usuario muestra un gráfico de arranque criptográfico y luego llama a vold con el comando
cryptfs restart
.vold
establece la propiedadvold.decrypt
entrigger_reset_main
, lo que haceinit.rc
que lo hagaclass_reset main
. Esto detiene todos los servicios de lamain
clase, lo que permitetmpfs /data
desmontarlos.vold
luego monta la/data
partición real descifrada y prepara la nueva partición (que tal vez nunca se haya preparado si estaba encriptada con la opción de borrado, que no es compatible con la primera versión). Establece la propiedadvold.post_fs_data_done
en0
y luego establecevold.decrypt
entrigger_post_fs_data
. Esto haceinit.rc
que se ejecute supost-fs-data commands
. Crearán los directorios o enlaces necesarios y luego se estableceránvold.post_fs_data_done
en1
. Una vez quevold
ve el1
en esa propiedad, establece la propiedadvold.decrypt
entrigger_restart_framework
. Esto haceinit.rc
que los servicios se inicienmain
nuevamente en clase y que también se inicien en claselate_start
por primera vez desde el inicio.Ahora, el marco inicia todos sus servicios utilizando el sistema de archivos descifrado / datos, y el sistema está listo para su uso.
Almacenar la clave encriptada
La clave cifrada se almacena en los metadatos criptográficos. El respaldo de hardware se implementa utilizando la capacidad de firma de Trusted Execution Environment (TEE). Anteriormente, ciframos la clave maestra con una clave generada aplicando
scrypt
la contraseña del usuario y la sal almacenada.Para que la clave sea resistente a los ataques fuera de la caja, ampliamos este algoritmo firmando la clave resultante con una clave TEE almacenada. La firma resultante se convierte en una clave de longitud apropiada por una aplicación más de
scrypt
. Esta clave se usa para cifrar y descifrar la clave maestra. Para almacenar esta clave:scrypt
a la contraseña de usuario y la sal para producir la clave intermedia de 32 bytes 1 (IK1).scrypt
a IK2 y sal (la misma sal que en el paso 2) para producir IK3 de 32 bytes.fuente