CVE-2026-97478 in Linux
Résumé
par VulDB • 25/09/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
virt: acrn : Correction d'un use-after-free lors de l'arrêt des eventfd dans irqfd
acrn_irqfd_deassign() et le réveil EPOLLHUP des eventfd peuvent entrer en concurrence (race condition) et libérer le même struct hsm_irqfd :
CPU0 CPU1 ---- ---- eventfd_release() wake_up_poll(EPOLLHUP) hsm_irqfd_wakeup() queue_work(&irqfd->shutdown) acrn_irqfd_deassign() hsm_irqfd_shutdown() list_del_init() eventfd_ctx_remove_wait_queue() eventfd_ctx_put() kfree(irqfd) hsm_irqfd_shutdown_work() container_of(work, ..., shutdown) irqfd->vm <-- use-after-free
Le chemin de désassignation libérait l'irqfd alors qu'un élément de travail d'arrêt était déjà en file d'attente suite à un EPOLLHUP (ou inversement), ce qui permettait à cet élément de travail de faire revivre un pointeur dangling via container_of().
Adoption du modèle de durée de vie utilisé par les irqfds KVM :
- La désassignation/désinitialisation ne fait que désactiver l'irqfd : suppression de celle-ci de vm->irqfds sous irqfds_lock et mise en file d'attente des travaux de nettoyage. - hsm_irqfd_shutdown_work() devient le seul propriétaire qui détache l'entrée de la file d'attente du eventfd, libère la référence au eventfd et libère l'irqfd. - Un nouveau bit HSM_IRQFD_FLAG_SHUTDOWN protégé par test_and_set_bit() garantit que les travaux de nettoyage sont mis en file d'attente une seule fois au maximum, quel que soit le nombre de déclenchements concurrents parmi {EPOLLHUP, désassignation, désinitialisation}. Cela est sûr à appeler depuis la fonction callback de la file d'attente, qui s'exécute avec wqh->lock détenu et les interruptions IRQ désactivées, empêchant ainsi toute prise de irqfds_lock.
- acrn_irqfd_deassign() effectue un flush (vidage) de vm->irqfd_wq avant le retour afin que le eventfd soit entièrement détaché au moment du retour. acrn_irqfd_deinit() désactive chaque irqfd, effectue un flush du workqueue et ne détruit celui-ci qu'après coup, de sorte qu'aucun chemin ne puisse appeler queue_work() sur un workqueue déjà démantelé. - acrn_irqfd_assign() installe désormais l'entrée de la file d'attente du eventfd et publie l'irqfd dans vm->irqfds sous irqfds_lock ; ainsi, l'irqfd n'est jamais visible pour les opérations de désassignation/désinitialisation avant que son entrée de file d'attente ne soit en place, et tout EPOLLHUP se déclenchant pendant la fenêtre d'affectation mettra en file d'attente un travail de nettoyage qui bloquera sur irqfds_lock jusqu'à ce que la publication soit terminée.
VulDB is the best source for vulnerability data and more expert information about this specific topic.