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

Cifrado de metadatos

Android 7.0 y soportes superiores cifrado de archivos (FBE). FBE permite cifrar diferentes archivos con diferentes claves que se pueden desbloquear de forma independiente. Estas claves se utilizan para cifrar tanto el contenido como los nombres de los archivos. Cuando se usa FBE, otra información, como diseños de directorio, tamaños de archivo, permisos y tiempos de creación / modificación, no está encriptada. En conjunto, esta otra información se conoce como metadatos del sistema de archivos.

Android 9 introdujo la compatibilidad con el cifrado de metadatos. Con el cifrado de metadatos, una sola clave presente en el momento del arranque cifra cualquier contenido que no esté cifrado por FBE. Esta clave está protegida por Keymaster, que a su vez está protegido por arranque verificado.

Cifrado de metadatos siempre está habilitado en el almacenamiento adoptables cada vez que se habilita la FBE. El cifrado de metadatos también se puede habilitar en el almacenamiento interno. Los dispositivos lanzados con Android 11 o superior deben tener habilitado el cifrado de metadatos en el almacenamiento interno.

Implementación sobre almacenamiento interno

Puede configurar el cifrado de metadatos en el almacenamiento interno de nuevos dispositivos mediante la creación de la metadata del sistema de archivos, cambiar la secuencia de inicio, y que permite el cifrado de metadatos en el archivo fstab del dispositivo.

Prerrequisitos

El cifrado de metadatos solo se puede configurar cuando se formatea por primera vez la partición de datos. Como resultado, esta función es solo para dispositivos nuevos; esto no es algo que deba cambiar una OTA.

Cifrado de metadatos requiere que la dm-default-key módulo de ser activado en su núcleo. En Android 11 y superior, dm-default-key es apoyado por los núcleos comunes para Android, versión 4.14 y superiores. Esta versión del dm-default-key utiliza un hardware y el marco de cifrado independiente del proveedor llamada negro-cripto.

Para habilitar dm-default-key , utilice:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key usos en línea de hardware de encriptación (hardware que cifra / descifra los datos mientras se encuentra en el camino a / desde el dispositivo de almacenamiento) cuando esté disponible. Si no va a utilizar el hardware de encriptación en línea, sino que también es necesaria para permitir un retroceso a la API de criptografía del núcleo:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

Cuando no utilice el cifrado de hardware en línea también debe permitir a cualquier aceleración basada en CPU disponibles como se recomienda en la documentación de la FBE .

En Android 10 e inferiores, dm-default-key no fue apoyada por el núcleo común de Android. Por lo tanto, era hasta vendedores para implementar dm-default-key .

Configurar el sistema de archivos de metadatos

Debido a que no se puede leer nada en la partición de datos de usuario hasta que la clave de cifrado de metadatos esté presente, la tabla de particiones debe reservar una partición separada llamada "partición de metadatos" para almacenar los blobs de keymaster que protegen esta clave. La partición de metadatos debe ser de 16 MB.

fstab.hardware debe incluir una entrada para el sistema de ficheros de metadatos que vive en esa partición montarlo en /metadata , incluyendo el formattable bandera para asegurarse de que está formateado en el arranque. El sistema de archivos f2fs no funciona en particiones más pequeñas; recomendamos usar ext4 en su lugar. Por ejemplo:

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

Para asegurar el /metadata de montaje existe punto, añadir la siguiente línea al BoardConfig-common.mk :

BOARD_USES_METADATA_PARTITION := true

Cambios en la secuencia de inicio

Cuando se utiliza el cifrado de metadatos, vold debe ejecutar antes de /data está montado. Para asegurarse de que se comienza a tiempo, añada las siguientes líneas 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 intentos de inicio al montaje /data .

init.hardware.rc ya debe contener un mount_all de instrucciones que se monta /data sí mismo en el on late-fs estrofa. Antes de esta línea, añada la directiva a exec con el wait_for_keymaster servicio:

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

Activar el cifrado de metadatos

Finalmente añadir keydirectory=/metadata/vold/metadata_encryption a la columna de fs_mgr_flags del fstab entrada para userdata . Por ejemplo, una línea fstab completa podría verse así:

/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 cifrado de metadatos en el almacenamiento interno es AES-256-XTS. Esto se puede anular mediante el establecimiento de la metadata_encryption opción, también en la columna de la fs_mgr_flags:

  • En los dispositivos que carecen de AES aceleración, cifrado Adiantum puede habilitarse estableciendo metadata_encryption=adiantum .
  • En dispositivos que admiten teclas de hardware-envuelta , la clave de cifrado de metadatos pueden hacerse por hardware envuelto configurando metadata_encryption=aes-256-xts:wrappedkey_v0 (o equivalentemente metadata_encryption=:wrappedkey_v0 , como aes-256-xts es el algoritmo predeterminado).

Debido a que la interfaz del núcleo a dm-default-key cambió en Android 11, también hay que asegurarse de que ha establecido el valor correcto para PRODUCT_SHIPPING_API_LEVEL en device.mk . Por ejemplo, si sus lanzamientos de dispositivos con Android 11 (API nivel 30), device.mk deben contener:

PRODUCT_SHIPPING_API_LEVEL := 30

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

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

Validación

Para verificar que el cifrado de metadatos esté habilitado y funcione correctamente, ejecute las pruebas que se describen a continuación. También ser conscientes de los problemas comunes que se describen a continuación.

Pruebas

Comience ejecutando el siguiente comando para verificar que el cifrado de metadatos esté habilitado en el almacenamiento interno:

adb root
adb shell dmctl table userdata

La salida debe ser similar a:

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 sustituimos los valores de cifrado por defecto mediante el metadata_encryption opción en el dispositivo de fstab , entonces la salida diferirá ligeramente de la anterior. Por ejemplo, si se habilita el cifrado Adiantum , entonces el tercer campo será xchacha12,aes-adiantum-plain64 en lugar de aes-xts-plain64 .

A continuación, ejecutar vts_kernel_encryption_test para verificar la exactitud de cifrado de metadatos y FBE:

atest vts_kernel_encryption_test

o:

vts-tradefed run vts -m vts_kernel_encryption_test

Problemas comunes

Durante la llamada a mount_all , que monta los metadatos encriptados /data la partición, init ejecuta la herramienta VCC. Las Conexiones herramienta vdc a vold sobre binder para configurar el dispositivo de metadatos cifrado y montar la partición. Durante la duración de la llamada, init se bloquea, y los intentos de leer ni conjunto init propiedades se bloqueará hasta mount_all acabados. Si, en esta etapa, cualquier parte de vold trabajo 's está directa o indirectamente bloqueado en la lectura o la creación de una propiedad, estancamiento resultará. Es importante asegurarse de que vold puede completar el trabajo de la lectura de las teclas, interactuando con Keymaster, y montar el directorio de datos sin interactuar más con init .

Si no está completamente Keymaster comenzó cuando mount_all se ejecute, no responde a vold hasta que ha leído ciertas propiedades de init , lo que resulta en exactamente el punto muerto descrito. La colocación de exec_start wait_for_keymaster por encima de la correspondiente mount_all invocación como establecidos asegura que Keymaster está totalmente funcionando con antelación y así evita este punto muerto.

Configuración de almacenamiento adoptable

Dado que Android 9, una forma de encriptación metadatos siempre está habilitado en el almacenamiento adoptables cada vez que se activa FBE, incluso cuando el cifrado de metadatos no está habilitada en el almacenamiento interno.

En AOSP, hay dos implementaciones de cifrado en el almacenamiento de metadatos adoptables: una obsoleta basada en dm-crypt , y una más reciente basan en dm-default-key . Para garantizar que la aplicación correcta es seleccionado para el dispositivo, asegúrese de que ha establecido el valor correcto para PRODUCT_SHIPPING_API_LEVEL en device.mk . Por ejemplo, si sus lanzamientos de dispositivos con Android 11 (API nivel 30), device.mk deben contener:

PRODUCT_SHIPPING_API_LEVEL := 30

También puede configurar las siguientes propiedades del sistema para forzar el uso del nuevo método de cifrado de metadatos de volumen (y la nueva versión de la política 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 de puesta a flote con Android 11 o superior, cifrado en el almacenamiento de metadatos adoptables utiliza la dm-default-key módulo del núcleo, al igual que en el almacenamiento interno. Ver los requisitos anteriores para los que las opciones de configuración del kernel para habilitar. Tenga en cuenta que el hardware de encriptación en línea que funciona en el almacenamiento interno del dispositivo pueden no estar disponibles en el almacenamiento adoptables, y por lo tanto CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y puede ser necesaria.

Por defecto, la dm-default-key método de cifrado de volumen de metadatos utiliza el algoritmo de cifrado AES-256-XTS con sectores de cifrado 4096 bytes. El algoritmo puede ser anulado por el establecimiento de la ro.crypto.volume.metadata.encryption propiedad del sistema. El valor de esta propiedad tiene la misma sintaxis que la metadata_encryption opción fstab descrito anteriormente. Por ejemplo, en los dispositivos que carecen de AES aceleración, cifrado Adiantum se puede activar mediante el establecimiento de ro.crypto.volume.metadata.encryption=adiantum .

Método heredado

En los dispositivos de puesta a flote con Android 10 o inferior, cifrado en el almacenamiento de metadatos adoptables utiliza el dm-crypt módulo del núcleo en lugar de dm-default-key :

CONFIG_DM_CRYPT=y

A diferencia de la dm-default-key método, el dm-crypt método hace que el contenido del archivo a cifrar dos veces: una vez con una clave FBE y una vez con la clave de cifrado de metadatos. Este doble cifrado reduce el rendimiento y no es necesario para lograr los objetivos de seguridad del cifrado de metadatos, ya que Android garantiza que las claves FBE sean al menos tan difíciles de comprometer como la clave de cifrado de metadatos. Los proveedores pueden realizar personalizaciones del núcleo para evitar la doble encriptación, en particular, aplicando el allow_encrypt_override opción del cual pasará a 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.

Por defecto, el dm-crypt método de cifrado metadatos volumen utiliza el algoritmo de cifrado AES-128-CBC con los sectores de cifrado de 512 bytes y ESSIV. Esto se puede anular configurando las siguientes propiedades del sistema (que también se utilizan para FDE):

  • ro.crypto.fde_algorithm selecciona el algoritmo de cifrado de metadatos. Las opciones son aes-128-cbc y adiantum . Adiantum puede utilizarse sólo si el dispositivo carece de AES aceleración.
  • ro.crypto.fde_sector_size selecciona el tamaño de sector crypto. Las opciones son 512, 1024, 2048 y 4096. Para el cifrado Adiantum, use 4096.