Поделиться через


Проблемы безопасности с общей памятью виртуальной машины NDIS

В этом разделе рассматриваются потенциальные проблемы безопасности, связанные с выделением общей памяти из виртуальной машины для буферов получения очереди виртуальных машин (VMQ). Раздел включает следующие подразделы:

Примечание В Hyper-V дочерний раздел также называется виртуальной машиной.

Общие сведения о проблемах безопасности с общей памятью виртуальной машины

Виртуальные машины не являются доверенными сущностями программного обеспечения. То есть вредоносная виртуальная машина не должна мешать другим виртуальным машинам или операционной системе управления, работающей в родительском разделе Hyper-V. В этом разделе содержатся общие сведения и требования, позволяющие обеспечить, чтобы средства записи драйверов понимали проблемы с безопасностью VMQ и требования к общей памяти. Дополнительные сведения об общей памяти см. в разделе Выделение ресурсов общей памяти в разделе Написание драйверов VMQ .

В виртуализированной среде виртуальная машина может просматривать или изменять общую память виртуальной машины. Однако просмотр или изменение данных, связанных с другими виртуальными машинами, запрещено. Виртуальным машинам также запрещен доступ к адресной области управления.

Часть заголовка полученных пакетов должна быть защищена. Виртуальная машина не может влиять на поведение расширяемого коммутатора Hyper-V в поставщике сетевых виртуальных служб (VSP). Поэтому фильтрация виртуальной локальной сети должна выполняться до того, как сетевой адаптер использует DMA для передачи данных в общую память виртуальной машины. Кроме того, невозможно повлиять на обучение mac-адресов переключателя.

Если порт расширяемого коммутатора Hyper-V, подключенный к виртуальной машине, имеет связанный идентификатор виртуальной локальной сети, главный компьютер должен убедиться, что MAC-адрес назначения и идентификатор виртуальной локальной сети входящего кадра соответствуют соответствующим атрибутам порта, прежде чем узел перенаправит пакет виртуальной сети виртуальной машины. Если идентификатор виртуальной локальной сети кадра не совпадает с идентификатором виртуальной локальной сети порта, пакет удаляется. Если буферы приема для виртуального сетевого адаптера выделяются из памяти узла, узел может проверка идентификатор виртуальной локальной сети и при необходимости удалить кадр, прежде чем сделать содержимое кадра видимым для целевой виртуальной машины. Если кадр не копируется в адресное пространство виртуальной машины, эта виртуальная машина не сможет получить доступ к нему.

Однако если vmq настроен для использования общей памяти, сетевой адаптер использует DMA для передачи входящих кадров непосредственно в адресное пространство виртуальной машины. Эта передача вызывает проблему безопасности, из-за которой виртуальная машина может проверять содержимое полученных кадров, не дожидаясь, пока расширяемый коммутатор применит необходимую фильтрацию виртуальной локальной сети.

Как Windows Server 2008 R2 решает проблему безопасности

В Windows Server 2008 R2 перед настройкой очереди виртуальных машин для использования общей памяти, выделенной из адресного пространства виртуальной машины, он использует следующий тест фильтрации для очереди.

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

Если оборудование сетевого адаптера может поддерживать этот тест перед передачей DMA в буферы приема, сетевой адаптер может либо удалить кадры с недопустимыми идентификаторами виртуальных ЛС, либо отправить их в очередь по умолчанию, чтобы их можно было отфильтровать с помощью расширяемого коммутатора. Если драйверу мини-порта удалось настроить фильтр с этим тестом в очереди, расширяемый коммутатор может использовать общую память виртуальной машины для этой очереди. Однако если оборудование сетевого адаптера не может фильтровать кадры на основе mac-адреса назначения и идентификатора виртуальной локальной сети, расширяемый коммутатор использует общую память узла для этой очереди.

Расширяемый коммутатор проверяет исходный MAC-адрес полученных кадров, чтобы настроить сведения о маршрутизации для кадров передачи, то есть он аналогичен коммутатору физического обучения. Можно установить драйверы фильтров брандмауэра в стеке узлов. Например, над драйвером мини-порта для оборудования сетевого адаптера и под драйвером расширяемого коммутатора. Драйверы фильтров брандмауэра могут получать доступ к данным в полученном кадре перед расширяемым коммутатором. Если весь буфер получения для каждого кадра выделяется из адресного пространства виртуальной машины, вредоносная виртуальная машина может получить доступ к частям кадра, которые будут проверены либо драйвером фильтра, либо расширяемым коммутатором, работающим на узле.

Чтобы устранить эту проблему безопасности, при использовании общей памяти виртуальной машины для очереди виртуальных машин сетевой адаптер должен разделить пакет на смещение в байтах, равное как минимум размеру lookahead, которое является предопределенным фиксированным значением. Все данные lookahead, то есть данные, которые опережают смещение байтов для размера lookahead, должны передаваться с помощью DMA в общую память, выделенную для данных lookahead. Данные после просмотра (остальная часть полезных данных кадра) должны быть переданы с помощью DMA в общую память, выделенную для данных после просмотра.

На следующем рисунке показаны связи для структур сетевых данных при разделении входящих данных на буферы общей памяти lookahead и post-lookahead.

Схема, иллюстрирующая структуры пакетов VMQ с данными lookahead и post-lookahead в отдельных буферах общей памяти.

Ниже приведены сводные требования к общей памяти VMQ.

  • Сетевой адаптер может разделить полученный кадр на границе заголовка сети, которая больше размера lookahead. Однако при запросе NDIS и без исключения все кадры, полученные и назначенные VMQ, должны быть разделены на границу размера lookahead, которую запрашивает NDIS, или за ней.

  • Данные lookahead должны передаваться с помощью DMA в общую память, выделенную драйвером мини-порта. Драйвер мини-порта должен указать в вызове выделения, что память будет использоваться для данных lookahead.

  • Данные после просмотра должны передаваться с помощью DMA в общую память, выделенную драйвером мини-порта. Драйвер мини-порта должен указать в вызове выделения, что память будет использоваться для данных после просмотра.

  • Драйверы минипорта не должны зависеть от того, какое адресное пространство NDIS будет использовать для выполнения запроса на выделение общей памяти. То есть адресное пространство общей памяти для данных lookahead или post-lookahead зависит от реализации. Во многих случаях NDIS или расширяемый коммутатор может удовлетворить все запросы из адресного пространства памяти узла, включая запросы для последующего просмотра.

  • Порядок, в котором кадры получаются в очереди получения VMQ, должен сохраняться, когда кадры в этой очереди указываются в стеке драйверов.

  • Сетевой адаптер должен выделять достаточно места для резервного заполнения в каждом буфере после просмотра. Это позволяет скопировать данные lookahead в часть обратного заполнения буфера после просмотра и доставить кадр на виртуальную машину в непрерывном буфере.

Если в оборудовании нет механизма для удовлетворения этих требований к общей памяти VMQ, оборудование, поддерживающее DMA с точечным сбором на стороне приема, может достичь одинаковых результатов, выделив два буфера приема для каждого полученного кадра. В этом случае размер первого буфера ограничен запрошенным размером lookahead.

Если сетевой адаптер не может удовлетворить эти требования для общей памяти VMQ каким-либо способом, VSP выделит память для буферов приема VMQ из адресного пространства узла и скопирует полученные пакеты из буферов приема сетевого адаптера в адресное пространство виртуальной машины.

Устранение проблемы безопасности в Windows Server 2012 и более поздних версиях

Начиная с Windows Server 2012, VSP не выделяет общую память из виртуальной машины для буферов получения VMQ. Вместо этого VSP выделяет память для буферов приема VMQ из адресного пространства узла, а затем копирует полученные пакеты из буферов приема сетевого адаптера в адресное пространство виртуальной машины.

Следующие моменты относятся к драйверам vmq miniport, работающим в Windows Server 2012 и более поздних версиях Windows:

  • Для драйверов NDIS 6.20 VMQ miniport никаких изменений не требуется. Однако когда VSP выделяет очередь виртуальной машины, отправляя запрос метода OID (идентификатор объекта) OID_RECEIVE_FILTER_ALLOCATE_QUEUE, он устанавливает для элемента LookaheadSize структуры NDIS_RECEIVE_QUEUE_PARAMETERS значение 0. Это приведет к тому, что драйвер мини-порта не будет разделять пакет на буферы предварительного просмотра и после просмотра.

  • Начиная с версии NDIS 6.30, драйверы минипорта VMQ не должны объявлять поддержку разделения данных пакетов на буферы предварительного просмотра и после просмотра. Когда драйвер мини-порта регистрирует свои возможности VMQ, он должен следовать следующим правилам при инициализации структуры NDIS_RECEIVE_FILTER_CAPABILITIES :

    • Драйвер мини-порта не должен устанавливать флаг NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED в элементе Flags .

    • Драйвер мини-порта должен установить для членов MinLookaheadSplitSize и MaxLookaheadSplitSize значение 0.

    Дополнительные сведения о регистрации возможностей VMQ см. в разделе Определение возможностей VMQ сетевого адаптера.