Des chercheurs de l'équipe Google Project Zero ont identifié une vulnérabilité (CVE-2021-29657) dans l'hyperviseur KVM inclus dans le noyau Linux, permettant de contourner l'isolation du système invité et d'exécuter du code du côté de l'environnement hôte. Le problème est présent dans le code utilisé sur les systèmes avec des processeurs AMD (module kvm-amd.ko) et ne se manifeste pas pour les processeurs Intel.
Les chercheurs ont préparé un prototype fonctionnel d'exploit, permettant depuis l'environnement invité de lancer un shell root dans l'environnement hôte sur un système avec un processeur AMD Epyc 7351P et un noyau Linux 5.10. Il est à noter qu'il s'agit de la première faille de type « guest-to-host » dans l'hyperviseur lui-même. KVM, non liée à des erreurs dans des composants exécutés dans l'espace utilisateur, tels que QEMU. Le correctif a été intégré au noyau fin mars. Le problème apparaît à partir du noyau Linux 5.10-rc1 et se termine avec v5.12-rc6, c'est-à-dire qu'il concerne uniquement les noyaux 5.10 et 5.11 (la plupart des branches stables des distributions ne sont pas touchées par le problème).
Le problème est présent dans le mécanisme nested_svm_vmrun, mis en œuvre en utilisant l'extension AMD SVM (Secure Virtual Machine) et permettant d'organiser le lancement imbriqué de systèmes invités. Pour une mise en œuvre correcte de cette fonctionnalité, l'hyperviseur doit intercepter toutes les instructions SVM exécutées dans les systèmes invités, émuler leur comportement et synchroniser l'état avec le matériel, ce qui représente une tâche assez complexe. En analysant la mise en œuvre proposée dans KVM, les chercheurs ont trouvé une erreur logique permettant d'influer sur le contenu des registres MSR (Model-Specific Register) de l'hôte depuis le système invité, ce qui peut être utilisé pour exécuter du code au niveau de l'hôte.
En particulier, l'exécution de l'opération VMRUN depuis un système invité de second niveau imbriqué (L2, lancé depuis un autre système invité) entraîne un second appel à nested_svm_vmrun et une corruption de la structure svm->nested.hsave, à laquelle sont superposées des données du vmcb du système invité L2. Il en résulte une situation où, au niveau du système invité L2, il est possible de libérer de la mémoire dans la structure svm->nested.msrpm, où est stocké le bit MSR, bien qu'il continue d'être utilisé, et d'accéder au MSR de l'environnement hôte.
Source : opennet.ru
