Изследователи от екипа на Google Project Zero откриха уязвимост (CVE-2021-29657) в хипервизора KVM, предоставян в ядрото на Linux, която позволява заобикаляне на изолацията на гостовата система и изпълнение на собствен код в хост средата. Проблемът е наличен в кода, използван на системи с AMD процесори (модул kvm-amd.ko) и не се проявява за Intel процесори.
Изследователите подготвиха работен прототип на експлойт, който позволява от гостовата среда да стартира root shell в хост средата на система с AMD Epyc 7351P и ядро Linux 5.10. Отбелязва се, че това е първата уязвимост от клас 'guest-to-host' в самия хипервизор KVM, която не е свързана с грешки в компонентите, изпълнявани в потребителското пространство, като QEMU. Поправката беше приета в ядрото в края на март. Проблемът се проявява от ядрото Linux 5.10-rc1 и завършва с v5.12-rc6, т.е. обхваща само ядрото 5.10 и 5.11 (по-голямата част от стабилните клонове на дистрибутивите не са засегнати от проблема).
Проблемът съществува в механизма nested_svm_vmrun, реализиран чрез разширението AMD SVM (Secure Virtual Machine), което позволява организиране на вложен стартиране на гостови системи. За правилното реализиране на тази функционалност хипервизорът трябва да прихваща всички SVM инструкции, изпълнявани в гостови системи, да емулира тяхното поведение и да синхронизира състоянието с оборудването, което е доста сложна задача. Проучвайки предложената в KVM реализация, изследователите откриха логична грешка, която позволява въздействие върху съдържанието на MSR регистрите (Model-Specific Register) на хоста от гостовата система, което може да се използва за стартиране на код на ниво хост.
В частност, изпълнението на операцията VMRUN от вложен гостов втори слой (L2, стартиран от друга гостова система) води до второ извикване на nested_svm_vmrun и повреда на структурата svm->nested.hsave, в която се наслагват данни от vmcb на гостовата система L2. В резултат на това възниква ситуация, при която на ниво гостова система L2 може да се освободи памет в структурата svm->nested.msrpm, в която се съхранява битът MSR, въпреки че той продължава да се използва, и да се получи достъп до MSR на хост средата.
Източник: opennet.ru
