I ricercatori del team Google Project Zero hanno identificato una vulnerabilità (CVE-2021-29657) nel hypervisor KVM fornito con il kernel Linux, che consente di eludere l'isolamento del sistema ospite e di eseguire codice nel contesto dell'ambiente host. Il problema è presente nel codice utilizzato su sistemi con processori AMD (modulo kvm-amd.ko) e non si manifesta per i processori Intel.
I ricercatori hanno preparato un prototipo funzionante di exploit che consente di avviare una shell root nell'ambiente host da un ambiente ospite su un sistema con processore AMD Epyc 7351P e kernel Linux 5.10. Si osserva che si tratta della prima vulnerabilità della classe "guest-to-host" nel hypervisor stesso, KVM, non correlata a difetti nei componenti eseguiti nello spazio utente, come QEMU. La correzione è stata accettata nel kernel alla fine di marzo. Il problema si manifesta a partire dal kernel Linux 5.10-rc1 fino a v5.12-rc6, coprendo quindi solo i kernel 5.10 e 5.11 (la maggior parte delle branche stabili dei distributori non ha risentito del problema).
Il problema è presente nel meccanismo nested_svm_vmrun, implementato utilizzando l'estensione AMD SVM (Secure Virtual Machine), che consente di organizzare l'esecuzione nidificata di sistemi ospiti. Per una corretta attuazione di questa funzionalità, l'ipervisor deve interceptare tutte le istruzioni SVM eseguite nei sistemi ospiti, emulare il loro comportamento e sincronizzare lo stato con l'hardware, il che rappresenta una sfida piuttosto complessa. Analizzando l'implementazione proposta in KVM, i ricercatori hanno trovato un errore logico che consente di influenzare il contenuto dei registri MSR (Model-Specific Register) dell'host dal sistema ospite, cosa che può essere utilizzata per eseguire codice a livello di host.
In particolare, l'esecuzione dell'operazione VMRUN da un sistema guest di secondo livello (L2, avviato da un altro sistema guest) porta a una seconda chiamata a nested_svm_vmrun e alla corruzione della struttura svm->nested.hsave, su cui vengono sovrapposti i dati provenienti da vmcb del sistema guest L2. Di conseguenza, si verifica una situazione in cui, a livello di sistema guest L2, è possibile liberare la memoria nella struttura svm->nested.msrpm, in cui è memorizzato il bit MSR, nonostante venga comunque utilizzato, ottenendo accesso al MSR dell'ambiente host.
Fonte: opennet.ru
