다음을 통해 공유


NDIS VM(가상 머신) 공유 메모리의 보안 문제

이 항목에서는 VMQ(가상 머신 큐) 수신 버퍼에 대해 VM(가상 머신)에서 공유 메모리를 할당하는 데 관련된 잠재적인 보안 문제에 대해 설명합니다. 이 항목은 다음과 같은 섹션으로 구성됩니다.

참고 Hyper-V에서 자식 파티션을 VM이라고도 합니다.

VM 공유 메모리의 보안 문제 개요

VM은 신뢰할 수 있는 소프트웨어 엔터티가 아닙니다. 즉, 악의적인 VM이 Hyper-V 부모 파티션에서 실행되는 다른 VM 또는 관리 운영 체제를 방해할 수 없어야 합니다. 이 섹션에서는 드라이버 작성기가 공유 메모리에 대한 VMQ 보안 문제 및 요구 사항을 이해할 수 있도록 배경 정보 및 요구 사항을 제공합니다. 공유 메모리에 대한 자세한 내용은 VMQ 드라이버 작성 섹션의 공유 메모리 리소스 할당 항목을 참조하세요.

가상화된 환경에서 VM 공유 메모리는 VM에서 보거나 수정할 수 있습니다. 그러나 다른 VM과 연결된 데이터를 보거나 수정할 수 없습니다. 또한 VM은 관리 운영 주소 공간에 액세스할 수 없습니다.

수신된 패킷의 헤더 부분을 보호해야 합니다. VM은 네트워크 VSP(가상 서비스 공급자)에서 Hyper-V 확장 가능 스위치의 동작에 영향을 줄 수 없습니다. 따라서 네트워크 어댑터가 DMA를 사용하여 데이터를 VM 공유 메모리로 전송하기 전에 VLAN(가상 LAN) 필터링이 발생해야 합니다. 또한 스위치의 MAC(미디어 액세스 제어) 주소 학습은 영향을 받을 수 없습니다.

VM에 연결된 Hyper-V 확장 가능 스위치 포트에 연결된 VLAN 식별자가 있는 경우 호스트 컴퓨터는 호스트가 VM의 가상 네트워크 어댑터에 패킷을 전달하기 전에 들어오는 프레임의 대상 MAC 주소와 VLAN 식별자가 포트의 해당 특성과 일치하는지 확인해야 합니다. 프레임의 VLAN 식별자가 포트의 VLAN 식별자와 일치하지 않으면 패킷이 삭제됩니다. 가상 네트워크 어댑터에 대한 수신 버퍼가 호스트 메모리에서 할당되면 호스트는 VLAN 식별자를 검사 필요한 경우 프레임을 삭제한 후 프레임의 내용을 대상 VM에 표시할 수 있습니다. 프레임이 VM의 주소 공간에 복사되지 않은 경우 해당 VM에서 액세스할 수 없습니다.

그러나 VMQ가 공유 메모리를 사용하도록 구성된 경우 네트워크 어댑터는 DMA를 사용하여 들어오는 프레임을 VM 주소 공간으로 직접 전송합니다. 이 전송은 VM이 필요한 VLAN 필터링을 적용하기 위해 확장 가능한 스위치를 기다리지 않고 수신된 프레임의 콘텐츠를 검사할 수 있는 보안 문제를 도입합니다.

Windows Server 2008 R2에서 보안 문제를 해결하는 방법

Windows Server 2008 R2에서 VSP가 VM 주소 공간에서 할당된 공유 메모리를 사용하도록 VM 큐를 구성하기 전에 큐에 대해 다음 필터링 테스트를 사용합니다.

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

네트워크 어댑터 하드웨어가 DMA가 수신 버퍼로 전송되기 전에 이 테스트를 지원할 수 있는 경우 네트워크 어댑터는 잘못된 VLAN 식별자가 있는 프레임을 삭제하거나 확장 가능한 스위치로 필터링할 수 있도록 기본 큐로 보낼 수 있습니다. 미니포트 드라이버가 큐에서 이 테스트를 사용하여 필터를 설정하는 요청에 성공하면 확장 가능한 스위치는 해당 큐에 VM 공유 메모리를 사용할 수 있습니다. 그러나 네트워크 어댑터 하드웨어가 대상 MAC 주소와 VLAN 식별자를 기반으로 프레임을 필터링할 수 없는 경우 확장 가능한 스위치는 해당 큐에 호스트 공유 메모리를 사용합니다.

확장 가능한 스위치는 수신된 프레임의 원본 MAC 주소를 검사하여 전송 프레임에 대한 라우팅 정보를 구성합니다. 즉, 물리적 학습 스위치와 비슷합니다. 호스트 스택에 방화벽 필터 드라이버를 설치할 수 있습니다. 예를 들어 네트워크 어댑터 하드웨어의 미니포트 드라이버 위와 확장 가능한 스위치 드라이버 아래에 있습니다. 방화벽 필터 드라이버는 확장 가능한 스위치 전에 수신된 프레임의 데이터에 액세스할 수 있습니다. 각 프레임의 전체 수신 버퍼가 VM 주소 공간에서 할당되는 경우 악의적인 VM은 필터 드라이버 또는 호스트에서 실행되는 확장 가능한 스위치에서 검사할 프레임의 일부에 액세스할 수 있습니다.

이 보안 문제를 해결하려면 VM 큐에 VM 공유 메모리를 사용하는 경우 네트워크 어댑터는 미리 결정된 고정 값인 적어도 lookahead 크기인 바이트 오프셋으로 패킷을 분할해야 합니다. lookahead 크기의 바이트 오프셋보다 앞서는 데이터를 의미하는 모든 lookahead 데이터는 lookahead 데이터에 할당된 공유 메모리로 DMA와 함께 전송되어야 합니다. 프레임 페이로드의 나머지 부분인 사후 조회 데이터는 DMA와 함께 사후 조회 데이터에 할당된 공유 메모리로 전송되어야 합니다.

다음 그림에서는 들어오는 데이터가 lookahead 및 사후 조회 공유 메모리 버퍼로 분할되는 경우 네트워크 데이터 구조에 대한 관계를 보여 줍니다.

별도의 공유 메모리 버퍼에서 lookahead 및 사후 조회 데이터를 보여 주는 VMQ 패킷 구조를 보여 주는 다이어그램

VMQ 공유 메모리에 대한 요약 요구 사항은 다음과 같습니다.

  • 네트워크 어댑터는 lookahead 크기보다 큰 네트워크 헤더 경계에서 수신된 프레임을 분할할 수 있습니다. 그러나 NDIS에서 요청하거나 예외 없이 VMQ에 수신 및 할당된 모든 프레임은 NDIS가 요청하는 lookahead 크기 경계를 벗어나서 분할되어야 합니다.

  • lookahead 데이터는 미니포트 드라이버에서 할당한 공유 메모리로 DMA와 함께 전송되어야 합니다. 미니포트 드라이버는 할당 호출에서 메모리가 lookahead 데이터에 사용되도록 지정해야 합니다.

  • 조회 후 데이터는 미니포트 드라이버에서 할당한 공유 메모리로 DMA와 함께 전송되어야 합니다. 미니포트 드라이버는 할당 호출에서 메모리가 사후 조회 데이터에 사용되도록 지정해야 합니다.

  • 미니포트 드라이버는 NDIS가 공유 메모리 할당 요청을 완료하는 데 사용할 주소 공간에 의존해서는 안 됩니다. 즉, lookahead 또는 사후 조회 데이터에 대한 공유 메모리 주소 공간은 구현별로 다릅니다. 대부분의 경우 NDIS 또는 확장 가능한 스위치는 호스트 메모리 주소 공간에서 사후 조회 사용을 위한 요청을 포함하여 모든 요청을 충족할 수 있습니다.

  • VMQ 수신 큐에서 프레임이 수신되는 순서는 해당 큐의 프레임이 드라이버 스택에 표시될 때 유지되어야 합니다.

  • 네트워크 어댑터는 각 사후 조회 버퍼에 충분한 백필 메모리 공간을 할당해야 합니다. 이 할당을 통해 lookahead 데이터를 사후 조회 버퍼의 백필 부분에 복사할 수 있으며 연속 버퍼의 VM에 프레임을 전달할 수 있습니다.

VMQ 공유 메모리에 대한 이러한 요구 사항을 충족하는 메커니즘이 하드웨어에 없는 경우 수신 쪽에서 분산 수집 DMA를 지원하는 하드웨어는 수신된 각 프레임에 대해 두 개의 수신 버퍼를 할당하여 동일한 결과를 얻을 수 있습니다. 이 경우 첫 번째 버퍼의 크기는 요청된 lookahead 크기로 제한됩니다.

네트워크 어댑터가 어떤 방법으로든 VMQ 공유 메모리에 대한 이러한 요구 사항을 충족할 수 없는 경우 VSP는 호스트 주소 공간에서 VMQ 수신 버퍼에 대한 메모리를 할당하고 네트워크 어댑터 수신 버퍼에서 받은 패킷을 VM 주소 공간으로 복사합니다.

Windows Server 2012 이상 버전에서 보안 문제를 해결하는 방법

Windows Server 2012부터 VSP는 VMQ 수신 버퍼에 대한 VM에서 공유 메모리를 할당하지 않습니다. 대신 VSP는 호스트 주소 공간에서 VMQ 수신 버퍼에 대한 메모리를 할당한 다음, 네트워크 어댑터 수신 버퍼에서 받은 패킷을 VM 주소 공간으로 복사합니다.

다음 사항은 Windows Server 2012 이상 버전의 Windows에서 실행되는 VMQ 미니포트 드라이버에 적용됩니다.

  • NDIS 6.20 VMQ 미니포트 드라이버의 경우 변경할 필요가 없습니다. 그러나 VSP가 OID_RECEIVE_FILTER_ALLOCATE_QUEUE OID(개체 식별자) 메서드 요청을 실행하여 VM 큐를 할당하면 NDIS_RECEIVE_QUEUE_PARAMETERS 구조체의 LookaheadSize 멤버가 0으로 설정됩니다. 이렇게 하면 미니포트 드라이버가 패킷을 미리 보이는 버퍼와 사후 조회 버퍼로 분할하지 않도록 합니다.

  • NDIS 6.30부터 VMQ 미니포트 드라이버는 패킷 데이터를 미리 보기 및 사후 조회 버퍼로 분할하는 지원을 보급해서는 안 됩니다. 미니포트 드라이버가 VMQ 기능을 등록하는 경우 NDIS_RECEIVE_FILTER_CAPABILITIES 구조를 초기화할 때 다음 규칙을 따라야 합니다.

    • 미니포트 드라이버는 Flags 멤버에서 NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED 플래그를 설정해서는 안됩니다.

    • 미니포트 드라이버는 MinLookaheadSplitSizeMaxLookaheadSplitSize 멤버를 0으로 설정해야 합니다.

    VMQ 기능을 등록하는 방법에 대한 자세한 내용은 네트워크 어댑터의 VMQ 기능 확인 을 참조하세요.