Forscher des Google Project Zero-Teams haben eine Schwachstelle (CVE-2021-29657) im KVM-Hypervisor, der Teil des Linux-Kernels ist, identifiziert. Diese Schwachstelle ermöglicht es, die Isolation des Gastsystems zu umgehen und eigenen Code im Host-Umfeld auszufĂŒhren. Das Problem tritt im Code auf, der auf Systemen mit AMD-Prozessoren (kvm-amd.ko-Modul) verwendet wird, und zeigt sich nicht bei Intel-Prozessoren.
Die Forscher haben einen funktionierenden Exploit-Prototyp erstellt, der es ermöglicht, aus einer Gastumgebung eine Root-Shell im Host-Umfeld auf einem System mit dem AMD Epyc 7351P Prozessor und dem Linux-Kernel 5.10 zu starten. Es wird darauf hingewiesen, dass dies die erste Schwachstelle der Klasse âGast-zu-Hostâ im Hypervisor selbst ist KVM, die nicht mit Fehlern in Komponenten verbunden ist, die im Benutzerspeicher ausgefĂŒhrt werden, wie z.B. QEMU. Der Fix wurde Ende MĂ€rz in den Kernel ĂŒbernommen. Das Problem tritt ab dem Linux-Kernel 5.10-rc1 bis 5.12-rc6 auf, d.h. es betrifft nur die Kernel 5.10 und 5.11 (die meisten stabilen Verzweigungen der Distributionen sind nicht betroffen).
Das Problem liegt im nested_svm_vmrun-Mechanismus, der unter Verwendung der AMD SVM (Secure Virtual Machine)-Erweiterung umgesetzt ist und die verschachtelte AusfĂŒhrung von Gastsystemen ermöglicht. Um diese FunktionalitĂ€t korrekt umzusetzen, muss der Hypervisor alle SVM-Anweisungen, die in den Gastsystemen ausgefĂŒhrt werden, abfangen, deren Verhalten emulieren und den Zustand mit der Hardware synchronisieren, was eine ziemlich komplexe Aufgabe darstellt. Nach Analyse der in KVM vorgeschlagenen Implementierung fanden die Forscher einen logischen Fehler, der es ermöglicht, den Inhalt der MSR-Register (Model-Specific Register) des Hosts aus dem Gastsystem heraus zu beeinflussen, was genutzt werden kann, um Code auf der Host-Ebene auszufĂŒhren.
Insbesondere fĂŒhrt die AusfĂŒhrung der VMRUN-Operation aus einem Gastsystem der zweiten Nesting-Ebene (L2, das aus einem anderen Gastsystem gestartet wurde) zu einem zweiten Aufruf von nested_svm_vmrun und einer BeschĂ€digung der Struktur svm->nested.hsave, auf die Daten aus dem vmcb des Gastsystems L2 angewendet werden. Dies fĂŒhrt zu einer Situation, in der im Gastsystem L2 der Speicher in der Struktur svm->nested.msrpm freigegeben werden kann, in der das MSR-Bit gespeichert ist, obwohl es weiterhin verwendet wird, und somit der Zugriff auf die MSR des Host-Umfelds ermöglicht wird.
Quelle: opennet.ru
