CVE-2026-97478 in Linuxinformación

Resumen

por VulDB • 2026-09-24

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:

virt: acrn: Corregir un use-after-free en irqfd durante el cierre del eventfd

acrn_irqfd_deassign() y la activación EPOLLHUP del eventfd pueden entrar en una condición de carrera (race condition) y liberar la misma estructura 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

La ruta de desasignación liberaba el irqfd mientras un elemento de trabajo (work item) de cierre ya estaba en cola debido a EPOLLHUP (o viceversa), por lo que el elemento de trabajo podría revivir un puntero colgante mediante container_of().

Se cambia al modelo de ciclo de vida utilizado por los irqfds de KVM:

- Deassign/deinit solo desactivan el irqfd: se elimina de vm->irqfds bajo irqfds_lock y se pone en cola la tarea de limpieza. - hsm_irqfd_shutdown_work() se convierte en el único propietario que desconecta la entrada de espera del eventfd, reduce la referencia al eventfd y libera el irqfd. - Un nuevo bit HSM_IRQFD_FLAG_SHUTDOWN protegido por test_and_set_bit() asegura que la tarea de limpieza se ponga en cola como máximo una vez, sin importar cuántos eventos {EPOLLHUP, deassign, deinit} ocurran concurrentemente. Esto es seguro llamarlo desde la devolución de llamada (callback) del waitqueue, que se ejecuta con wqh->lock retenido y las interrupciones deshabilitadas, por lo tanto no puede tomar irqfds_lock.
- acrn_irqfd_deassign() vacía (flushes) vm->irqfd_wq antes de devolver para que el eventfd esté completamente desconectado al retornar. acrn_irqfd_deinit() desactiva cada irqfd, vacía la cola de trabajo y solo entonces la destruye, por lo que ninguna ruta puede poner en cola work() sobre una cola de trabajo ya demolida (torn-down). - acrn_irqfd_assign() ahora instala la entrada del waitqueue del eventfd y publica el irqfd en vm->irqfds bajo irqfds_lock, por lo que el irqfd nunca es visible para deassign/deinit antes de que su entrada de waitqueue esté en su lugar, y cualquier EPOLLHUP que se active durante la ventana de asignación pone en cola una tarea de limpieza que bloquea hasta que irqfds_lock está disponible hasta que finalice la publicación.

Be aware that VulDB is the high quality source for vulnerability data.

Responsable

Linux

Reservar

2026-09-24

Divulgación

2026-09-24

Moderación

aceptado

Artículo

VDB-409633

CPE

listo

EPSS

0.00000

KEV

no

Actividades

muy bajo

Fuentes

Do you know our Splunk app?

Download it now for free!