O Google está comprometido em promover a equidade racial para as comunidades negras. Veja como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Criptografia baseada em arquivo

O Android 7.0 e superior oferece suporte à criptografia baseada em arquivo (FBE). A criptografia baseada em arquivo permite que diferentes arquivos sejam criptografados com diferentes chaves que podem ser desbloqueadas independentemente.

Este artigo descreve como habilitar a criptografia baseada em arquivo em novos dispositivos e como os aplicativos do sistema podem usar as APIs de inicialização direta para oferecer aos usuários a melhor e mais segura experiência possível.

Inicialização direta

A criptografia baseada em arquivo permite um novo recurso introduzido no Android 7.0 chamado Direct Boot . A inicialização direta permite que dispositivos criptografados sejam inicializados diretamente na tela de bloqueio. Anteriormente, em dispositivos criptografados usando criptografia de disco completo (FDE), os usuários precisavam fornecer credenciais antes que qualquer dado pudesse ser acessado, evitando que o telefone realizasse todas as operações, exceto as mais básicas. Por exemplo, os alarmes não funcionavam, os serviços de acessibilidade não estavam disponíveis e os telefones não podiam receber chamadas, mas eram limitados apenas a operações básicas do discador de emergência.

Com a introdução da criptografia baseada em arquivo (FBE) e novas APIs para tornar os aplicativos cientes da criptografia, é possível que esses aplicativos operem dentro de um contexto limitado. Isso pode acontecer antes de os usuários fornecerem suas credenciais e, ao mesmo tempo, proteger as informações privadas do usuário.

Em um dispositivo habilitado para FBE, cada usuário do dispositivo tem dois locais de armazenamento disponíveis para aplicativos:

  • Armazenamento criptografado por credencial (CE), que é o local de armazenamento padrão e só está disponível após o usuário desbloquear o dispositivo.
  • Armazenamento criptografado de dispositivo (DE), que é um local de armazenamento disponível durante o modo de inicialização direta e depois que o usuário desbloqueou o dispositivo.

Essa separação torna os perfis de trabalho mais seguros, pois permite que mais de um usuário seja protegido por vez, já que a criptografia não é mais baseada apenas em uma senha de inicialização.

A API Direct Boot permite que aplicativos com reconhecimento de criptografia acessem cada uma dessas áreas. Há mudanças no ciclo de vida do aplicativo para acomodar a necessidade de notificar os aplicativos quando o armazenamento CE de um usuário é desbloqueado em resposta à primeira inserção de credenciais na tela de bloqueio ou no caso de perfil de trabalho que fornece um desafio de trabalho . Os dispositivos que executam o Android 7.0 devem oferecer suporte a essas novas APIs e ciclos de vida, independentemente de implementarem ou não o FBE. Embora, sem FBE, o armazenamento DE e CE sempre estará no estado desbloqueado.

Uma implementação completa de criptografia baseada em arquivo nos sistemas de arquivos Ext4 e F2FS é fornecida no Android Open Source Project (AOSP) e só precisa ser habilitada em dispositivos que atendam aos requisitos. Os fabricantes que optam por usar FBE podem desejar explorar maneiras de otimizar o recurso com base no sistema no chip (SoC) usado.

Todos os pacotes necessários no AOSP foram atualizados para serem compatíveis com a inicialização direta. No entanto, quando os fabricantes de dispositivos usam versões personalizadas desses aplicativos, eles vão querer garantir, no mínimo, que haja pacotes de inicialização direta fornecendo os seguintes serviços:

  • Serviços de telefonia e discador
  • Método de entrada para inserir senhas na tela de bloqueio

Exemplos e fonte

O Android fornece uma implementação de referência de criptografia baseada em arquivo, em que vold ( system / vold ) fornece a funcionalidade para gerenciar dispositivos de armazenamento e volumes no Android. A adição do FBE fornece ao vold vários novos comandos para oferecer suporte ao gerenciamento de chaves para as chaves CE e DE de vários usuários. Além das principais alterações para usar os recursos de criptografia baseada em arquivo no kernel, muitos pacotes de sistema, incluindo a tela de bloqueio e o SystemUI, foram modificados para oferecer suporte aos recursos FBE e inicialização direta. Esses incluem:

  • AOSP Dialer (packages / apps / Dialer)
  • Desk Clock (pacotes / apps / DeskClock)
  • LatinIME (packages / inputmethods / LatinIME) *
  • Aplicativo de configurações (pacotes / aplicativos / Configurações) *
  • SystemUI (frameworks / base / packages / SystemUI) *

* Aplicativos de sistema que usam o atributo de manifesto defaultToDeviceProtectedStorage

Mais exemplos de aplicativos e serviços que reconhecem criptografia podem ser encontrados executando o comando mangrep directBootAware no diretório de estruturas ou pacotes da árvore de origem do AOSP.

Dependências

Para usar a implementação AOSP do FBE com segurança, um dispositivo precisa atender às seguintes dependências:

  • Suporte de kernel para criptografia Ext4 ou criptografia F2FS.
  • Suporte para Keymaster com HAL versão 1.0 ou 2.0. Não há suporte para Keymaster 0.3, pois ele não fornece os recursos necessários ou garante proteção suficiente para chaves de criptografia.
  • O Keymaster / Keystore e o Gatekeeper devem ser implementados em um Trusted Execution Environment (TEE) para fornecer proteção para as chaves DE, de forma que um SO não autorizado (SO personalizado atualizado no dispositivo) não possa simplesmente solicitar as chaves DE.
  • A raiz de hardware de confiança e inicialização verificada associada à inicialização do keymaster é necessária para garantir que as credenciais de criptografia do dispositivo não sejam acessíveis por um sistema operacional não autorizado.

Nota : As políticas de armazenamento são aplicadas a uma pasta e a todas as suas subpastas. Os fabricantes devem limitar o conteúdo não criptografado à pasta OTA e à pasta que contém a chave que descriptografa o sistema. A maioria dos conteúdos deve residir em armazenamento criptografado por credencial, em vez de armazenamento criptografado por dispositivo.

Implementação

Em primeiro lugar, aplicativos como despertadores, telefone e recursos de acessibilidade devem ser feitos para Android: directBootAware de acordo com a documentação do desenvolvedor do Direct Boot .

Suporte Kernel

O suporte do kernel para criptografia Ext4 e F2FS está disponível nos kernels comuns do Android, versão 3.18 e superior. Para habilitá-lo em um kernel versão 5.1 ou superior, use:

CONFIG_FS_ENCRYPTION=y

Para kernels mais antigos, o uso CONFIG_EXT4_ENCRYPTION=y se do seu dispositivo userdata sistema de arquivos Ext4 é, ou o uso CONFIG_F2FS_FS_ENCRYPTION=y se do seu dispositivo userdata sistema de arquivos é F2FS.

Se o seu dispositivo oferecer suporte a armazenamento adotável ou usar criptografia de metadados no armazenamento interno, habilite também as opções de configuração do kernel necessárias para criptografia de metadados conforme descrito na documentação de criptografia de metadados .

Além do suporte funcional para criptografia Ext4 ou F2FS, os fabricantes de dispositivos também devem habilitar a aceleração criptográfica para acelerar a criptografia baseada em arquivo e melhorar a experiência do usuário. Por exemplo, em dispositivos baseados em ARM64, a aceleração ARMv8 CE (Extensões de Criptografia) pode ser habilitada definindo as seguintes opções de configuração do kernel:

CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
CONFIG_CRYPTO_SHA2_ARM64_CE=y

Para melhorar ainda mais o desempenho e reduzir o uso de energia, os fabricantes de dispositivos também podem considerar a implementação de hardware de criptografia em linha , que criptografa / descriptografa os dados enquanto eles estão no caminho de / para o dispositivo de armazenamento. Os kernels comuns do Android (versão 4.14 e superior) contêm uma estrutura que permite que a criptografia inline seja usada quando o hardware e o suporte do driver do fornecedor estão disponíveis. A estrutura de criptografia inline pode ser ativada definindo as seguintes opções de configuração do kernel:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y

Se o seu dispositivo usa armazenamento baseado em UFS, habilite também:

CONFIG_SCSI_UFS_CRYPTO=y

Se o seu dispositivo usa armazenamento baseado em eMMC, habilite também:

CONFIG_MMC_CRYPTO=y

Ativando criptografia baseada em arquivo

Habilitar o FBE em um dispositivo requer habilitá-lo no armazenamento interno (dados do userdata ). Isso também ativa automaticamente o FBE no armazenamento adotável; no entanto, o formato de criptografia no armazenamento adotável pode ser substituído, se necessário.

Armazenamento interno

O FBE é habilitado adicionando a opção fileencryption=contents_encryption_mode[:filenames_encryption_mode[:flags]] à coluna fs_mgr_flags da linha fstab para userdata . Esta opção define o formato de criptografia no armazenamento interno. Ele contém até três parâmetros separados por dois pontos:

  • O parâmetro contents_encryption_mode define qual algoritmo criptográfico é usado para criptografar o conteúdo do arquivo. Pode ser aes-256-xts ou adiantum .
  • O parâmetro filenames_encryption_mode define qual algoritmo criptográfico é usado para criptografar nomes de arquivo. Pode ser aes-256-cts , aes-256-heh ou adiantum . Se não for especificado, o padrão é aes-256-cts se o contents_encryption_mode for aes-256-xts , ou adiantum se o contents_encryption_mode for adiantum .
  • O parâmetro flags , novo no Android R, é uma lista de sinalizadores separados pelo caractere + . Os seguintes sinalizadores são suportados:
    • O sinalizador v1 seleciona as políticas de criptografia da versão 1; o sinalizador v2 seleciona as políticas de criptografia da versão 2. As políticas de criptografia da versão 2 usam uma função de derivação de chave mais segura e flexível. O padrão é v2 se o dispositivo foi iniciado no Android R ou superior (conforme determinado por ro.product.first_api_level ), ou v1 se o dispositivo foi iniciado no Android 10 ou inferior.
    • O sinalizador inlinecrypt_optimized seleciona um formato de criptografia que é otimizado para hardware de criptografia em linha que não manipula um grande número de chaves com eficiência. Ele faz isso derivando apenas uma chave de criptografia de conteúdo de arquivo por chave CE ou DE, em vez de uma por arquivo. A geração de IVs (vetores de inicialização) é ajustada de acordo.
    • O sinalizador emmc_optimized é semelhante a inlinecrypt_optimized , mas também seleciona um método de geração IV que limita IVs a 32 bits. Este sinalizador deve ser usado apenas em hardware de criptografia em linha que é compatível com a especificação JEDEC eMMC v5.2 e, portanto, suporta apenas IVs de 32 bits. Em outro hardware de criptografia inline, use inlinecrypt_optimized . Este sinalizador nunca deve ser usado em armazenamento baseado em UFS; a especificação UFS permite o uso de IVs de 64 bits.
    • O sinalizador wrappedkey_v0 permite o uso de chaves wrappedkey_v0 por hardware. Quando habilitadas, as chaves FBE não são geradas pelo software, mas sim pelo Keymaster usando a tag STORAGE_KEY . Então, cada chave FBE realmente fornecida ao kernel é a chave STORAGE_KEY exportada do Keymaster, o que faz com que seja agrupada com uma chave efêmera por inicialização. O kernel então fornece as chaves empacotadas diretamente para o hardware de criptografia embutida. Quando implementadas corretamente, as chaves desembrulhadas nunca estão presentes na memória do sistema e uma chave embalada comprometida não pode ser usada após uma reinicialização. Este sinalizador requer suporte de hardware, suporte de Keymaster para STORAGE_KEY , suporte de driver de kernel, a opção de montagem inlinecrypt e os inlinecrypt_optimized ou emmc_optimized .

Se você não estiver usando hardware de criptografia em linha, a configuração recomendada para a maioria dos dispositivos é fileencryption=aes-256-xts . Se você estiver usando hardware de criptografia em linha, a configuração recomendada para a maioria dos dispositivos é fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized . Em dispositivos sem qualquer forma de aceleração AES, Adiantum pode ser usado em vez de AES configurando fileencryption=adiantum .

Em dispositivos iniciados com Android 10 ou inferior, fileencryption=ice também é aceito para especificar o uso do modo de criptografia de conteúdo de arquivo FSCRYPT_MODE_PRIVATE . Este modo não é implementado pelos kernels comuns do Android, mas pode ser implementado por fornecedores usando patches de kernel personalizados. O formato em disco produzido por este modo era específico do fornecedor. Em dispositivos que iniciam com Android R ou superior, este modo não é mais permitido e um formato de criptografia padrão deve ser usado em seu lugar.

Por padrão, a criptografia do conteúdo do arquivo é feita usando a API de criptografia do kernel do Linux. Se você quiser usar hardware de criptografia inline, adicione também a opção de montagem inlinecrypt . Por exemplo, uma linha fstab completa pode ser semelhante a:

/dev/block/by-name/userdata /data f2fs nodev,noatime,nosuid,errors=panic,inlinecrypt wait,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized

Armazenamento adotável

Desde o Android 9, o FBE e o armazenamento adotável podem ser usados ​​juntos.

Especificando o fileencryption opção fstab para userdata também permite automaticamente a FBE e criptografia de metadados no armazenamento adoptáveis. No entanto, você pode substituir os formatos de criptografia FBE e / ou metadados no armazenamento adotável, definindo propriedades em PRODUCT_PROPERTY_OVERRIDES .

Em dispositivos iniciados com Android R ou superior, use as seguintes propriedades:

  • ro.crypto.volume.options (novo no Android R) seleciona o formato de criptografia FBE no armazenamento adotável. Ele tem a mesma sintaxe que o argumento da opção fstab fileencryption e usa os mesmos padrões. Consulte as recomendações para fileencryption de fileencryption acima para fileencryption o que usar aqui.
  • ro.crypto.volume.metadata.encryption seleciona o formato de criptografia de metadados no armazenamento adotável. Consulte a documentação de criptografia de metadados .

Em dispositivos iniciados com Android 10 ou inferior, use as seguintes propriedades:

  • ro.crypto.volume.contents_mode seleciona o modo de criptografia de conteúdo. Isso é equivalente ao primeiro campo separado por dois pontos de ro.crypto.volume.options .
  • ro.crypto.volume.filenames_mode seleciona o modo de criptografia dos nomes de arquivo. Isso é equivalente ao segundo campo separado por dois pontos de ro.crypto.volume.options , exceto que o padrão em dispositivos iniciados com Android 10 ou inferior é aes-256-heh . Na maioria dos dispositivos, isso precisa ser explicitamente substituído por aes-256-cts .
  • ro.crypto.fde_algorithm e ro.crypto.fde_sector_size selecionam o formato de criptografia de metadados no armazenamento adotável. Consulte a documentação de criptografia de metadados .

Integrando com Keymaster

A geração de chaves e o gerenciamento do chaveiro do kernel são vold por vold . A implementação AOSP do FBE requer que o dispositivo suporte Keymaster HAL versão 1.0 ou posterior. Não há suporte para versões anteriores do Keymaster HAL.

Na primeira inicialização, as chaves do usuário 0 são geradas e instaladas no início do processo de inicialização. No momento on-post-fs fase on-post-fs do init concluída, o Keymaster deve estar pronto para lidar com as solicitações. Em dispositivos Pixel, isso é tratado por um bloco de script que garante que o Keymaster seja iniciado antes que /data seja montado.

Política de criptografia

A criptografia baseada em arquivo aplica a política de criptografia no nível do diretório. Quando a partição de dados do userdata um dispositivo é criada pela primeira vez, as estruturas e políticas básicas são aplicadas pelos scripts init . Esses scripts irão acionar a criação das chaves CE e DE do primeiro usuário (usuário 0's), bem como definir quais diretórios devem ser criptografados com essas chaves. Quando usuários e perfis adicionais são criados, as chaves adicionais necessárias são geradas e armazenadas no armazenamento de chaves; suas credenciais e locais de armazenamento de dispositivos são criados e a política de criptografia vincula essas chaves a esses diretórios.

No Android R e superior, a política de criptografia não é mais codificada em um local centralizado, mas é definida por argumentos para os comandos mkdir nos scripts de inicialização. Os diretórios criptografados com a chave DE do sistema usam encryption=Require , enquanto os diretórios não criptografados (ou diretórios cujos subdiretórios são criptografados com chaves por usuário) usam encryption=None .

No Android 10, a política de criptografia foi codificada neste local:

/system/extras/libfscrypt/fscrypt_init_extensions.cpp

No Android 9 e anterior, o local era:

/system/extras/ext4_utils/ext4_crypt_init_extensions.cpp

É possível adicionar exceções para evitar que certos diretórios sejam criptografados. Se modificações desse tipo forem feitas, o fabricante do dispositivo deve incluir políticas SELinux que concedam acesso apenas aos aplicativos que precisam usar o diretório não criptografado. Isso deve excluir todos os aplicativos não confiáveis.

O único caso de uso aceitável conhecido para isso é no suporte de recursos OTA legados.

Compatível com inicialização direta em aplicativos do sistema

Tornando os aplicativos cientes da inicialização direta

Para facilitar a migração rápida de aplicativos do sistema, existem dois novos atributos que podem ser definidos no nível do aplicativo. O atributo defaultToDeviceProtectedStorage está disponível apenas para aplicativos do sistema. O atributo directBootAware está disponível para todos.

<application
    android:directBootAware="true"
    android:defaultToDeviceProtectedStorage="true">

O atributo directBootAware no nível do aplicativo é uma forma abreviada para marcar todos os componentes no aplicativo como sendo compatíveis com criptografia.

O atributo defaultToDeviceProtectedStorage redireciona o local de armazenamento do aplicativo padrão para apontar para o armazenamento DE em vez de apontar para o armazenamento CE. Os aplicativos do sistema que usam este sinalizador devem auditar cuidadosamente todos os dados armazenados no local padrão e alterar os caminhos dos dados confidenciais para usar o armazenamento CE. Os fabricantes de dispositivos que usam esta opção devem inspecionar cuidadosamente os dados que estão armazenando para garantir que não contenham informações pessoais.

Ao executar neste modo, as seguintes APIs de sistema estão disponíveis para gerenciar explicitamente um Contexto apoiado por armazenamento CE quando necessário, que são equivalentes a suas contrapartes protegidas por dispositivo.

  • Context.createCredentialProtectedStorageContext()
  • Context.isCredentialProtectedStorage()

Suporte a vários usuários

Cada usuário em um ambiente multiusuário obtém uma chave de criptografia separada. Cada usuário recebe duas chaves: uma chave DE e uma chave CE. O usuário 0 deve fazer login no dispositivo primeiro, pois é um usuário especial. Isso é pertinente para usos de administração de dispositivos .

Os aplicativos com reconhecimento de criptografia interagem entre os usuários desta maneira: INTERACT_ACROSS_USERS e INTERACT_ACROSS_USERS_FULL permitem que um aplicativo atue em todos os usuários no dispositivo. No entanto, esses aplicativos serão capazes de acessar apenas diretórios criptografados com CE para usuários que já estão desbloqueados.

Um aplicativo pode ser capaz de interagir livremente nas áreas de DE, mas um usuário desbloqueado não significa que todos os usuários no dispositivo estão desbloqueados. O aplicativo deve verificar esse status antes de tentar acessar essas áreas.

Cada ID de usuário do perfil de trabalho também recebe duas chaves: DE e CE. Quando o desafio de trabalho é atendido, o usuário do perfil é desbloqueado e o Keymaster (em TEE) pode fornecer a chave TEE do perfil.

Lidando com atualizações

A partição de recuperação não pode acessar o armazenamento protegido por DE na partição de dados do usuário. Dispositivos que implementam FBE são altamente recomendados para oferecer suporte a OTA usando atualizações de sistema A / B. Como a OTA pode ser aplicada durante a operação normal, não há necessidade de recuperação para acessar os dados na unidade criptografada.

Ao usar uma solução OTA legada, que requer recuperação para acessar o arquivo OTA na partição userdata :

  1. Crie um diretório de nível superior (por exemplo misc_ne ) na partição userdata .
  2. Adicione este diretório de nível superior à exceção da política de criptografia (consulte Política de criptografia acima).
  3. Crie um diretório dentro do diretório de nível superior para conter os pacotes OTA.
  4. Adicione uma regra SELinux e contextos de arquivo para controlar o acesso a esta pasta e seu conteúdo. Apenas o processo ou aplicativos que recebem atualizações OTA devem ser capazes de ler e gravar nesta pasta. Nenhum outro aplicativo ou processo deve ter acesso a esta pasta.

Validação

Para garantir que a versão implementada do recurso funcione conforme o esperado , primeiro execute os vários testes de criptografia CTS, como DirectBootHostTest e EncryptionTest .

Se o dispositivo estiver executando Android R ou superior, execute também vts_kernel_encryption_test :

atest vts_kernel_encryption_test

ou:

vts-tradefed run vts -m vts_kernel_encryption_test

Além disso, os fabricantes de dispositivos podem realizar os seguintes testes manuais. Em um dispositivo com FBE habilitado:

  • Verifique se ro.crypto.state existe
    • Certifique-se de que ro.crypto.state esteja criptografado
  • Verifique se ro.crypto.type existe
    • Certifique-se de que ro.crypto.type esteja definido como file

Além disso, os testadores podem inicializar uma instância de userdebug com uma tela de bloqueio definida no usuário principal. Em seguida, adb shell no dispositivo e use su para se tornar root. Certifique-se de que /data/data contém nomes de arquivos criptografados; se não, algo está errado.

Os fabricantes de dispositivos também são incentivados a explorar a execução de testes upstream do Linux para fscrypt em seus dispositivos ou kernels. Esses testes fazem parte do conjunto de testes do sistema de arquivos xfstests. No entanto, esses testes upstream não são oficialmente suportados pelo Android.

Detalhes de implementação de AOSP

Esta seção fornece detalhes sobre a implementação do AOSP e descreve como funciona a criptografia baseada em arquivo. Não deve ser necessário que os fabricantes de dispositivos façam quaisquer alterações aqui para usar FBE e inicialização direta em seus dispositivos.

criptografia fscrypt

A implementação AOSP usa criptografia "fscrypt" (compatível com ext4 e f2fs) no kernel e normalmente é configurada para:

  • Criptografar o conteúdo do arquivo com AES-256 no modo XTS
  • Criptografar nomes de arquivo com AES-256 no modo CBC-CTS

A criptografia Adiantum também é compatível. Quando a criptografia Adiantum está habilitada, o conteúdo e os nomes dos arquivos são criptografados com Adiantum.

Para obter mais informações sobre fscrypt, consulte a documentação do kernel upstream .

Derivação chave

As chaves de criptografia baseadas em arquivo, que são chaves de 512 bits, são armazenadas criptografadas por outra chave (uma chave AES-GCM de 256 bits) mantida no TEE. Para usar esta chave TEE, três requisitos devem ser atendidos:

  • O token de autenticação
  • A credencial esticada
  • O “hash secdiscardable”

O token de autenticação é um token autenticado criptograficamente gerado pelo Gatekeeper quando um usuário efetua login com sucesso. O TEE se recusará a usar a chave a menos que o token de autenticação correto seja fornecido. Se o usuário não tiver credencial, nenhum token de autenticação será usado nem necessário.

A credencial esticada é a credencial do usuário após salgar e esticar com o algoritmo de scrypt . A credencial é realmente hash uma vez no serviço de configurações de bloqueio antes de ser passada para vold para passar para scrypt . Este é criptograficamente vinculado à chave no TEE com todas as garantias que se aplicam a KM_TAG_APPLICATION_ID . Se o usuário não tiver credencial, nenhuma credencial estendida será usada nem necessária.

O secdiscardable hash é um secdiscardable hash 512 bits de um arquivo aleatório de 16 KB armazenado junto com outras informações usadas para reconstruir a chave, como a semente. Este arquivo é excluído com segurança quando a chave é excluída ou é criptografado de uma nova maneira; essa proteção adicional garante que um invasor deve recuperar cada bit desse arquivo excluído com segurança para recuperar a chave. Este é criptograficamente vinculado à chave no TEE com todas as garantias que se aplicam a KM_TAG_APPLICATION_ID .

Na maioria dos casos, as chaves FBE também passam por uma etapa de derivação de chave adicional no kernel para gerar as subchaves realmente usadas para fazer a criptografia, por exemplo, chaves por arquivo ou por modo. Para as políticas de criptografia da versão 2, HKDF-SHA512 é usado para isso.