Usando a criptografia de arquivos vinculados a veículos

Este conteúdo descreve como habilitar recursos iniciais de criptografia de ligação baseados em veículo.

Visão geral

O objetivo principal do recurso de semente vinculativa do veículo é proteger ainda mais a privacidade do usuário, protegendo os dados no sistema de informação e entretenimento no veículo (IVI) contra remoção do veículo. Isso é feito vinculando chaves de criptografia de armazenamento a alguma outra unidade de controle eletrônico (ECU), de modo que, se o IVI for removido e colocado em outro veículo (ou executado em uma bancada de testes), os dados criptografados do usuário no IVI não possam ser descriptografados.

Para vincular chaves de criptografia de arquivos, Vold mistura uma semente específica do veículo com a derivação de chave de criptografia de chave para que as chaves sejam exclusivas e fisicamente vinculadas ao veículo. A semente é uma matriz de bytes, exposta como uma nova propriedade Vehicle Hardware Abstraction Layer (VHAL) pelo OEM, STORAGE_ENCRYPTION_BINDING_SEED . As permissões desta propriedade são restritas de forma que ela só possa ser consultada por daemons de sistema privilegiados.

Diagrama de arquitetura

Esta figura ilustra a arquitetura da integração vinculada ao veículo:

Figura 1. Arquitetura vinculada ao veículo

Habilitando vinculação baseada em veículo

A vinculação da criptografia de armazenamento ao veículo deve ser explicitamente habilitada e não pode ser ligada ou desligada sem realizar uma redefinição de fábrica. Isso significa que uma atualização Over-the-Air (OTA) não pode ativar o recurso sem também limpar o dispositivo. Um OEM pode optar por ativar o recurso na atualização se também redefinir o dispositivo para os padrões de fábrica. Por exemplo, em uma visita de serviço.

Este recurso é habilitado com suporte à propriedade STORAGE_ENCRYPTION_BINDING_SEED no HAL do veículo fornecido pelo fornecedor. Esta propriedade contém uma sequência de bytes de 16 bytes de comprimento e espera-se que seja persistida em uma ECU separada do IVI. A propriedade é inicialmente definida pelo Android Automotive OS (AAOS), que a gera usando um Gerador de Números Aleatórios Criptograficamente Seguro (CSRNG). AAOS então lê a propriedade nas inicializações subsequentes.

A forma como o VHAL armazena o valor de STORAGE_ENCRYPTION_BINDING_SEED depende do fornecedor. Temos recomendações gerais para proteger a semente:

  1. ( Recomendado ) A semente é armazenada por uma ECU no veículo que está fisicamente bem protegido. Caso contrário, é trivial que o IVI e a ECU sejam retirados do veículo.
  2. ( Recomendado ) IVI e ECU devem autenticar-se mutuamente para trocar a semente para evitar solicitações de falsificação para a semente da ECU.
  3. ( Recomendado ) A semente deve ser transmitida usando um canal seguro para proteção contra detecção do barramento CAN.

Além disso, adicione o seguinte para garantir o fornecedor init.target.rc no late-fs antes de mount_all --late :

# feed vehicle binding seed to vold
exec_start vold_seed_binding

O HAL do veículo deve ser iniciado em early_hal em vez de hal now . Qualquer propriedade de sistema persist.* não pode ser acessada no early-hal , pois a partição /data ainda não está montada.

Configurando a vinculação baseada em veículo

Se a semente da ECU não corresponder, o dispositivo será reinicializado em recuperação e solicitará que o usuário apague a partição /data ou tente novamente.

O comportamento de solicitar e limpar dados pode ser alterado em builtins.cpp :

  1. Altere prompt_and_wipe_data para wipe_data . O dispositivo é apagado e reinicializado sem aviso prévio.
  2. A mensagem de prompt está contida em recovery.cpp .

    Figura 2. Mensagem de prompt

Testando ligação baseada em veículo

Teste simulado

Um teste simulado é fornecido em packages/services/Car/cpp/security/vehicle_binding_util/tests .

Para executar este teste simulado:

attest libvehicle_binding_util_test

Teste de integração

Um teste de teste é fornecido em packages/services/Car/cpp/security/vehicle_binding_util/tests .

Para executar este teste de integração:

atest vehicle_binding_integration_test