Condividi tramite


Problemi di sicurezza con la memoria condivisa della macchina virtuale NDIS

Questo argomento illustra i potenziali problemi di sicurezza relativi all'allocazione di memoria condivisa da una macchina virtuale (VM) per i buffer di ricezione della coda di macchine virtuali (VMQ). L'argomento include le sezioni seguenti:

Nota in Hyper-V, una partizione figlia è nota anche come Macchina Virtuale.

Panoramica dei problemi di sicurezza relativi alla memoria condivisa della macchina virtuale

Le macchine virtuali non sono entità software attendibili. Ovvero, una macchina virtuale dannosa non deve essere in grado di interferire con altre macchine virtuali o il sistema operativo di gestione eseguito nella Hyper-V partizione padre. Questa sezione fornisce informazioni di base e requisiti per garantire che gli scrittori di driver comprendano i problemi di sicurezza VMQ e i requisiti per la memoria condivisa. Per ulteriori informazioni sull'assegnazione delle risorse di memoria condivisa, vedere l'argomento assegnazione delle risorse di memoria condivisa nella sezione Scrittura dei driver VMQ .

Nell'ambiente virtualizzato la memoria condivisa della macchina virtuale può essere visualizzata o modificata dalla macchina virtuale. Tuttavia, la visualizzazione o la modifica di dati associati ad altre macchine virtuali non sono consentite. Le macchine virtuali non sono inoltre autorizzate ad accedere allo spazio degli indirizzi operativi di gestione.

La parte di intestazione dei pacchetti ricevuti deve essere protetta. Una macchina virtuale non può influire sul comportamento del commutatore estendibile Hyper-V in un provider di servizi virtuali di rete. Di conseguenza, il filtro VLAN (virtual LAN) deve avvenire prima che la scheda di rete usi DMA per trasferire i dati alla memoria condivisa della macchina virtuale. Inoltre, l'apprendimento degli indirizzi MAC (Media Access Control) del switch non può essere compromesso.

Se la porta del commutatore estendibile Hyper-V connessa a una macchina virtuale ha un identificatore VLAN associato, il computer host deve assicurarsi che l'indirizzo MAC di destinazione e l'identificatore VLAN del frame in ingresso corrispondano ai rispettivi attributi della porta prima che l'host inoltra il pacchetto alla scheda di rete virtuale della macchina virtuale. Se l'identificatore VLAN del frame non corrisponde all'identificatore VLAN della porta, il pacchetto viene eliminato. Quando i buffer di ricezione per una scheda di rete virtuale vengono allocati dalla memoria host, l'host può controllare l'identificatore VLAN ed eliminare il frame, se necessario, prima di rendere visibile il contenuto del frame alla macchina virtuale di destinazione. Se il frame non viene copiato nello spazio indirizzi di una macchina virtuale, non è possibile accedervi da tale macchina virtuale.

Tuttavia, quando VMQ è configurato per l'uso della memoria condivisa, la scheda di rete usa DMA per trasferire i frame in ingresso direttamente nello spazio degli indirizzi della macchina virtuale. Questo trasferimento introduce un problema di sicurezza in cui una macchina virtuale può esaminare il contenuto dei fotogrammi ricevuti senza attendere che il commutatore estendibile applichi il filtro VLAN richiesto.

come Windows Server 2008 R2 risolve il problema di sicurezza

In Windows Server 2008 R2, prima che il VSP configuri una coda di macchine virtuali per l'uso della memoria condivisa allocata dallo spazio degli indirizzi della macchina virtuale, usa il test di filtro seguente per la coda.

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

Se l'hardware della scheda di rete può supportare questo test prima del trasferimento DMA ai buffer di ricezione, la scheda di rete può eliminare i frame con identificatori VLAN non validi o inviarli alla coda predefinita in modo che possano essere filtrati dal commutatore estendibile. Se il driver miniport ha esito positivo in una richiesta per impostare un filtro con questo test in una coda, il commutatore estendibile può usare la memoria condivisa della macchina virtuale per tale coda. Tuttavia, se l'hardware della scheda di rete non è in grado di filtrare i pacchetti in base all'indirizzo MAC di destinazione e all'identificatore VLAN, il commutatore estendibile usa la memoria condivisa dell'host per tale coda.

L'opzione estendibile controlla l'indirizzo MAC di origine dei fotogrammi ricevuti per configurare le informazioni di routing per i fotogrammi di trasmissione, ovvero è simile a un commutatore di apprendimento fisico. È possibile installare i driver di filtro firewall nello stack host; ad esempio, sopra il driver miniport per l'hardware della scheda di rete e sotto il driver del commutatore estendibile. I driver di filtro del firewall possono accedere ai dati in un frame ricevuto prima dell'interruttore estensibile. Se l'intero buffer di ricezione per ogni frame viene allocato dallo spazio degli indirizzi della VM, una VM dannosa potrebbe accedere a parti del frame che verrebbero esaminate da un driver di filtro o dallo switch estendibile eseguito nell'host.

Per risolvere questo problema di sicurezza, quando si usa la memoria condivisa della macchina virtuale per una coda di macchine virtuali, la scheda di rete deve suddividere il pacchetto in corrispondenza di un offset di byte che corrisponde almeno alla dimensione lookahead, ovvero un valore fisso predeterminato. Tutti i dati lookahead, ovvero i dati che precedono l'offset dei byte per la dimensione lookahead, devono essere trasferiti con DMA alla memoria condivisa allocata per i dati lookahead. I dati del post-lookahead, ovvero il resto del payload del frame, devono essere trasferiti tramite DMA nella memoria condivisa allocata per i dati del post-lookahead.

La figura seguente mostra le relazioni per le strutture di dati di rete quando i dati in ingresso vengono suddivisi in buffer di memoria condivisa lookahead e post-lookahead.

Diagramma che illustra le strutture di pacchetti VMQ, che mostra i dati lookahead e post-lookahead in buffer di memoria condivisa separati.

I requisiti di riepilogo per la memoria condivisa VMQ sono i seguenti:

  • Una scheda di rete può suddividere un frame ricevuto in corrispondenza di un limite di intestazione di rete maggiore della dimensione lookahead. Tuttavia, quando richiesto da NDIS e senza alcuna eccezione, tutti i fotogrammi ricevuti e assegnati a un VMQ devono essere suddivisi al limite o al di là delle dimensioni lookahead richieste da NDIS.

  • I dati "lookahead" devono essere trasferiti con DMA alla memoria condivisa allocata dal driver miniport. Il driver miniport deve specificare nella chiamata di allocazione che verrà usata la memoria per i dati lookahead.

  • I dati post-lookahead devono essere trasferiti tramite DMA nella memoria condivisa allocata dal driver miniport. Il driver miniport deve specificare nella chiamata di allocazione che la memoria verrà usata come dati successivi all'analisi preliminare.

  • I driver Miniport non devono dipendere da quale spazio indirizzi userà NDIS per completare la richiesta di allocazione di memoria condivisa. Cioè, lo spazio degli indirizzi di memoria condivisa per i dati di lookahead o post-lookahead dipende dall'implementazione. In molti casi, NDIS o l'interruttore estensibile potrebbero soddisfare tutte le richieste, comprese quelle per l'uso successivo al look-ahead, dallo spazio degli indirizzi della memoria host.

  • L'ordine in cui i frame vengono ricevuti in una coda di ricezione VMQ deve essere mantenuto quando i frame in tale coda vengono passati allo stack di driver.

  • L'adattatore di rete deve allocare sufficiente spazio di memoria di backfill in ogni buffer post-lookahead. Questa allocazione permette di copiare i dati del lookahead nella sezione di completamento retroattivo del buffer post-lookahead e consente di fornire il frame alla macchina virtuale in un buffer continuo.

Se non esiste alcun meccanismo nell'hardware per soddisfare questi requisiti per la memoria condivisa VMQ, l'hardware che supporta DMA a dispersione sul lato ricezione potrebbe ottenere gli stessi risultati allocando due buffer di ricezione per ogni frame ricevuto. In questo caso, le dimensioni del primo buffer sono limitate alla dimensione lookahead richiesta.

Se la scheda di rete non è in grado di soddisfare questi requisiti per la memoria condivisa VMQ con qualsiasi metodo, il provider di servizi virtuali allocherà memoria per i buffer di ricezione VMQ dallo spazio degli indirizzi host e copierà i pacchetti ricevuti dai buffer di ricezione della scheda di rete nello spazio degli indirizzi della macchina virtuale.

come Windows Server 2012 e versioni successive risodano il problema di sicurezza

A partire da Windows Server 2012, il provider di servizi virtuali non alloca memoria condivisa dalla macchina virtuale per i buffer di ricezione VMQ. Invece, il VSP alloca la memoria per i buffer di ricezione del VMQ dallo spazio degli indirizzi dell'host e quindi copia i pacchetti ricevuti dai buffer di ricezione della scheda di rete allo spazio degli indirizzi della VM.

I punti seguenti si applicano ai driver miniport VMQ eseguiti in Windows Server 2012 e versioni successive di Windows:

  • Per i driver miniport NDIS 6.20 VMQ, non è necessaria alcuna modifica. Tuttavia, quando il provider di servizi virtuali alloca una coda di macchine virtuali inviando una richiesta di metodo OID (identificatore oggetto) di OID_RECEIVE_FILTER_ALLOCATE_QUEUE, imposta il LookaheadSize membro della struttura NDIS_RECEIVE_QUEUE_PARAMETERS su zero. Questo forzerà un driver miniport a non suddividere il pacchetto in buffer pre-lookahead e post-lookahead.

  • A partire da NDIS 6.30, i driver miniport VMQ non devono annunciare il supporto per la suddivisione dei dati dei pacchetti in buffer pre-lookahead e post-lookahead. Quando un driver miniport registra le funzionalità VMQ, deve seguire queste regole quando inizializza la struttura NDIS_RECEIVE_FILTER_CAPABILITIES:

    • Il driver miniport non deve impostare il flag NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED nel membro Flags.

    • Il driver miniport deve impostare i membri MinLookaheadSplitSize e MaxLookaheadSplitSize a zero.

    Per altre informazioni su come registrare le funzionalità VMQ, vedere Determinazione delle funzionalità VMQ di una scheda di rete.