Partilhar via


Problemas de segurança com a memória compartilhada da máquina virtual (VM) NDIS

Este tópico discute os potenciais problemas de segurança envolvidos na alocação de memória partilhada de uma máquina virtual (VM) para os buffers de receção da fila de máquinas virtuais (VMQ). O tópico inclui as seguintes seções:

Observação No Hyper-V, uma partição filha também é conhecida como máquina virtual.

Visão geral dos problemas de segurança com a memória compartilhada da VM

As VMs não são entidades de software confiáveis. Ou seja, uma VM mal-intencionada não deve ser capaz de interferir com outras VMs ou com o sistema operacional de gerenciamento executado na partição pai Hyper-V. Esta seção fornece informações básicas e requisitos para garantir que os gravadores de driver entendam os problemas de segurança do VMQ e os requisitos para memória compartilhada. Para obter mais informações sobre memória compartilhada, consulte o tópico Shared Memory Resource Allocation na seção Writing VMQ Drivers.

No ambiente virtualizado, a memória compartilhada da VM pode ser visualizada ou modificada pela VM. No entanto, a visualização ou modificação de dados associados a outras VMs não é permitida. As VMs também não têm permissão para aceder ao espaço de endereços de gestão operacional.

A parte do cabeçalho dos pacotes recebidos deve ser protegida. Uma VM não tem permissão para afetar o comportamento do comutador extensível Hyper-V em um VSP (provedor de serviços virtuais) de rede. Portanto, a filtragem de VLAN (LAN virtual) deve acontecer antes que o adaptador de rede use DMA para transferir os dados para a memória compartilhada da VM. Além disso, o aprendizado de endereço MAC (controle de acesso à mídia) do switch não pode ser afetado.

Se a porta do comutador extensível Hyper-V conectada a uma VM tiver um identificador de VLAN associado, o computador host deverá garantir que o endereço MAC de destino e o identificador de VLAN do quadro de entrada correspondam aos respetivos atributos da porta antes que o host encaminhe o pacote para o adaptador de rede virtual da VM. Se o identificador de VLAN do quadro não corresponder ao identificador de VLAN da porta, o pacote será descartado. Quando os buffers de recebimento para um adaptador de rede virtual são alocados da memória do host, o host pode verificar o identificador de VLAN e soltar o quadro, se necessário, antes de tornar o conteúdo do quadro visível para a VM de destino. Se o quadro não for copiado para o espaço de endereçamento de uma VM, ele não poderá ser acessado por essa VM.

No entanto, quando o VMQ é configurado para usar memória compartilhada, o adaptador de rede usa DMA para transferir quadros de entrada diretamente para o espaço de endereçamento da VM. Essa transferência introduz um problema de segurança no qual uma VM pode examinar o conteúdo dos quadros recebidos sem esperar que o switch extensível aplique a filtragem de VLAN necessária.

Como o Windows Server 2008 R2 resolve o problema de segurança

No Windows Server 2008 R2, antes de o VSP configurar uma queue da VM para utilizar a memória partilhada alocada a partir do espaço de endereços da VM, é realizado o seguinte teste de filtragem para a queue.

(MAC address == x) && (VLAN identifier == n)

Se o hardware do adaptador de rede puder suportar este teste antes da transferência DMA para os buffers de receção, o adaptador de rede poderá descartar quadros com identificadores de VLAN inválidos ou redirecioná-los para a fila padrão para que possam ser filtrados pelo switch extensível. Se o driver de miniporta for bem-sucedido em uma solicitação para definir um filtro com esse teste em uma fila, o comutador extensível poderá usar a memória compartilhada da VM para essa fila. No entanto, se o hardware do adaptador de rede não for capaz de filtrar os quadros com base no endereço MAC de destino e no identificador VLAN, o switch extensível usará memória compartilhada do host para essa fila.

O switch extensível inspeciona o endereço MAC de origem dos quadros recebidos para configurar as informações de roteamento para quadros de transmissão, ou seja, é semelhante a um switch de aprendizagem física. É possível instalar drivers de filtro de firewall na pilha de host; por exemplo, acima do driver de miniport para o hardware do adaptador de rede e abaixo do driver do switch extensível. Os drivers de filtro de firewall podem acessar dados em um quadro recebido antes do switch extensível. Se todo o buffer de recebimento para cada quadro for alocado do espaço de endereço da VM, uma VM mal-intencionada poderá acessar partes do quadro que seriam examinadas por um driver de filtro ou pelo switch extensível executado no host.

Para resolver este problema de segurança, ao usar a memória partilhada da VM para uma fila de VM, o adaptador de rede deve dividir o pacote num deslocamento de byte que corresponda pelo menos ao tamanho de antecipação, que é um valor fixo predeterminado. Todos os dados de antecipação, ou seja, dados que estão à frente do deslocamento de byte para o tamanho de antecipação, devem ser transferidos por DMA para a memória partilhada que foi alocada para dados de antecipação. Os dados pós-análise — o restante da carga útil do quadro — devem ser transferidos via DMA para a memória partilhada que foi alocada para esses dados pós-análise.

A ilustração a seguir mostra as relações para as estruturas de dados de rede quando os dados de entrada são divididos em buffers de memória compartilhada lookahead e post-lookahead.

Diagrama ilustrando as estruturas de pacotes de VMQ, mostrando os dados lookahead e post-lookahead em buffers de memória compartilhada separados.

Os requisitos de resumo para memória compartilhada VMQ são os seguintes:

  • Um adaptador de rede pode dividir um quadro recebido num limite do cabeçalho da rede maior do que o tamanho de pré-visualização. No entanto, quando solicitado pelo NDIS, e sem exceção, todos os quadros recebidos e atribuídos a um VMQ devem ser divididos no limite de tamanho do lookahead ou além do que o NDIS solicita.

  • Os dados de antecipação devem ser transferidos com DMA para a memória partilhada atribuída pelo driver de miniporta. O driver de miniporta deve especificar na chamada de alocação que a memória será usada para dados lookahead.

  • Os dados pós-lookahead devem ser transferidos usando DMA para a memória partilhada que é alocada pelo driver miniport. O driver de miniport deve especificar na chamada de alocação que a memória será usada para dados de post-lookahead.

  • Os drivers de miniporta não devem depender de qual espaço de endereçamento o NDIS usará para concluir a solicitação de alocação de memória compartilhada. Ou seja, o espaço de endereço de memória partilhada para dados de antecipação ou pós-antecipação é específico da implementação. Em muitos casos, o NDIS ou o switch extensível pode satisfazer todas as solicitações, incluindo aquelas para uso após a análise prévia, a partir do espaço de endereçamento da memória do host.

  • A ordem na qual os quadros são recebidos em uma fila de recebimento VMQ deve ser preservada quando os quadros nessa fila são indicados na pilha de drivers.

  • O adaptador de rede deve alocar memória suficiente de backfill em cada buffer após o lookahead. Essa alocação permite que os dados lookahead sejam copiados para a parte de backfill do buffer pós-lookahead e permite que o frame seja entregue para a VM num buffer contíguo.

Se não houver nenhum mecanismo no hardware para atender a esses requisitos de memória compartilhada VMQ, o hardware que suporta DMA de coleta de dispersão no lado de recebimento pode obter os mesmos resultados alocando dois buffers de recebimento para cada quadro recebido. Nesse caso, o tamanho do primeiro buffer é limitado ao tamanho de lookahead solicitado.

Se o adaptador de rede não puder atender a esses requisitos de memória compartilhada VMQ por qualquer método, o VSP alocará memória para os buffers de recebimento VMQ do espaço de endereço do host e copiará os pacotes recebidos dos buffers de recebimento do adaptador de rede para o espaço de endereço da VM.

Como o Windows Server 2012 e versões posteriores abordam o problema de segurança

A partir do Windows Server 2012, o VSP não aloca memória compartilhada da VM para os buffers de recebimento VMQ. Em vez disso, o VSP aloca memória para os buffers de recebimento VMQ do espaço de endereço do host e, em seguida, copia os pacotes recebidos dos buffers de recebimento do adaptador de rede para o espaço de endereço da VM.

Os seguintes pontos se aplicam aos drivers de miniporta VMQ executados no Windows Server 2012 e versões posteriores do Windows:

  • Para drivers de miniporta VMQ NDIS 6.20, nenhuma alteração é necessária. No entanto, quando o VSP aloca uma fila de VM emitindo uma solicitação de método OID (identificador de objeto) de OID_RECEIVE_FILTER_ALLOCATE_QUEUE, ele definirá o LookaheadSize membro da estrutura NDIS_RECEIVE_QUEUE_PARAMETERS como zero. Isso forçará um driver de miniporta a não dividir o pacote em buffers antes e após o lookahead.

  • A partir do NDIS 6.30, os drivers de miniporta VMQ não devem oferecer suporte para dividir dados de pacotes em buffers pré-lookahead e pós-lookahead. Quando um driver de miniporta registra seus recursos VMQ, ele deve seguir estas regras quando inicializa a estrutura NDIS_RECEIVE_FILTER_CAPABILITIES:

    • O driver de miniporta não deve definir o sinalizador NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED no membro Flags .

    • Os membros MinLookaheadSplitSize e MaxLookaheadSplitSize do driver de miniporta devem ser definidos para zero.

    Para obter mais informações sobre como registrar recursos VMQ, consulte Determinando os recursos VMQ de um adaptador de rede.