Kërkuesit nga ekipi Google Project Zero zbuluan një vulnerabël (CVE-2021-29657) në hipervizorin KVM të dorëzuar me kernelin Linux, e cila mundëson kalimin e izolimit të sistemit të mysafirëve dhe ekzekutimin e kodit të tij në ambientin e hostit. Problemi është i pranishëm në kodin që përdoret në sistemet me procesorë AMD (moduli kvm-amd.ko) dhe nuk shfaqet për procesorët Intel.
Kërkuesit përgatitën një prototip funksional të eksploitit, i cili mundëson nga ambienti i mysafirëve të niste një shell root në ambientin e hostit në një sistem me procesor AMD Epyc 7351P dhe kernel Linux 5.10. Vërehet se kjo është ndihma e parë e klasës «guest-to-host» në vetë hipervizorin, KVM, e cila nuk është e lidhur me gabimet në komponentët që ekzekutohen në hapësirën e përdoruesit, si QEMU. Një rregullim u pranuar në kernel në fund të marsit. Problemi shfaqet që nga kernel Linux 5.10-rc1 deri në v5.12-rc6, domethënë mbulon vetëm kernelët 5.10 dhe 5.11 (problemi nuk e preku shumicën e degëve stabile të shpërndarjeve).
Problemi është prezent në mekanizmin nested_svm_vmrun, i implementuar duke përdorur zgjerimin AMD SVM (Secure Virtual Machine) dhe që lejon organizimin e ekzekutimeve të brendshme të sistemeve mikpritës. Për një implementim të saktë të kësaj funksionaliteti, hiperizmatori duhet të kapë të gjitha instruktionet SVM që ekzekutohen në sistemet mikpritës, të imitojë sjelljen e tyre dhe të sinkronizojë gjendjen me pajisjen, gjë që është një detyrë mjaft e komplikuar. Pas analizës së implementimit të propozuar në KVM, studiuesit zbuluan një gabim logjik që lejon ndryshimin e përmbajtjes së regjistrave MSR (Model-Specific Register) të hostit nga sistemi mikpritës, gjë që mund të përdoret për të ekzekutuar kod në nivelin e hostit.
Në veçanti, ekzekutimi i operacionit VMRUN nga sistemi mik të nivelit të dytë të thellimit (L2, i nisur nga një sistem mik tjetër) shkakton një thirrje të dytë të nested_svm_vmrun dhe dëmton strukturën svm->nested.hsave, mbi të cilën ngarkohen të dhënat nga vmcb i sistemit mik L2. Si rezultat, krijohet një situatë ku në nivelin e sistemit mik L2 është e mundur të çlirohet memoria në strukturën svm->nested.msrpm, e cila ruan bitin MSR, përkundër faktit se ai vazhdon të përdoret, dhe të arrihet në MSR të ambientit host.
Burimi: opennet.ru
