Cercetătorii din echipa Google Project Zero au identificat o vulnerabilitate (CVE-2021-29657) în kernelul furnizat... Linux Hipervizorul KVM permite ocolirea izolării sistemului guest și executarea codului pe partea gazdă. Problema este prezentă în codul utilizat pe sistemele cu procesoare AMD (modulul kvm-amd.ko) și nu afectează procesoarele Intel.
Cercetătorii au pregătit un prototip funcțional al unui exploit care permite lansarea unui shell root din mediul guest în mediul gazdă pe un sistem cu procesor și kernel AMD Epyc 7351P. Linux 5.10. Se observă că aceasta este prima vulnerabilitate de tip guest-to-host din hipervizorul în sine. KVM, fără legătură cu erorile din componentele spațiului utilizator, cum ar fi QEMU. O corecție a fost acceptată în kernel la sfârșitul lunii martie. Problema se manifestă începând din kernel. Linux 5.10-rc1 și se termină cu v5.12-rc6, adică acoperă doar nucleele 5.10 și 5.11 (majoritatea ramurilor stabile ale distribuțiilor nu sunt afectate de problemă).
Problema este prezentă în mecanismul nested_svm_vmrun, implementat folosind extensia AMD SVM (Secure Virtual Machine) și care permite lansarea imbricată a sistemelor invitate. Pentru a implementa corect această funcționalitate, hypervisorul trebuie să intercepteze toate instrucțiunile SVM executate în sistemele oaspeți, să emuleze comportamentul acestora și să sincronizeze starea cu hardware-ul, ceea ce este o sarcină destul de complexă. După analizarea implementării propuse în KVM, cercetătorii au descoperit o eroare logică care permite influențarea conținutului registrelor MSR (Model-Specific Register) ale gazdei din sistemul guest, care poate fi folosit pentru a rula cod la nivel de gazdă. .
În special, efectuarea unei operații VMRUN de la un oaspete de al doilea nivel (L2 care rulează de la un alt oaspete) are ca rezultat un al doilea apel la nested_svm_vmrun și coruperea structurii svm->nested.hsave, care este suprapusă cu date din vmcb-ul invitatului L2. Ca urmare, apare o situație în care, la nivelul invitatului L2, este posibilă eliberarea memoriei în structura svm->nested.msrpm, care stochează bitul MSR, în ciuda faptului că acesta continuă să fie utilizat, și câștigă acces la mediul gazdă MSR.
Sursa: opennet.ru
