Проблемы с безопасностью в связи с совместно используемой памятью виртуальной машины (VM) NDIS
В этом разделе обсуждаются потенциальные уязвимости безопасности, связанные с выделением общей памяти виртуальной машиной для буферов приема очередей виртуальных машин (VMQ). Этот раздел содержит следующие разделы:
Обзор вопросов безопасности, связанных с общей памятью виртуальных машин
как Windows Server 2012 и более поздние версии устраняют проблему безопасности
примечание в 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", который является предопределенным фиксированным значением. Любые данные предварительного просмотра, то есть данные, которые опережают смещение байтов для размера предварительного просмотра, необходимо передать с использованием DMA в общую память, выделенную для данных предварительного просмотра. Данные post-lookahead (остальная часть полезных данных кадра) должны быть переданы с помощью DMA в общую память, выделенную для данных post-lookahead.
На следующем рисунке показаны связи для сетевых структур данных, когда входящие данные разделены на буферы общей памяти предварительного просмотра и последующего просмотра.
Сводные требования к общей памяти VMQ приведены следующим образом:
Сетевой адаптер может разделить полученный кадр на границе сетевого заголовка, которая больше размера предварительного просмотра. Однако, когда это требуется NDIS, и без исключения, все кадры, полученные и назначенные VMQ, должны быть разделены на границе размера предпросмотра, запрашиваемой NDIS.
Данные lookahead должны передаваться по DMA в общую память, выделенную минипорт-драйвером. Драйвер минипорта должен указать в вызове выделения, что выделенная память будет использоваться для предварительных данных.
Данные пост-предвосхищения должны передаваться с помощью DMA в общую память, выделенную минипорт-драйвером. Минипорт-драйвер должен указать в вызове выделения, что память будет использоваться для данных послепредварительного анализа.
Драйверы мини-порта не должны зависеть от того, какое адресное пространство NDIS будет использоваться для завершения запроса на выделение общей памяти. То есть адресное пространство общей памяти для данных lookahead или post-lookahead зависит от реализации. Во многих случаях NDIS или расширяемый коммутатор могут удовлетворить все запросы, включая те, которые предназначены для использования после предварительного анализа, из адресного пространства памяти хоста.
Порядок получения кадров в очереди получения VMQ должен быть сохранен, когда кадры в этой очереди указываются в стеке драйверов.
Сетевой адаптер должен выделить достаточно резервного пространства памяти в каждом буфере с упреждающим просмотром. Это выделение позволяет скопировать данные lookahead в резервную часть буфера post-lookahead, а кадр будет доставлен на виртуальную машину в непрерывном буфере.
Если в оборудовании нет механизма, соответствующего этим требованиям для общей памяти VMQ, оборудование, поддерживающее точечную сборку DMA на стороне получения, может достичь одинаковых результатов путем выделения двух буферов получения для каждого полученного кадра. В этом случае размер первого буфера ограничен до запрашиваемого размера предварительного просмотра.
Если сетевой адаптер не может соответствовать указанным требованиям для общей памяти VMQ любым методом, VSP выделяет память для буферов приёма VMQ из адресного пространства узла и копирует полученные пакеты из буферов приёма сетевого адаптера в адресное пространство виртуальной машины.
как Windows Server 2012 и более поздние версии устраняют проблему безопасности.
Начиная с Windows Server 2012, VSP не выделяет общую память от виртуальной машины (VM) для буферов приёма VMQ. Вместо этого VSP выделяет память для буферов получения VMQ из адресного пространства узла, а затем копирует полученные пакеты из буферов сетевого адаптера в адресное пространство виртуальной машины.
Следующие моменты относятся к драйверам минипорта VMQ, работающим в Windows Server 2012 и более поздних версиях Windows:
Для драйверов минипорта VMQ NDIS 6.20 изменения не требуются. Однако, когда VSP выделяет очередь виртуальной машины, выдавая запрос метода OID (идентификатор объекта) OID_RECEIVE_FILTER_ALLOCATE_QUEUE, он установит элемент LookaheadSize структуры NDIS_RECEIVE_QUEUE_PARAMETERS равным нулю. Это заставит минипорт-драйвер не разбивать пакет на буферы упреждающего и последующего чтения.
Начиная с версии NDIS 6.30 драйверы минипорта VMQ не должны объявлять поддержку разделения данных пакета на буферы предварительного просмотра и после просмотра. При регистрации возможностей VMQ драйвер минипорта должен следовать этим правилам при инициализации структуры NDIS_RECEIVE_FILTER_CAPABILITIES:
Драйвер минипорта не должен устанавливать флаг NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED в элементе Flags.
Драйвер минипорта должен задать для членов MinLookaheadSplitSize и MaxLookaheadSplitSize равными нулю.
Дополнительные сведения о регистрации возможностей VMQ см. в определении возможностей сетевого адаптера.