Compartir a través de


Problemas de seguridad con la memoria compartida de la máquina virtual (VM) NDIS

En este tema se describen los posibles problemas de seguridad relacionados con la asignación de memoria compartida desde una máquina virtual (VM) para los búferes de recepción de cola de máquinas virtuales (VMQ). El tema incluye las secciones siguientes:

Nota En Hyper-V, una partición secundaria también se conoce como una máquina virtual.

Información general sobre los problemas de seguridad con la memoria compartida de máquina virtual

Las máquinas virtuales no son entidades de software de confianza. Es decir, una máquina virtual malintencionada no debe ser capaz de interferir con otras máquinas virtuales o 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 asegurarse de 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 permiten la visualización o modificación de 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 de encabezado de los paquetes recibidos debe estar protegida. No se permite que una máquina virtual afecte al comportamiento del conmutador extensible 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 direcciones del control de acceso multimedia (MAC) del conmutador no puede verse afectado.

Si el Hyper-V puerto de conmutador extensible 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 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 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 la 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 DMA a los búferes de recepción, el adaptador de red puede quitar fotogramas con identificadores de VLAN no válidos o enviarlos a la cola predeterminada para que el conmutador extensible pueda filtrarlos. Si el controlador de miniporte tiene éxito en una solicitud para establecer un filtro en una cola, el conmutador extensible puede usar la memoria compartida de la máquina virtual para esa cola. Sin embargo, si el hardware del adaptador de red no es capaz de filtrar los fotogramas basados simultáneamente en la dirección MAC de destino y en el identificador VLAN, el conmutador extensible utiliza 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 del host; por ejemplo, sobre el controlador de miniport para el hardware del adaptador de red y por debajo del controlador del conmutador extensible. Los controladores de filtro de firewall pueden acceder a los datos de un marco recibido antes del conmutador extensible. Si se asigna todo el búfer de recepción para cada trama desde el espacio de direcciones de la máquina virtual, una máquina virtual malintencionada podría tener acceso a partes de la trama 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, cuando se usa la memoria compartida de máquina virtual para una cola de máquina virtual, el adaptador de red debe dividir el paquete en un desplazamiento de bytes que sea al menos el tamaño de lookahead, que es un valor fijo predeterminado. Todos los datos de *lookahead* —lo que significa los datos que están por delante del desplazamiento de bytes según el tamaño de *lookahead*— deben transferirse con DMA a la memoria compartida que se asignó para los datos de *lookahead*. Los datos posteriores a la apariencia (el resto de la carga de fotogramas) deben transferirse con DMA a la memoria compartida asignada para los datos posteriores a la apariencia.

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 lookahead y post-lookahead.

Diagrama que ilustra las estructuras de paquetes VMQ, mostrando datos de lookahead y post-lookahead en buffers de memoria compartidos independientes.

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 asignan a una VMQ deben dividirse en o más allá del límite de tamaño de lookahead que solicita NDIS.

  • Los datos de lookahead deben transferirse mediante DMA a la memoria compartida que ha sido asignada por el controlador miniport. El controlador de miniport debe especificar en la llamada de asignación que la memoria se usará para los datos de anticipación.

  • Los datos de prelectura deben transferirse con DMA a la memoria compartida asignada por el controlador miniport. El controlador de miniport debe especificar en la llamada de asignación que la memoria se utilizará para los datos posteriores a la predicción.

  • Los controladores de miniport 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 de uso posterior al análisis anticipado, 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 fotogramas 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 de anticipación. 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 buffer se limita al tamaño de anticipación 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 desde el espacio de direcciones del host y copiará los paquetes recibidos de los búferes de recepción del adaptador de red al 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, el 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 desde el espacio de direcciones del host y, a continuación, copia los paquetes recibidos en los búferes de recepción del adaptador de red al espacio de direcciones de la máquina virtual.

Los puntos siguientes se aplican a los controladores de miniport de VMQ que se ejecutan en Windows Server 2012 y versiones posteriores de Windows:

  • En el caso de los controladores de miniporte 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 miniport no divida el paquete en búferes de pre-anticipación y post-anticipación.

  • A partir de NDIS 6.30, los controladores miniport de VMQ no deben declarar el soporte para dividir los datos de paquetes en búferes de precaptura y postcaptura. Cuando un controlador de miniporte 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 el indicador NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED en el miembro Flags.

    • ** El controlador de miniport debe establecer en cero los miembros MinLookaheadSplitSize y MaxLookaheadSplitSize.

    Para obtener 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.