Disclaimer: sto cercando di ottenere una comprensione di livello relativamente alto. Se vuoi una guida dettagliata, è fuori portata. Inoltre, ci sono altri modi (interamente in software) per implementare macchine virtuali a cui ciò non si applica. Mi sto anche concentrando sulla "rottura" solo attraverso i meccanismi di virtualizzazione, cioè non quelli che possono accadere da PC a PC su host in rete reali.
Mi piacciono i dettagli, quindi vai con alcuni. In primo luogo, codeproject ha alcuni eccellenti riferimenti all'assemblatore sulle diverse modalità di una CPU x86 (reale, protetta e lunga) e sull'uso della virtualizzazione. C'è un blog Intel VT (non sono sicuro che sia stato scritto da Intel) e infine la prima parte del Rootkit Arsenal è dedicata alla spiegazione di x86 ed è un'ottima lettura, completo di procedure dettagliate e bei diagrammi. Capire tutto richiede pazienza, quindi quello che farò qui è fornire una breve introduzione a come funziona.
Il modo in cui abbiamo funzionato quando abbiamo eseguito DOS
DOS e i primi sistemi in modalità reale a 16 bit gestiscono un modello di memoria segmentata. Non c'è controllo sulla dimensione dei segmenti e non ci sono interruttori di protezione su nessuno di questi segmenti. Il codice viene caricato in un segmento di memoria e viene eseguito; può saltare molto in altri segmenti, quindi qualsiasi codice, ovunque può alterare qualsiasi cosa, inclusa la produzione di un pezzo di codice TSR (terminare e rimanere residente) che punta semplicemente una delle voci IVT (tabella vettoriale di interruzione) a un indirizzo nel suo spazio, prima di eseguire l'originale. Fondamentalmente, non c'è protezione. Nessuna. Nada.
L'ascesa della modalità protetta a 32 bit
La modalità protetta si complica rapidamente. Ci sono tre parti: segmentazione, paging e PAE. Ciascuno richiede una tabella di dati che informi la CPU di quel segmento, pagina o che la aiuti a estendere lo spazio degli indirizzi (PAE). Questi includono i famosi ring flag (si applicano a segmenti e pagine) che implementano l'isolamento del processo. Il paging è il tuo modo per caricare i dati dalla RAM e sul disco e creare cose fantasiose come la memoria virtuale (vedi, la parola virtuale! Ci stiamo arrivando!)
Modalità lunga
La modalità lunga elimina la segmentazione e impone semplicemente le strutture PAE / Paging. Ancora una volta, per banalizzare totalmente l'implementazione di un OS, il Paging è controllato da strutture in memoria che vengono poi impostate tramite apposite istruzioni. Voilà, si può ottenere l'isolamento del processo con le giuste impostazioni. Di nuovo, sto banalizzando un po '...
Dammi la virtualizzazione!
Va bene. La virtualizzazione è lo stesso concetto generale . Le macchine virtuali vengono configurate utilizzando strutture di controllo delle macchine virtuali che determinano il modo in cui la loro memoria viene mappata alla memoria fisica, un po 'come il paging . Fondamentalmente, in determinate condizioni la macchina virtuale dovrà chiedere qualcosa al sistema operativo host, un po 'come l'isolamento del processo, un po' come un interrupt software . Questi sono riferiti alle uscite VM e forniscono informazioni all'host come lo stato dei registri all'uscita. Un po 'come una chiamata di sistema .
Può un pezzo di malware uscire da una macchina virtuale?
Quindi, come per quanto riguarda la VM, il sistema operativo host ha tutto il proprio spazio di memoria e può essere infettato / danneggiato / distrutto a piacimento.
In termini di influenza diretta della memoria host, la macchina virtuale non può, perché non può vederla. L'host deve mappare la memoria richiesta nello spazio della macchina virtuale. Deve anche, in quello spazio di memoria, implementare tutto dal BIOS in su. Per comunicare con determinati dispositivi host per determinate attività, la macchina host deve configurare tali condizioni di uscita dalla VM e la VM di destinazione deve attivarle. Quando ciò accade, il controllo viene trasferito all'host.
Vi sono, quindi, due possibili aree a rischio:
- Le azioni che l'host intraprende in risposta a una VM Uscita. Se ci sono bug in questa gestione, potrebbe essere possibile persuadere l'host a eseguire qualcosa che non dovrebbe.
- Qualsiasi accesso host allo spazio di memoria della macchina ospite. Ricorda che il codice della macchina host in esecuzione nell'anello 0 può entrare e mandare in crash la festa dove preferisce. Accade così che tu possa impostare la memoria del guest dal guest (sorprendentemente).
Questo ti porta al tuo meccanismo di exploit. Hai bisogno di un bug di gestione nella routine di uscita della VM, quindi devi essere in grado di persuadere quel codice ad eseguire un po 'di memoria, idealmente codice che hai appena inserito in una pagina dalla VM guest. Una volta fatto, saluta il Kansas.
Come dice Tom Leek, le VM sono incredibilmente efficaci nel difendersi dalle fork bomb. In modo simile al modo in cui il sistema operativo può limitare la quantità di memoria che un processo può allocare, quindi può limitare la quantità di memoria mappata sulla VM. Se si esaurisce, il sistema operativo guest ritiene di aver esaurito la memoria fisica; l'host non lo allocherà più a meno che non implementi un'uscita dalla VM per farlo, il che sarebbe un po 'pericoloso e non credo che ciò avvenga.
Come probabilmente è questo?
Non molto. Dipende interamente dalle implementazioni di uscita della VM o dalla lettura della memoria dal guest sull'host con un bel bug nel codice di lettura. Richiede anche che detto bug ti permetta di controllare il crash in modo tale da poter forzare l'esecuzione all'indirizzo di memoria del tuo host. L'uscita della VM deve essere in grado di accedere a quella memoria.
Cosa non ho coperto?
- Attacchi a stack di software esistenti come TCPIP. Le vulnerabilità qui sono le stesse di se avessi comunque due PC fisici reali.
- Virtualizzazione implementata interamente dal software.
- Virtualizzazione su qualsiasi altro tipo di chip. Questo si applica alle configurazioni compatibili con Intel VT.
Infine, ho già sostenuto che l'isolamento dei processi è una forma di sandbox. Leggendo quella risposta e questa, ora dovresti essere in grado di capire perché le definisco in questo modo. Ci sono notevoli somiglianze tra l'isolamento dei processi e le macchine virtuali in x86.
Aggiorna
Quindi, ho approfondito ancora di più questo aspetto, specialmente nel ricerca sulla pillola blu. Quello che ho descritto è una visione di alto livello molto semplicistica. Ho trovato più dettagli. Ecco un documento intero dedicato ad esso da Invisible Things Lab. Si scopre che i loro discorsi sulle difese includevano il concetto di negare l'accesso in esecuzione alle pagine in modalità utente dall'anello 0, impedendo così l'esecuzione diretta dei dati che la macchina virtuale ha inserito in memoria. Si scopre che questo viene implementato nelle CPU Intel e le patch attualmente esistono nel kernel Linux. Quindi, a seconda di come va, potrebbe essere il caso che attacchi di questa natura diventino molto più difficili, anche se esistono degli exploit.