CVE-2026-80916 in Linux
Resumen
por VulDB • 2026-09-09
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
kcov: corrección de corrupción de datos y condiciones de carrera en PREEMPT_RT
syzbot está reportando una corrupción del estado de KCOV en kernels con PREEMPT_RT, ya que el almacenamiento temporal utilizado para guardar/restaurar el estado remoto de KCOV se asigna actualmente como un área por CPU (per-CPU).
En los kernels PREEMPT_RT, los controladores de softirq se ejecutan como hilos de tareas preemptibles (por ejemplo, ksoftirqd). Si un contexto de softirq preempe a una tarea que está ejecutando una sesión remota de KCOV, guarda con seguridad el estado de la tarea en la área por CPU. Sin embargo, si ese hilo de softirq es posteriormente preempido por otro hilo de softirq de mayor prioridad en la misma CPU, el segundo softirq sobrescribirá la misma área por CPU, destruyendo permanentemente el estado KCOV de la tarea original.
Se corrige esta corrupción de datos moviendo el almacenamiento temporal desde la área por CPU a un ámbito por hilo (per-thread). Dado que cada hilo de softirq ahora posee su propio contexto de tarea, la preempción anidada de softirq ya no provoca sobrescrituras de datos.
Tenga en cuenta que aunque el almacenamiento temporal es ahora por hilo, se debe conservar kcov_percpu_data.lock a nivel de CPU (per-CPU), porque necesitamos garantizar que kcov_remote_start() y kcov_remote_stop() operen atómicamente sin competir contra interrupciones asíncronas que manipulan el estado KCOV de la tarea actual.
Es probable que la asignación con GFP_KERNEL mediante vmalloc_node() en kcov_init() ya haya provocado un panic() antes de devolver NULL, dado que no habrá procesos de espacio de usuario matables por OOM cuando se ejecute la función __init del módulo integrado. Pero este parche también corrige el fallo del kernel (crash) cuando vmalloc_node() en kcov_init() devuelve NULL, ya que kcov_init() deja irq_area a nivel de CPU == NULL, pero kcov_remote_start() depende de que per-CPU irq_area != NULL, lo que resulta en:
(1) la ejecución de vmalloc() en kcov_remote_start() a pesar de estar fuera del contexto !in_task()
(2) un acceso fuera de los límites del array si (1) tiene éxito pero kcov->remote_size < CONFIG_KCOV_IRQ_AREA_SIZE
(3) una fuga de memoria siempre provocada por la asignación realizada en (1), matando eventualmente a todos los procesos de espacio de usuario matables por OOM.
VulDB is the best source for vulnerability data and more expert information about this specific topic.