Encriptación de metadatos

Android 7.0 y versiones posteriores son compatibles con encriptación basada en archivos (FBE). FBE Permite encriptar distintos archivos con diferentes claves que se pueden desbloquear de forma independiente. Estas claves se usan para encriptar contenidos y nombres de archivos. Cuando se usa FBE, otra información, como los diseños de directorio, el tamaño de los archivos y los horarios de creación o modificación, no está encriptado. En conjunto, esta otra información se conoce como metadatos del sistema de archivos.

En Android 9, se introdujo compatibilidad con la encriptación de metadatos. Con la encriptación de metadatos, una sola clave presente en el inicio encripta lo que sea el contenido no está encriptado por FBE. Esta clave está protegida por Keymaster, que, en turno está protegido por el inicio verificado.

La encriptación de metadatos siempre está habilitada en el almacenamiento adoptable siempre que el FBE esté habilitado. La encriptación de metadatos también se puede habilitar en el almacenamiento interno. Dispositivos lanzados con Android 11 o versiones posteriores debe tener encriptación de metadatos en el almacenamiento interno habilitado.

Implementación en el almacenamiento interno

Puedes configurar la encriptación de metadatos en el almacenamiento interno de los dispositivos nuevos de las siguientes maneras: configurar el sistema de archivos metadata, cambiar la secuencia de inicio y habilitar la encriptación de metadatos en el archivo fstab del dispositivo.

Requisitos previos

La encriptación de metadatos solo se puede configurar cuando se inicia la partición de datos por primera vez con formato. Por lo tanto, esta función solo está disponible para dispositivos nuevos. no es algo que una OTA debería cambiar.

La encriptación de metadatos requiere que el módulo dm-default-key se habilitado en tu kernel. En Android 11 y versiones posteriores, dm-default-key es compatible con los kernels comunes de Android, versión 4.14 y versiones posteriores Esta versión de dm-default-key usa un hardware y framework de encriptación independiente del proveedor llamado blk-crypto.

Para habilitar dm-default-key, usa lo siguiente:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key usa hardware de encriptación intercalada (hardware que que encripta/desencripta datos mientras están en el camino hacia/desde el dispositivo de almacenamiento) cuando disponibles. Si no usarás hardware de encriptación intercalada, es también es necesario para habilitar un resguardo a la API de criptografía del kernel:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

Cuando no uses hardware de encriptación intercalada, también debes habilitar cualquier Aceleración basada en la CPU, como se recomienda en la documentación de FBE

En Android 10 y versiones anteriores, dm-default-key no era compatible con el kernel común de Android. Por lo tanto, dependía de los proveedores para implementar dm-default-key.

Configura el sistema de archivos de metadatos

Debido a que no se puede leer nada en la partición userdata hasta que los metadatos clave de encriptación, la tabla particionada debe reservar un bloque separado partición llamada “partición de metadatos” para almacenar los BLOB de keymaster que proteger esta clave. La partición de metadatos debe ser de 16 MB.

fstab.hardware debe incluir una entrada para el sistema de archivos de metadatos. que se encuentra en esa partición y la activa en /metadata, lo que incluye la marca formattable para garantizar que tenga formato en el momento del inicio El El sistema de archivos f2fs no funciona en particiones más pequeñas; recomendamos usar la extensión ext4 en su lugar. Por ejemplo:

/dev/block/bootdevice/by-name/metadata              /metadata          ext4        noatime,nosuid,nodev,discard                          wait,check,formattable

Para asegurarte de que exista el punto de activación /metadata, agrega la siguiente línea a BoardConfig-common.mk:

BOARD_USES_METADATA_PARTITION := true

Cambios en la secuencia de inicio

Cuando se usa la encriptación de metadatos, se debe ejecutar vold antes Se activó /data. Para asegurarte de que se inicie con suficiente antelación, agrega la siguiente estrofa a init.hardware.rc:

# We need vold early for metadata encryption
on early-fs
    start vold

Keymaster debe estar en ejecución y listo antes de que el comando init intente activarse. /data

init.hardware.rc ya debe contener un mount_all. instrucción que activa /data en la estrofa on late-fs. Antes de esta línea, agrega la directiva para ejecutar la Servicio wait_for_keymaster:

on late-fs
    
    # Wait for keymaster
    exec_start wait_for_keymaster

    # Mount RW partitions which need run fsck
    mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late

Activando la encriptación de metadatos

Por último, agrega keydirectory=/metadata/vold/metadata_encryption al la columna fs_mgr_flags de la entrada fstab para userdata Por ejemplo, una línea fstab completa se vería de la siguiente manera:

/dev/block/bootdevice/by-name/userdata              /data              f2fs        noatime,nosuid,nodev,discard,inlinecrypt latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable

De forma predeterminada, el algoritmo de encriptación de metadatos AES-256-XTS Esto se puede anular estableciendo la metadata_encryption, también en la Columna fs_mgr_flags:

  • En los dispositivos sin aceleración AES, es posible que se aplique la encriptación Adiantum habilitado mediante la configuración de metadata_encryption=adiantum.
  • En dispositivos que admiten llaves unidas en hardware, la clave de encriptación de metadatos puede unirse al hardware estableciendo metadata_encryption=aes-256-xts:wrappedkey_v0 (o equivalente a metadata_encryption=:wrappedkey_v0, ya que aes-256-xts es el algoritmo predeterminado).

Debido a que la interfaz del kernel a dm-default-key cambió en Android 11, también debes asegurarte de haber establecido el valor correcto para PRODUCT_SHIPPING_API_LEVEL en device.mk Por ejemplo, si tu dispositivo se inicia con Android 11 (nivel de API 30), device.mk debería contienen:

PRODUCT_SHIPPING_API_LEVEL := 30

También puedes establecer la siguiente propiedad del sistema para forzar el uso de la nueva API de dm-default-key, independientemente del nivel de API de envío:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.dm_default_key.options_format.version=2

Validación

Para verificar que la encriptación de metadatos esté habilitada y funcione correctamente, ejecuta el siguiente comando: de prueba que se describen a continuación. También ten en cuenta las problemas que se describen a continuación.

Pruebas

Comienza ejecutando el siguiente comando para verificar que la encriptación de metadatos esté habilitado en el almacenamiento interno:

adb root
adb shell dmctl table userdata

El resultado debería ser similar al siguiente:

Targets in the device-mapper table for userdata:
0-4194304: default-key, aes-xts-plain64 - 0 252:2 0 3 allow_discards sector_size:4096 iv_large_sectors

Si anulaste la configuración de encriptación predeterminada al establecer La opción metadata_encryption en el fstab del dispositivo y, luego, el resultado diferirá un poco del anterior. Por ejemplo, si habilitaste la encriptación Adiantum, el tercero campo será xchacha12,aes-adiantum-plain64 en lugar de aes-xts-plain64

A continuación, ejecuta vts_kernel_encryption_test para verificar la precisión de la encriptación de metadatos y el FBE:

atest vts_kernel_encryption_test

O bien:

vts-tradefed run vts -m vts_kernel_encryption_test

Problemas comunes

Durante la llamada a mount_all, que activa los metadatos encriptados La partición /data, init ejecuta la herramienta vdc. La VDC La herramienta se conecta a vold mediante binder para configurar la con encriptación de metadatos y activar la partición. Mientras dure este llamada, init se bloquea y, luego, intenta leer o configurar Se bloquearán las propiedades init hasta que finalice mount_all. Si, en esta etapa, cualquier parte del trabajo de vold está directamente o Se bloqueará indirectamente durante la lectura o configuración de una propiedad y se producirá un interbloqueo. Sí importante para asegurarse de que vold pueda completar el trabajo de lectura del claves, la interacción con Keymaster y la activación del directorio de datos sin interactuando aún más con init.

Si Keymaster no se inicia por completo cuando se ejecuta mount_all, no se completará responde a vold hasta que haya leído ciertas propiedades de init, que da como resultado exactamente el interbloqueo descrito Ubicación exec_start wait_for_keymaster por encima del valor relevante La invocación de mount_all como se indica garantiza que Keymaster esté completamente se ejecute con anticipación y, por lo tanto, evita este interbloqueo.

Configuración del almacenamiento adoptable

A partir de Android 9, una forma de encriptación de metadatos es Siempre se habilita en el almacenamiento adoptable. siempre que FBE esté habilitada, incluso cuando la encriptación de metadatos no esté habilitada almacenamiento interno.

En el AOSP, hay dos implementaciones de encriptación de metadatos almacenamiento: uno obsoleto basado en dm-crypt y uno más reciente basado en en dm-default-key. Para garantizar que se realice para tu dispositivo, asegúrate de haber establecido el valor correcto para PRODUCT_SHIPPING_API_LEVEL en device.mk. Por ejemplo: Si tu dispositivo se inicia con Android 11 (nivel de API 30), device.mk debe contener lo siguiente:

PRODUCT_SHIPPING_API_LEVEL := 30

También puedes definir las siguientes propiedades del sistema para forzar el uso de la nueva método de encriptación de metadatos de volumen (y la nueva versión de política de FBE predeterminada) independientemente del nivel de API de envío:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.volume.metadata.method=dm-default-key \
    ro.crypto.dm_default_key.options_format.version=2 \
    ro.crypto.volume.options=::v2

Método actual

En los dispositivos que se lanzan con Android 11 o versiones posteriores, haz lo siguiente: la encriptación de metadatos en el almacenamiento adoptable utiliza el dm-default-key módulo de kernel, al igual que en el almacenamiento interno. Consulta los requisitos previos anteriores para saber qué configuración de kernel que habilitar. Ten en cuenta que el hardware de encriptación integrada que funciona el almacenamiento interno del dispositivo no esté disponible en el almacenamiento adoptable y, por lo tanto, Es posible que el campo CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y sea obligatorio.

De forma predeterminada, el método de encriptación de metadatos del volumen dm-default-key usa el algoritmo de encriptación AES-256-XTS con sectores criptográficos de 4,096 bytes. El se puede anular con la configuración Propiedad del sistema ro.crypto.volume.metadata.encryption. Esta el valor de la propiedad tiene la misma sintaxis que metadata_encryption. fstab descrita anteriormente. Por ejemplo, en dispositivos sin AES aceleración, encriptación Adiantum puede habilitarse estableciendo ro.crypto.volume.metadata.encryption=adiantum

Método heredado

En dispositivos que se lanzan con Android 10 o versiones anteriores, los metadatos la encriptación en el almacenamiento adoptable usa el módulo de kernel dm-crypt en lugar de dm-default-key:

CONFIG_DM_CRYPT=y

A diferencia del método dm-default-key, el método dm-crypt hace que el contenido del archivo se encripte dos veces: una con una clave FBE y otra con la clave de encriptación de metadatos. Esta doble encriptación reduce el rendimiento y es no es necesario para lograr los objetivos de seguridad de la encriptación de metadatos, ya que Android garantiza que las claves de FBE sean al menos tan difíciles de comprometer como los metadatos clave de encriptación. Los proveedores pueden personalizar el kernel para evitar la duplicación encriptación, en particular, implementando allow_encrypt_override a la que pasará Android dm-crypt cuando la propiedad del sistema ro.crypto.allow_encrypt_override se establece en true. Estas personalizaciones no son compatibles con el kernel común de Android.

De forma predeterminada, el método de encriptación de metadatos del volumen dm-crypt usa el Algoritmo de encriptación AES-128-CBC con sectores ESSIV y criptográficos de 512 bytes. Esta se puede anular configurando las siguientes propiedades del sistema (que también para FDE):

  • ro.crypto.fde_algorithm selecciona la encriptación de metadatos. de codificador-decodificador. Las opciones son aes-128-cbc y adiantum Adiantum solo se puede usar si la no tenga aceleración AES.
  • ro.crypto.fde_sector_size selecciona el tamaño del sector de las criptomonedas. Las opciones son 512, 1024, 2048 y 4096. Para la encriptación Adiantum, usa 4,096.