Segurança

Para evitar a execução de payloads arbitrários dentro de uma pVM, o Framework de virtualização do Android (AVF, na sigla em inglês) usa uma abordagem de segurança em camadas, em que cada camada adiciona outras restrições. Veja a seguir uma lista de camadas de segurança do AVF:

  • O Android garante que apenas os apps com permissões de pVM tenham permissão para criar ou inspecionar pVMs.

  • Carregador de inicialização: garante que apenas imagens pVM assinadas pelo Google ou fornecedores de dispositivos possam inicializar e respeita o procedimento Inicialização verificada do Android. Essa arquitetura implica que os apps que executam pVMs não podem agrupar seus próprios kernels.

  • A pVM oferece defesa em profundidade, como o SELinux, para payloads executados na pVM. A defesa em profundidade proíbe o mapeamento de dados como executáveis (neverallow execmem) e garante que W^X seja válido para todos os tipos de arquivo.

Modelo de segurança

Confidencialidade, integridade e disponibilidade (tríade CIA) compõem um modelo projetado para orientar as políticas de segurança da informação:

  • A confidencialidade é um conjunto de regras que limita o acesso às informações.
  • Integridade é a garantia de que as informações são confiáveis e precisas.
  • A disponibilidade é uma garantia de acesso confiável às informações por entidades autorizadas.

Confidencialidade e integridade

A confidencialidade vem das propriedades de isolamento de memória aplicadas pelo hipervisor pKVM. O pKVM rastreia a propriedade da memória de páginas de memória física individuais e todas as solicitações dos proprietários para que as páginas sejam compartilhadas. A pKVM garante que apenas as pVMs autorizadas (host e convidados) tenham a página mapeada nas tabelas de páginas do estágio 2 controladas pelo hipervisor. Essa arquitetura mantém que o conteúdo da memória de propriedade de uma pVM permanece privado, a menos que o proprietário o compartilhe explicitamente com outra pVM.

As restrições para manter a confidencialidade também se estendem a todas as entidades no sistema que realizam acessos à memória em nome de pVMs, ou seja, dispositivos compatíveis com DMA e serviços em execução em camadas mais privilegiadas. Os fornecedores de system on chip (SoC) precisam atender a um novo conjunto de requisitos antes de oferecer suporte ao pKVM. Caso contrário, não será possível fornecer a confidencialidade.

A integridade se aplica aos dados na memória e na computação. As pVMs não podem:

  • Modificar a memória uns dos outros sem consentimento.
  • Influenciam o estado da CPU uns dos outros.

Esses requisitos são aplicados pelo hipervisor. No entanto, problemas relacionados à integridade dos dados também surgem com o armazenamento de dados virtual quando outras soluções precisam ser aplicadas, como dm-verity ou AuthFS.

Esses princípios não são diferentes do isolamento de processos oferecido pelo Linux, em que o acesso às páginas de memória é controlado pelas tabelas de página do estágio 1 e pela alternância de contexto do kernel entre os processos. No entanto, a parte EL2 da pKVM, que aplica essas propriedades, tem três ordens de magnitude menos superfície de ataque em comparação com todo o kernel do Linux (cerca de 10 mil versus 20 milhões de linhas de código) e, portanto, oferece maior garantia para casos de uso muito sensíveis que dependem do isolamento de processos.

Devido ao tamanho, o pKVM é adequado à verificação formal. Apoiamos ativamente a pesquisa acadêmica, que visa provar formalmente essas propriedades no binário pKVM real.

O restante desta página aborda as garantias de confidencialidade e integridade que cada componente em uma pKVM oferece.

Hipervisor

O pKVM é um hipervisor baseado em KVM que isola pVMs e o Android em ambientes de execução não confiáveis mutuamente. Essas propriedades são mantidas no caso de um comprometimento em qualquer pVM, incluindo o host. Hipervisores alternativos que atendam ao AVF precisam fornecer propriedades semelhantes.

  • Uma pVM não pode acessar uma página pertencente a outra entidade, como uma pVM ou hipervisor, a menos que seja explicitamente compartilhada pelo proprietário da página. Essa regra inclui a pVM do host e se aplica aos acessos de CPU e DMA.

  • Antes que uma página usada por uma pVM seja retornada ao host, como quando a pVM é destruída, ela é excluída permanentemente.

  • A memória de todas as pVMs e o firmware da pVM de uma inicialização de dispositivo são apagadas antes que o carregador de inicialização do SO seja executado na inicialização seguinte do dispositivo.

  • Quando um depurador de hardware, como o SJTAG, é anexado, uma pVM não pode acessar as chaves criadas anteriormente.

  • O firmware da pVM não vai inicializar se não for possível verificar a imagem inicial.

  • O firmware da pVM não será inicializado se a integridade do instance.img for comprometida.

  • A cadeia de certificados DICE e os identificadores de dispositivos compostos (CDIs, na sigla em inglês) fornecidos para uma instância de pVM só podem ser derivados por essa instância específica.

SO convidado

O Microdroid é um exemplo de SO executado em uma pVM. O Microdroid consiste em um carregador de inicialização baseado em U-boot, GKI, um subconjunto do espaço do usuário do Android e uma tela de início de payload. Essas propriedades são mantidas em caso de comprometimento em qualquer pVM, incluindo o host. SOs alternativos em execução em uma pVM precisam fornecer propriedades semelhantes.

  • O Microdroid não será inicializado se não for possível verificar boot.img, super.img, vbmeta.img ou vbmeta\_system.img.

  • O Microdroid não será inicializado se a verificação do APK falhar.

  • A mesma instância do Microdroid não será inicializada mesmo que o APK tenha sido atualizado.

  • O Microdroide não será inicializado se algum dos APEXs falhar na verificação.

  • O Microdroid não será inicializado (ou inicializado com um estado inicial limpo) se o instance.img for modificado fora da pVM do convidado.

  • O Microdroid fornece um atestado para a cadeia de inicialização.

  • Qualquer modificação (não assinada) nas imagens de disco compartilhadas com a pVM convidada causa um erro de E/S na pVM.

  • A cadeia de certificados DICE e as CDIs fornecidas para uma instância de pVM podem ser derivadas apenas por essa instância específica.

  • As gravações em um volume de armazenamento criptografado são confidenciais. No entanto, não há proteção contra reversão na granularidade de um bloco de criptografia. Além disso, outras adulterações externas arbitrárias de um bloco de dados fazem com que esse bloco apareça como lixo para o Microdroid, em vez de ser detectado explicitamente como um erro de E/S.

Android

Estas são propriedades mantidas pelo Android como host, mas não são válidas em caso de comprometimento do host:

  • Uma pVM convidada não pode interagir diretamente com outras pVMs convidadas, por exemplo, para fazer uma conexão vsock.

  • Somente o VirtualizationService na pVM do host pode criar um canal de comunicação para uma pVM.

  • Somente os apps assinados com a chave de plataforma podem solicitar permissão para criar, ter ou interagir com pVMs.

  • O identificador, chamado de identificador de contexto (CID), usado na configuração de conexões vsock entre o host e a pVM não é reutilizado quando a pVM do host está em execução. Por exemplo, não é possível substituir uma pVM em execução por outra.

Disponibilidade

No contexto das pVMs, disponibilidade refere-se ao host que aloca recursos suficientes para convidados, para que os convidados possam executar as tarefas que foram projetados para realizar.

As responsabilidades do host incluem o agendamento das CPUs virtuais da pVM. A KVM, ao contrário dos hipervisores Tipo 1 convencionais (como o Xen), toma a decisão explícita de design de delegar a programação de carga de trabalho ao kernel do host. Considerando o tamanho e a complexidade dos programadores atuais, essa decisão de design reduz significativamente o tamanho da base de computação confiável (TCB) e permite que o host tome decisões de programação mais informadas para otimizar o desempenho. No entanto, um host malicioso pode optar por nunca agendar um convidado.

Da mesma forma, o pKVM também delega o tratamento de interrupções físicas ao kernel do host para reduzir a complexidade do hipervisor e deixar o host encarregado da programação. É necessário garantir que o encaminhamento de interrupções do convidado resulte apenas em uma negação de serviço (poucas, muitas ou mal direcionadas).

Por fim, o processo de monitor de máquina virtual (VMM) do host é responsável por alocar memória e fornecer dispositivos virtuais, como uma placa de rede. Um VMM malicioso pode reter recursos do convidado.

Embora o pKVM não forneça disponibilidade aos convidados, o design protege a disponibilidade do host contra convidados mal-intencionados, porque o host sempre pode antecipar ou encerrar um convidado e recuperar os recursos.

Inicialização segura

Os dados são vinculados a instâncias de uma pVM, e a inicialização segura garante que o acesso aos dados de uma instância possa ser controlado. A primeira inicialização de uma instância o provisiona gerando aleatoriamente um sal secreto para a pVM e extraindo detalhes das imagens carregadas, como chaves públicas de verificação e hashes. Essas informações são usadas para verificar as inicializações subsequentes da instância da pVM e garantir que os secrets da instância sejam liberados apenas para imagens que passam na verificação. Esse processo ocorre para cada estágio de carregamento na pVM: firmware da pVM, pVM ABL, Microdroid e assim por diante.

O DICE fornece a cada fase de carregamento um par de chaves de atestado, cuja parte pública é certificada no certificado do DICE para essa fase. Esse par de chaves pode mudar entre as inicializações. Portanto, uma chave secreta de bloqueio também é derivada e estável para a instância de VM nas reinicializações, sendo adequada para proteger o estado persistente. A chave secreta de isolamento é muito valiosa para a VM e, por isso, não pode ser usada diretamente. Em vez disso, as chaves de isolamento precisam ser derivadas da chave secreta de isolamento, e ela precisa ser destruída o mais cedo possível.

Cada estágio entrega um objeto CBOR codificado determinista para o próximo estágio. Esse objeto contém secrets e a cadeia de certificados DICE, que contém informações de status acumuladas, por exemplo, se o último estágio foi carregado com segurança.

Dispositivos desbloqueados

Quando um dispositivo é desbloqueado com o fastboot oem unlock, os dados do usuário são excluídos de forma permanente. Esse processo protege os dados do usuário contra acesso não autorizado. Os dados privados de uma pVM também são invalidados quando ocorre um desbloqueio do dispositivo.

Depois de desbloqueado, o proprietário do dispositivo poderá atualizar novamente partições que geralmente são protegidas pela inicialização verificada, incluindo as partições que contêm a implementação do pKVM. Portanto, o pKVM em um dispositivo desbloqueado não é confiável para manter o modelo de segurança.

As partes remotas podem observar esse estado potencialmente inseguro inspecionando o estado de inicialização verificado do dispositivo em um certificado de atestado de chaves.