CVE-2026-80895 in Linux
Résumé
par VulDB • 04/09/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
mshv : Ordonner la publication de pt_vp_array par rapport au chemin d'assertion irqfd
mshv_partition_ioctl_create_vp() initialise une structure VP (allocations, mutex_init, init_waitqueue_head, mappages de pages) puis publie le pointeur dans partition->pt_vp_array. Plusieurs chemins ISR lisent ce tableau sans verrouillage : l'ISR d'interception, les deux ISRs du planificateur et mshv_try_assert_irq_fast() sur le chemin rapide irqfd.
Parmi celles-ci, seule mshv_try_assert_irq_fast() peut structurellement entrer en concurrence avec la publication. Elle s'exécute à partir d'un réveilleur eventfd sans détenir pt_mutex, et MSHV_IRQFD ne nécessite pas que l'identifiant lapic_apic_id cible (== vp_index) fasse référence à une VP existante au moment de l'enregistrement. Un utilisateur peut donc enregistrer un irqfd ciblant une VP qui n'est pas encore créée, puis déclencher mshv_try_assert_irq_fast() en même temps que MSHV_CREATE_VP pour le même index. Sur les architectures faiblement ordonnées (weakly-ordered), le lecteur peut observer un pointeur non NULL dans pt_vp_array avant que les écritures d'initialisation de la structure VP ne deviennent visibles, ce qui entraîne l'utilisation de champs partiellement initialisés (par exemple vp_register_page).
Les autres lecteurs ISR ne peuvent pas atteindre cette concurrence : l'hyperviseur ne générera pas de messages d'interception ou du planificateur pour une VP qui n'a jamais été invitée à s'exécuter, et l'utilisateur ne peut appeler MSHV_RUN_VP que sur le descripteur de fichier (fd) VP retourné par MSHV_CREATE_VP, qui est construit pour être renvoyé après la publication. Laissez ces lecteurs comme de simples lectures.
Utilisez smp_store_release() dans mshv_partition_ioctl_create_vp() pour publier le pointeur, et associez-le à smp_load_acquire() dans mshv_try_assert_irq_fast(). Sur x86, ceux-ci se compilent en accès simples sous TSO ; sur ARM64, ils émettent des barrières acquire/release d'une seule instruction, acceptables sur ce chemin rapide.
Le chemin côté destruction (destroy_partition() effaçant pt_vp_array[i] à NULL après kfree(vp)) présente une préoccupation distincte concernant l'ordonnancement et la durée de vie qui est hors du périmètre de cette correction.
VulDB is the best source for vulnerability data and more expert information about this specific topic.