Problemas de seguridad con la memoria compartida de la máquina virtual (VM) de NDIS
En este tema se describen los posibles problemas de seguridad relacionados con la asignación de memoria compartida de una máquina virtual (VM) para los búferes de recepción de la cola de máquinas virtuales (VMQ). El tema incluye las siguientes secciones:
Información general sobre los problemas de seguridad con la memoria compartida de la máquina virtual
Cómo Windows Server 2008 R2 soluciona el problema de seguridad
Cómo Windows Server 2012 y versiones posteriores abordan el problema de seguridad
Nota En Hyper-V, una partición secundaria también se conoce como máquina virtual.
Información general sobre los problemas de seguridad con la memoria compartida de la máquina virtual
Las máquinas virtuales no son entidades de software de confianza. Es decir, una máquina virtual malintencionada no debe poder interferir con otras máquinas virtuales ni con el sistema operativo de administración que se ejecuta en la partición primaria de Hyper-V. En esta sección se proporciona información general y requisitos para garantizar que los escritores de controladores comprendan los problemas y requisitos de seguridad de VMQ para la memoria compartida. Para obtener más información sobre la memoria compartida, consulte el tema Asignación de recursos de memoria compartida en la sección Escritura de controladores de VMQ .
En el entorno virtualizado, la máquina virtual puede ver o modificar la memoria compartida de la máquina virtual. Sin embargo, no se permite ver o modificar datos asociados a otras máquinas virtuales. Tampoco se permite que las máquinas virtuales accedan al espacio de direcciones operativos de administración.
La parte del encabezado de los paquetes recibidos debe estar protegida. No se permite que una máquina virtual afecte al comportamiento del conmutador extensible de Hyper-V en un proveedor de servicios virtuales de red (VSP). Por lo tanto, el filtrado de VLAN (LAN virtual) debe producirse antes de que el adaptador de red use DMA para transferir los datos a la memoria compartida de la máquina virtual. Además, el aprendizaje de la dirección del control de acceso multimedia (MAC) del conmutador no puede verse afectado.
Si el puerto de conmutador extensible de Hyper-V que está conectado a una máquina virtual tiene un identificador VLAN asociado, el equipo host debe asegurarse de que la dirección MAC de destino y el identificador VLAN del marco entrante coincidan con los atributos respectivos del puerto antes de que el host reenvíe el paquete al adaptador de red virtual de la máquina virtual. Si el identificador VLAN del marco no coincide con el identificador de VLAN del puerto, se quita el paquete. Cuando los búferes de recepción de un adaptador de red virtual se asignan desde la memoria del host, el host puede comprobar el identificador de VLAN y quitar el marco si es necesario antes de que el contenido del marco sea visible para la máquina virtual de destino. Si el marco no se copia en el espacio de direcciones de una máquina virtual, esa máquina virtual no puede acceder a ella.
Sin embargo, cuando VMQ está configurado para usar memoria compartida, el adaptador de red usa DMA para transferir fotogramas entrantes directamente al espacio de direcciones de la máquina virtual. Esta transferencia presenta un problema de seguridad en el que una máquina virtual puede examinar el contenido de los fotogramas recibidos sin esperar a que el conmutador extensible aplique el filtrado de VLAN necesario.
Cómo Windows Server 2008 R2 soluciona el problema de seguridad
En Windows Server 2008 R2, antes de que VSP configure una cola de máquinas virtuales para usar la memoria compartida asignada desde el espacio de direcciones de la máquina virtual, usa la siguiente prueba de filtrado para la cola.
(MAC address == x) && (VLAN identifier == n)
Si el hardware del adaptador de red puede admitir esta prueba antes de la transferencia de DMA a los búferes de recepción, el adaptador de red puede quitar fotogramas con identificadores VLAN no válidos o enviarlos a la cola predeterminada para que el conmutador extensible pueda filtrarlos. Si el controlador de minipuerto se realiza correctamente en una solicitud para establecer un filtro con esta prueba en una cola, el conmutador extensible puede usar la memoria compartida de máquina virtual para esa cola. Sin embargo, si el hardware del adaptador de red no es capaz de filtrar los fotogramas en función de la dirección MAC de destino y el identificador VLAN, el conmutador extensible usa la memoria compartida del host para esa cola.
El conmutador extensible inspecciona la dirección MAC de origen de los fotogramas recibidos para configurar la información de enrutamiento para los fotogramas de transmisión; es decir, es similar a un conmutador de aprendizaje físico. Es posible instalar controladores de filtro de firewall en la pila de hosts; por ejemplo, encima del controlador de minipuerto para el hardware del adaptador de red y debajo del controlador de conmutador extensible. Los controladores de filtro de firewall pueden acceder a los datos de un marco recibido antes del conmutador extensible. Si todo el búfer de recepción de cada fotograma se asigna desde el espacio de direcciones de la máquina virtual, una máquina virtual malintencionada podría tener acceso a partes del marco que se examinarían mediante un controlador de filtro o el conmutador extensible que se ejecuta en el host.
Para solucionar este problema de seguridad, al usar la memoria compartida de la máquina virtual para una cola de vm, el adaptador de red debe dividir el paquete en un desplazamiento de bytes que sea al menos el tamaño de búsqueda anticipada, que es un valor fijo predeterminado. Los datos de búsqueda anticipada, lo que significa que los datos que están por delante del desplazamiento de bytes para el tamaño de lookahead, deben transferirse con DMA a la memoria compartida que se asignó para los datos de búsqueda anticipada. Los datos posteriores a la apariencia (el resto de la carga útil del fotograma) deben transferirse con DMA a la memoria compartida que se asignó para los datos posteriores al aspecto.
En la ilustración siguiente se muestran las relaciones de las estructuras de datos de red cuando los datos entrantes se dividen en búferes de memoria compartida de búsqueda anticipada y posterior.
Los requisitos de resumen de la memoria compartida de VMQ son los siguientes:
Un adaptador de red puede dividir un marco recibido en un límite de encabezado de red mayor que el tamaño de lookahead. Sin embargo, cuando lo solicite NDIS y, sin excepción, todos los fotogramas que se reciben y se asignan a una VMQ deben dividirse en o más allá del límite de tamaño de búsqueda anticipada que solicita NDIS.
Los datos de lookahead deben transferirse con DMA a la memoria compartida asignada por el controlador de minipuerto. El controlador de minipuerto debe especificar en la llamada de asignación que se usará la memoria para los datos de búsqueda anticipada.
Los datos posteriores a la apariencia deben transferirse con DMA a la memoria compartida asignada por el controlador de minipuerto. El controlador de minipuerto debe especificar en la llamada de asignación que se usará la memoria para los datos posteriores al aspecto.
Los controladores de minipuerto no deben depender del espacio de direcciones que usará NDIS para completar la solicitud de asignación de memoria compartida. Es decir, el espacio de direcciones de memoria compartida para los datos lookahead o post-lookahead es específico de la implementación. En muchos casos, NDIS o el conmutador extensible pueden satisfacer todas las solicitudes, incluidas las para el uso posterior a lookahead, desde el espacio de direcciones de memoria del host.
El orden en que se reciben fotogramas en una cola de recepción de VMQ debe conservarse cuando los marcos de esa cola se indican en la pila de controladores.
El adaptador de red debe asignar suficiente espacio de memoria de reposición en cada búfer posterior a la apariencia. Esta asignación permite copiar los datos de lookahead en la parte de reposición del búfer posterior al lookahead y permite que el marco se entregue a la máquina virtual en un búfer contiguo.
Si no hay ningún mecanismo en el hardware para cumplir estos requisitos para la memoria compartida de VMQ, el hardware que admite DMA de recopilación de dispersión en el lado de recepción podría lograr los mismos resultados asignando dos búferes de recepción para cada fotograma recibido. En este caso, el tamaño del primer búfer se limita al tamaño de lookahead solicitado.
Si el adaptador de red no puede cumplir estos requisitos para la memoria compartida de VMQ por cualquier método, VSP asignará memoria para los búferes de recepción de VMQ del espacio de direcciones del host y copiará los paquetes recibidos del adaptador de red recibir búferes en el espacio de direcciones de la máquina virtual.
Cómo Windows Server 2012 y versiones posteriores abordan el problema de seguridad
A partir de Windows Server 2012, VSP no asigna memoria compartida de la máquina virtual para los búferes de recepción de VMQ. En su lugar, VSP asigna memoria para los búferes de recepción de VMQ del espacio de direcciones del host y, a continuación, copia los paquetes recibidos del adaptador de red recibir búferes en el espacio de direcciones de la máquina virtual.
Los siguientes puntos se aplican a los controladores de miniporte de VMQ que se ejecutan en Windows Server 2012 y versiones posteriores de Windows:
En el caso de los controladores de minipuerto de VMQ NDIS 6.20, no se requiere ningún cambio. Sin embargo, cuando VSP asigna una cola de máquina virtual mediante la emisión de una solicitud de método OID (identificador de objeto) de OID_RECEIVE_FILTER_ALLOCATE_QUEUE, establecerá el miembro LookaheadSize de la estructura NDIS_RECEIVE_QUEUE_PARAMETERS en cero. Esto forzará que un controlador de minipuerto no divida el paquete en búferes previos y posteriores a la apariencia.
A partir de NDIS 6.30, los controladores de minipuerto de VMQ no deben anunciar compatibilidad para dividir los datos de paquetes en búferes previos y posteriores a la apariencia. Cuando un controlador de minipuerto registra sus funcionalidades de VMQ, debe seguir estas reglas cuando inicializa la estructura de NDIS_RECEIVE_FILTER_CAPABILITIES :
El controlador de minipuerto no debe establecer la marca NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED en el miembro Flags .
El controlador de minipuerto debe establecer los miembros MinLookaheadSplitSize y MaxLookaheadSplitSize en cero.
Para más información sobre cómo registrar las funcionalidades de VMQ, consulte Determinación de las funcionalidades de VMQ de un adaptador de red.