Il passthrough ethernet USB su una macchina virtuale KVM può isolare le vulnerabilità del kernel relative alla rete?

4

Sono preoccupato per la superficie di attacco che lo stack di rete del kernel linux, inclusi i driver nic e il filtraggio dei pacchetti, offre a un utente malintenzionato remoto. Quindi sto pianificando di isolare la maggior parte del codice di rete (driver, filtraggio dei pacchetti, ecc.) In una macchina virtuale KVM (in pratica ciò che Qubes OS sta facendo, ma con kvm al posto del tipo 1 hypervisor xen

AFAIK, ci sono due modi per ottenere questo: o passare attraverso il dispositivo ethernet dell'host usando il passthrough PCI, che ha il vantaggio di poter usare l'hardware IOMMU della macchina per isolare il DMA, o usare un dispositivo ethernet collegato via USB e passare attraverso il dispositivo USB alla macchina virtuale. In entrambi i casi, è il kernel della macchina virtuale che esegue effettivamente il networking di basso livello. Userei il passthrough PCI della scheda madre della scheda madre, ma per diverse ragioni che risultano non essere un'opzione, quindi sto guardando il passthrough USB di un dongle ethernet-to-usb.

  1. Ho ragione nel presumere che con entrambi i metodi (PCI e passthrough USB), in realtà sto riducendo la superficie di attacco nel kernel host per quanto riguarda il networking? Nella mia mente, con questa soluzione, il kernel host passa semplicemente i dati alla macchina virtuale e nessuno del traffico di rete tocca alcuna parte del codice di rete del kernel host. È giusto?
  2. Ci sono problemi evidenti con il passaggio attraverso un dispositivo tramite USB che rende inutile / inutile l'isolamento della rete nella macchina virtuale? Non sono preoccupato per la sicurezza fisica della macchina, ad es. Non devo difendermi da qualcuno che collega un adattatore USB rogue che convincerebbe il controller USB 3 dell'host a fare qualsiasi cosa non dovrebbe fare. Il mio obiettivo principale è rendere gli exploit remoti più difficili.
  3. L'intero tentativo è una causa persa? Per esempio. sono preoccupato per i buchi in una parte collaudata del kernel, mentre aggiungo una superficie di attacco più grande al sistema usando la virtualizzazione? Sto effettivamente riducendo la sicurezza generale del sistema usando KVM?
posta Pascal 26.02.2017 - 15:15
fonte

2 risposte

1

Questa è una domanda difficile a cui rispondere poiché misurare la superficie di attacco è difficile. Ma supponiamo di "misurarlo" in base a ciò che pensiamo sia la quantità di elaborazione dei dati non attendibili in una parte dello stack di rete.

Am I right in assuming that with both methods (PCI & USB passthrough), I'm actually reducing the attack surface in the host kernel in regards to networking? In my mind, with that solution, the host kernel simply passes through data to the virtual machine and none of the network traffic touches any part of host kernel's networking code. Is that right?

Per quanto ne so, sì. I metodi passthrough riducono l'elaborazione del sistema operativo host nei dati. Ad esempio, è possibile trovare prove di ciò nella documentazione di VirtualBox:

this feature allows to directly use physical PCI devices on the host by the guest even if host doesn't have drivers for this particular device.

Ciò significa che il sistema operativo host non utilizza nemmeno un driver per gestire i dati passthrough (PCI).

Are there glaring problems with passing through a device via USB that renders the isolation of networking in the virtual machine useless/pointless? I'm not worried about the physical security of the machine, e.g. I don't have to defend against someone plugging in a rogue USB adapter that would convince the host's USB 3 controller to do anything it wasn't supposed to do. My main goal is to make remote exploits more difficult.

Come puoi leggere qui , VirtualBox utilizza un driver per gestire la gestione passthrough USB. Ciò significa che la superficie di attacco dell'host è grande quanto la superficie esposta dal driver. Questo driver vive nel tuo host. Pertanto, questo è il compromesso. O l'host esegue lo stack di rete o lo spinge verso il basso su una VM e fa in modo che l'host esegua solo i driver richiesti. Si noti che sembra (almeno per VirtualBox) che questi driver non gestiscono i dati effettivi. Ma lo sto ancora contando come superficie d'attacco, per ogni evenienza.

Is the whole endeavor a lost cause? E.g. am I worried about holes in a tried-and-true part of the kernel, while adding a larger attack surface to the system by using virtualization? Am I actually decreasing the overall security of the system by using KVM?

Penso che stai riducendo la superficie di attacco dell'host in generale. Ma il prezzo che stai pagando (complessità, penalità di runtime) deve essere considerato. C'è solo una decisione progettuale che devi prendere, in base alle tue esigenze.

Per riassumere i miei pensieri:

Sembra che la tua soluzione ridurrà la superficie di attacco al prezzo della prestazione. La superficie di attacco lasciata all'host non esisterà (passthrough PCI) o sarà solo un driver che gestisce le "attestazioni" della VM su dispositivi USB (passthrough USB).

    
risposta data 26.02.2017 - 21:43
fonte
2

Sì, questo può ridurre la superficie di attacco del kernel host. Può anche essere utile per isolare i dispositivi nel caso in cui abbiate rotto la tabella DMAR e non sia possibile proteggere dagli attacchi DMA in altro modo. Questo è qualcosa che ho fatto in passato per la maggior parte dei dispositivi PCI. Alcune cose da considerare:

Utilizza VFIO, non passthrough PCI

VFIO è più recente e isolerà correttamente i dispositivi nei gruppi IOMMU , mentre il passthrough PCI può potenzialmente essere bypassato se ci sono dispositivi che non sono passati attraverso lo stesso gruppo IOMMU. Dal link precedente:

IOMMU groups try to describe the smallest sets of devices which can be considered isolated from the perspective of the IOMMU. [...] Legacy KVM device assignment will allow a user to assign these devices separately, but the configuration is guaranteed to fail. VFIO is governed by IOMMU groups and therefore prevents configurations which violate this most basic requirement of IOMMU granularity.

Fai attenzione alle ROM delle opzioni

C'è una cosa che dovresti tenere a mente, però. Quando si passa il dispositivo PCI direttamente a un guest, l'ospite ottiene un accesso raw allo spazio di configurazione PCI, incluso l'accesso in lettura / scrittura all'opzione ROM. Un'opzione ROM è un po 'di firmware memorizzato su determinati dispositivi che viene eseguito dal BIOS durante l'avvio iniziale. Se il kernel guest viene dirottato, anche se non può fuggire nell'host, sarà in grado di scrivere sull'opzione ROM sul dispositivo fisico e attendere il prossimo riavvio, momento in cui l'opzione ROM viene richiamata dal BIOS , sottoponendoti a un rootkit BIOS.

Tuttavia, esiste un modo per mitigare questo rischio. Intel TXT consente di verificare le ROM opzionali prima che vengano chiamate. Ciò richiede il settaggio di boot, che abilita correttamente varie funzioni TXT all'avvio. La documentazione ufficiale è disponibile qui . Questo è molto importante, quindi non ignorarlo!

Indurisci i componenti dello spazio utente

Di gran lunga, la maggior parte delle vulnerabilità sarà presente nel componente userspace (QEMU, o forse kvmtool), quindi la protezione di questa dovrebbe essere una priorità elevata. Supponendo che userete QEMU, dovreste assicurarvi che limiti il suo accesso al filesystem a una directory vuota con la direttiva -chroot . Deve passare a un utente dedicato e non privilegiato con la direttiva -runas e deve abilitare una sandbox seccomp con la direttiva -sandbox . La superficie di attacco può essere ulteriormente ridotta in altri modi, disattivando le funzioni non necessarie (ACPI, RTC, ecc.) E impostando i limiti delle risorse. Si consiglia inoltre l'uso di un MAC come AppArmor o SELinux. Se compilerai QEMU dal codice sorgente, puoi rafforzarlo ulteriormente in fase di compilazione con i giusti flag di gcc.

Annulla entrambi i kernel

È molto importante, se vuoi una superficie di attacco ridotta, usare grsecurity sia per l'host che per l'ospite. Inoltre, grsecurity fornirà PaX, che ha componenti che rafforzano i componenti dello spazio utente come QEMU. Se QEMU viene utilizzato con -enable-kvm , allora è sicuro usare le impostazioni di PaX più severe con esso. La versione commerciale di grsecurity non è necessaria. Tutto ciò che è è un kernel stabile che non si aggiorna tanto spesso. Non è necessario a meno che tu non stia utilizzando un server ad alta disponibilità.

    
risposta data 28.02.2017 - 08:12
fonte

Leggi altre domande sui tag