Investigadores del equipo de Google Project Zero han identificado una vulnerabilidad (CVE-2021-29657) en el hipervisor KVM incluido en el núcleo de Linux, que permite eludir la separación de un sistema invitado y ejecutar código en el entorno del host. El problema está presente en el código utilizado en sistemas con procesadores AMD (módulo kvm-amd.ko) y no se manifiesta en procesadores Intel.
Los investigadores han preparado un prototipo de exploit funcional que permite desde el entorno invitado lanzar un shell de root en el entorno del host en un sistema con procesador AMD Epyc 7351P y núcleo de Linux 5.10. Se observa que esta es la primera brecha de tipo «guest-to-host» en el hipervisor en sí, KVM, no relacionada con errores en componentes que se ejecutan en el espacio de usuario, como QEMU. La corrección se aceptó en el núcleo a finales de marzo. El problema se manifiesta desde el núcleo de Linux 5.10-rc1 hasta v5.12-rc6, es decir, abarca solo los núcleos 5.10 y 5.11 (la mayoría de las ramas estables de los distribuciones no se ven afectadas por el problema).
El problema está presente en el mecanismo nested_svm_vmrun, implementado usando la extensión AMD SVM (Secure Virtual Machine) que permite realizar ejecuciones anidadas de sistemas invitados. Para una correcta implementación de esta funcionalidad, el hipervisor debe interceptar todas las instrucciones SVM ejecutadas en los sistemas invitados, emular su comportamiento y sincronizar el estado con el hardware, lo cual es una tarea bastante compleja. Tras analizar la implementación ofrecida en KVM, los investigadores encontraron un error lógico que permite influir en el contenido de los registros MSR (Model-Specific Register) del host desde el sistema invitado, lo que se puede usar para ejecutar código a nivel del host.
En particular, la ejecución de la operación VMRUN desde un sistema invitado de segundo nivel (L2, lanzado desde otro sistema invitado) provoca una segunda llamada a nested_svm_vmrun y daña la estructura svm->nested.hsave, sobre la cual se superponen datos del vmcb del sistema invitado L2. Como resultado, se produce una situación en la que, a nivel del sistema invitado L2, es posible liberar memoria en la estructura svm->nested.msrpm, donde se almacena el bit MSR, a pesar de que todavía se está utilizando, y obtener acceso a los MSR del entorno del host.
Fuente: opennet.ru
