Usar encriptación de archivos vinculados al vehículo

En esta página, se describe cómo habilitar las funciones de origen de encriptación de vinculación basada en vehículos.

Descripción general

El objetivo principal de la función básica de vinculación del vehículo es proteger aún más la privacidad del usuario al proteger los datos del sistema de infoentretenimiento en el vehículo (IVI) contra la eliminación del vehículo. Este es mediante la vinculación de las claves de encriptación de almacenamiento con otra unidad de control electrónico (ECU), de modo que si la IVI se quita y se coloca en otro vehículo (o se ejecuta en un banco de pruebas), y se encriptan los datos del usuario en la IVI no se puede desencriptar.

Para vincular las claves de encriptación de archivos, Vold combina un valor inicial específico del vehículo con la encriptación de claves. la derivación de claves para que sean únicas y estén vinculadas físicamente al vehículo. El valor inicial es un array de bytes, que el OEM expuso como una nueva propiedad de la capa de abstracción de hardware del vehículo (VHAL), STORAGE_ENCRYPTION_BINDING_SEED Los permisos de esta propiedad están restringidos de modo que solo pueden ser consultadas por daemons del sistema con privilegios.

Diagrama de la arquitectura

En esta figura, se ilustra la arquitectura de la integración vinculada al vehículo:

Figura 1: Arquitectura vinculada al vehículo.

Habilita la vinculación basada en vehículos

La vinculación de la encriptación de almacenamiento con el vehículo debe habilitarse de forma explícita y no se puede activar sin restablecer la configuración de fábrica. Esto significa que una actualización inalámbrica (OTA) no puede habilitar la función sin limpiar el dispositivo. Un OEM podría optar por habilitar la función cuando si también restablecen su configuración de fábrica. Por ejemplo, durante una visita de servicio.

Para habilitar esta función, es compatible con la propiedad STORAGE_ENCRYPTION_BINDING_SEED. en la HAL del vehículo proporcionada por el proveedor. Esta propiedad contiene una cadena de bytes de 16 bytes de longitud y está se espera que persistan en una ECU separada de la IVI. La propiedad se establece inicialmente SO Android Automotive (AAOS), que lo genera con un número aleatorio criptográficamente seguro de generación de demanda (CSRNG). Luego, AAOS lee la propiedad en los inicios posteriores.

La forma en que el VHAL almacena el valor de STORAGE_ENCRYPTION_BINDING_SEED es específico del proveedor. Tenemos recomendaciones generales para proteger la semilla:

  1. (Recomendado) Una ECU almacena las semillas en el vehículo que está físicamente estén bien protegidos. Si no es así, es trivial que tanto la IVI como la ECU se extraigan de la vehículo.
  2. (Recomendado) IVI y ECU deben autenticarse mutuamente para intercambiar el valor inicial a para evitar la falsificación de identidad para el origen de la ECU.
  3. (Recomendado) El valor inicial debe transmitirse a través de un canal seguro como protección contra CAN bus: Sniffing

Además, agrega lo siguiente para garantizar que el proveedor init.target.rc en late-fs antes del mount_all --late:

# feed vehicle binding seed to vold
exec_start vold_seed_binding

La HAL del vehículo debe iniciarse en early_hal en lugar de hal now. No se puede acceder a ninguna propiedad del sistema persist.* en early-hal porque Aún no se activó la partición /data.

Configura la vinculación basada en vehículos

Si el valor inicial de la ECU no coincide, el dispositivo se reinicia en la recuperación y le pide al usuario que borre la partición /data o vuelve a intentarlo.

El comportamiento de solicitar y borrar datos se puede cambiar en builtins.cpp:

  1. Cambia prompt_and_wipe_data por wipe_data. El dispositivo limpia y, luego, se reinicia sin solicitarlo.
  2. El mensaje de solicitud se incluye en recovery.cpp

    Figura 2: Mensaje de solicitud.

Prueba la vinculación basada en vehículos

Pruebas simuladas

Hay una prueba de prueba en packages/services/Car/cpp/security/vehicle_binding_util/tests

Para ejecutar esta prueba de prueba, haz lo siguiente:

attest libvehicle_binding_util_test

Pruebas de integración

Se proporciona una prueba Atest en packages/services/Car/cpp/security/vehicle_binding_util/tests

Para ejecutar esta prueba de integración, haz lo siguiente:

atest vehicle_binding_integration_test