共用方式為


NDIS 虛擬機器 (VM) 共用記憶體的安全性問題

本主題討論從虛擬機器 (VM) 配置共用記憶體的潛在安全性問題, (VMQ) 接收緩衝區。 本主題包含下列各節:

注意 在 Hyper-V 中,子磁碟分割也稱為 VM。

VM 共用記憶體的安全性問題概觀

VM 不是受信任的軟體實體。 也就是說,惡意 VM 不能幹擾其他 VM 或 Hyper-V 父磁碟分割中執行的管理作業系統。 本節提供背景資訊和需求,以確保驅動程式寫入器瞭解共用記憶體的 VMQ 安全性問題和需求。 如需共用記憶體的詳細資訊,請參閱撰寫 VMQ 驅動程式一節中的共用記憶體資源配置主題。

在虛擬化環境中,VM 可以檢視或修改 VM 共用記憶體。 不過,不允許檢視或修改與其他 VM 相關聯的資料。 VM 也不允許存取管理作業位址空間。

接收封包的標頭部分必須受到保護。 VM 不允許影響網路虛擬服務提供者中 Hyper-V 可延伸交換器的行為, (VSP) 。 因此,網路介面卡使用 DMA 將資料傳輸至 VM 共用記憶體之前,必須先進行 VLAN (虛擬 LAN) 篩選。 此外,媒體存取控制 (MAC) 位址學習無法受到影響。

如果連線至 VM 的 Hyper-V 可延伸交換器埠具有相關聯的 VLAN 識別碼,主機電腦必須確定傳入框架的目的地 MAC 位址和 VLAN 識別碼符合埠的個別屬性,主機才會將封包轉送至 VM 的虛擬網路介面卡。 如果畫面的 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 共用記憶體時,網路介面卡必須在至少為外觀大小的位元組位移分割封包,這是預先決定的固定值。 任何外觀資料—這表示在查閱頭大小的位元組位移之前的資料,必須使用 DMA 傳送至配置給 lookahead 資料的共用記憶體。 後置外觀資料—框架承載的其餘部分,應該以 DMA 傳送至配置給後置外觀資料的共用記憶體。

下圖顯示當傳入資料分割成 lookahead 和後置檢視共用記憶體緩衝區時,網路資料結構的關聯性。

說明 VMQ 封包結構的圖表,顯示個別共用記憶體緩衝區中的外觀和後置外觀資料。

VMQ 共用記憶體的摘要需求如下:

  • 網路介面卡可以在大於外觀大小的網路標頭界限上分割接收的框架。 不過,當 NDIS 要求且沒有例外狀況時,接收並指派給 VMQ 的所有畫面都必須分割在 NDIS 要求的外觀大小界限以上。

  • 外觀資料必須與 DMA 一起傳輸至迷你埠驅動程式所配置的共用記憶體。 迷你埠驅動程式必須在配置呼叫中指定記憶體將用於尋找資料。

  • 後置外觀資料必須與 DMA 一起傳輸至迷你埠驅動程式所配置的共用記憶體。 迷你埠驅動程式必須在配置呼叫中指定記憶體將用於後置外觀資料。

  • 迷你埠驅動程式不得相依于位址空間 NDIS 將用來完成共用記憶體配置要求。 也就是說,Lookahead 或後置外觀資料的共用記憶體位址空間是實作特定的。 在許多情況下,NDIS 或可延伸交換器可能會滿足所有要求,包括從主機記憶體位址空間使用後使用的要求。

  • 在 VMQ 接收佇列上接收框架的順序,必須在該佇列中的框架指出驅動程式堆疊時保留。

  • 網路介面卡必須在每個外觀後緩衝區中配置足夠的回填記憶體空間。 此配置可讓外觀資料複製到後置外觀緩衝區的回填部分,並允許框架在連續緩衝區中傳遞至 VM。

如果硬體中沒有符合這些 VMQ 共用記憶體需求的機制,則支援接收端散佈收集 DMA 的硬體可能會針對每個接收框架配置兩個接收緩衝區來達到相同的結果。 在此情況下,第一個緩衝區的大小會限制為所要求的外觀大小。

如果網路介面卡無法透過任何方法滿足 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 (物件識別碼) 方法要求OID_RECEIVE_FILTER_ALLOCATE_QUEUE來配置 VM 佇列時,它會NDIS_RECEIVE_QUEUE_PARAMETERS結構的LookaheadSize成員設定為零。 這會強制迷你埠驅動程式不要將封包分割成外觀前和外觀後緩衝區。

  • 從 NDIS 6.30 開始,VMQ 迷你埠驅動程式不得公告將封包資料分割成外觀前和後置外觀緩衝區的支援。 當迷你埠驅動程式註冊其 VMQ 功能時,必須在初始化 NDIS_RECEIVE_FILTER_CAPABILITIES 結構時遵循這些規則:

    • 迷你埠驅動程式不得在Flags成員中設定NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED旗標。

    • 迷你埠驅動程式必須將 MinLookaheadSplitSizeMaxLo一headSplitSize 成員設定為零。

    如需如何註冊 VMQ 功能的詳細資訊,請參閱 判斷網路介面卡的 VMQ 功能