Condividi tramite


Problemi di sicurezza con la macchina virtuale NDIS (VM) Memoria condivisa

Questo argomento illustra i potenziali problemi di sicurezza coinvolti nell'allocazione della memoria condivisa da una macchina virtuale (VM) per la coda di macchine virtuali (VMQ) di ricezione dei buffer. In questo argomento sono presenti le seguenti sezioni:

Nota In Hyper-V una partizione figlio è 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 che viene eseguito nella partizione padre Hyper-V. Questa sezione fornisce informazioni e requisiti in background per garantire che i writer di driver comprendano i problemi di sicurezza e i requisiti di sicurezza VMQ per la memoria condivisa. Per altre informazioni sulla memoria condivisa, vedere l'argomento Allocazione risorse memoria condivisa nella sezione Scrittura di driver VMQ .

Nell'ambiente virtualizzato è possibile visualizzare o modificare la memoria condivisa della macchina virtuale. Tuttavia, la visualizzazione o la modifica di dati associati ad altre macchine virtuali non è consentita. Anche le macchine virtuali non sono consentite per accedere allo spazio indirizzi operativo di gestione.

La parte dell'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 (VSP). Pertanto, il filtro VLAN (virtual LAN) deve verificarsi prima che la scheda di rete usi DMA per trasferire i dati nella memoria condivisa della macchina virtuale. Inoltre, l'apprendimento degli indirizzi MAC (Media Access Control) del commutatore non può essere interessato.

Se la porta di 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 a tali 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 e 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 degli indirizzi di una macchina virtuale, non può essere accessibile 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 indirizzi della macchina virtuale. Questo trasferimento introduce un problema di sicurezza in cui una macchina virtuale può esaminare il contenuto dei frame ricevuti senza attendere l'applicazione del filtro VLAN richiesto.

Come Windows Server 2008 R2 risolve il problema di sicurezza

In Windows Server 2008 R2, prima che il VSP configura una coda di macchine virtuali per l'uso della memoria condivisa allocata dallo spazio 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 fotogrammi 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, l'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 frame in base all'indirizzo MAC di destinazione e all'identificatore VLAN, il commutatore estendibile usa la memoria condivisa host per tale coda.

Il commutatore estendibile controlla l'indirizzo MAC di origine dei frame ricevuti per configurare le informazioni di routing per i frame di trasmissione, ovvero è simile a un commutatore di apprendimento fisico. È possibile installare i driver di filtro del firewall nello stack host; ad esempio, sopra il driver miniport per l'hardware della scheda di rete e sotto il driver di commutatore estendibile. I driver di filtro del firewall possono accedere ai dati in un frame ricevuto prima del commutatore estendibile. Se l'intero buffer di ricezione per ogni frame viene allocato dallo spazio indirizzi della macchina virtuale, una macchina virtuale dannosa potrebbe accedere a parti del frame che verranno esaminate da un driver di filtro o dal commutatore 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 dividere il pacchetto in corrispondenza di un offset di byte che è almeno la dimensione lookahead, ovvero un valore fisso predeterminato. Tutti i dati lookahead, ovvero i dati in anticipo rispetto all'offset di byte per le dimensioni lookahead, devono essere trasferiti con DMA alla memoria condivisa allocata per i dati lookahead. I dati post-lookahead, il resto del payload del frame, devono essere trasferiti con DMA alla memoria condivisa allocata per i dati 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 dei pacchetti VMQ, che mostra i dati lookahead e post-lookahead in buffer di memoria condivisi separati.

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

  • Una scheda di rete può dividere un frame ricevuto in corrispondenza di un limite di intestazione di rete maggiore delle dimensioni di lookahead. Tuttavia, quando richiesto da NDIS e senza eccezione, tutti i frame ricevuti e assegnati a una VMQ devono essere suddivisi in corrispondenza o oltre il limite di 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 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 post-lookahead.

  • I driver Miniport non devono dipendere dal quale verrà usato lo spazio indirizzi NDIS per completare la richiesta di allocazione della memoria condivisa. Vale a dire, lo spazio degli indirizzi di memoria condiviso per i dati lookahead o post-lookahead è specifico. In molti casi, NDIS o il commutatore estendibile potrebbero soddisfare tutte le richieste, incluse quelle per l'uso post-lookahead, dallo spazio degli indirizzi di memoria host.

  • L'ordine in cui i fotogrammi vengono ricevuti in una coda di ricezione VMQ devono essere mantenuti quando i frame in tale coda vengono indicati nello stack di driver.

  • La scheda di rete deve allocare spazio di memoria di riempimento sufficiente in ogni buffer post-lookahead. Questa allocazione consente di copiare i dati lookahead nella parte di riempimento di backfill del buffer post-lookahead e consente di recapitare il frame alla macchina virtuale in un buffer contiguo.

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 assegnando due buffer di ricezione per ogni frame ricevuto. In questo caso, le dimensioni del primo buffer sono limitate alle dimensioni di lookahead richieste.

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

Come Windows Server 2012 e versioni successive risolve 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. Il provider di servizi virtuali alloca invece la memoria per la VMQ riceve i buffer dallo spazio indirizzi host e quindi copia i pacchetti ricevuti dalla scheda di rete ricevono buffer nello spazio indirizzi della macchina virtuale.

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

  • Per i driver miniport VMQ NDIS 6.20, non è necessaria alcuna modifica. Tuttavia, quando il provider di servizi virtuali alloca una coda di macchine virtuali emettendo una richiesta di metodo OID (identificatore oggetto) di OID_RECEIVE_FILTER_ALLOCATE_QUEUE, verrà impostato il membro LookaheadSize della struttura NDIS_RECEIVE_QUEUE_PARAMETERS su zero. Questo forza 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 suddividere i 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 di NDIS_RECEIVE_FILTER_LOOKAHEAD_SPLIT_SUPPORTED nel membro Flags .

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

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