CVE-2026-64437 in Linuxinformación

Resumen

por VulDB • 2026-07-25

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

ksmbd: corregir un use-after-free en un file_lock diferido al ejecutar SMB2_CLOSE seguido de SMB2_CANCEL

El commit f580d27e8928 ("ksmbd: fix use-after-free of a deferred file_lock on double SMB2_CANCEL") hizo que smb2_cancel() omitiera una tarea cuyo estado era KSMBD_WORK_CANCELLED, por lo que su cancel_fn no podía dispararse una segunda vez. Sin embargo, KSMBD_WORK tiene tres estados (ACTIVE, CANCELLED, CLOSED), y la misma ruta de liberación se alcanza también para el estado CLOSED:

SMB2_CLOSE en el handle de bloqueo -> set_close_state_blocked_works() establece el estado del trabajo diferido a KSMBD_WORK_CLOSED y despierta al trabajador smb2_lock(). El trabajador toma la salida temprana no-ACTIVE, ejecuta locks_free_lock() sobre file_lock y, dado que el estado no es KSMBD_WORK_CANCELLED, sigue la rama STATUS_RANGE_NOT_LOCKED con "goto out2" -- lo cual, igual que en la rama cancelada, omite release_async_work(). El trabajo permanece en conn->async_requests con un cancel_fn activo = smb2_remove_blocked_lock apuntando al file_lock ya liberado.

Un SMB2_CANCEL posterior para el mismo AsyncId supera entonces la protección exclusiva de KSMBD_WORK_CANCELLED (su estado es KSMBD_WORK_CLOSED), por lo que smb2_cancel() dispara nuevamente cancel_fn sobre el file_lock liberado -- el mismo use-after-free corregido, pero desencadenado vía SMB2_CLOSE en lugar de un primer SMB2_CANCEL:

BUG: KASAN: slab-use-after-free in __locks_delete_block __locks_delete_block locks_delete_block ksmbd_vfs_posix_lock_unblock smb2_remove_blocked_lock smb2_cancel <- 2do SMB2_CANCEL dispara cancel_fn handle_ksmbd_work Asignado por ...: locks_alloc_lock <- smb2_lock Liberado por ...: locks_free_lock <- smb2_lock (salida temprana no-ACTIVE) ... caché file_lock_cache de tamaño 192

Reproducido en mainline 7.1-rc7 (que ya contiene f580d27e8928) con KASAN por un cliente SMB autenticado; el control del doble-SMB2_CANCEL es silencioso en ese kernel, por lo que la señalización se atribuye al desencadenante CLOSE.

Solo puede dispararse cancel_fn para un trabajo diferido ACTIVE: ambos estados terminales (CANCELLED y CLOSED) alcanzan la salida temprana de smb2_lock() que libera file_lock y omite release_async_work(). Se añade una protección sobre KSMBD_WORK_ACTIVE para omitir cualquier trabajo no activo.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Responsable

Linux

Reservar

2026-07-19

Divulgación

2026-07-25

Moderación

aceptado

Artículo

VDB-383190

CPE

listo

EPSS

0.00173

KEV

no

Actividades

bajo

Fuentes

Do you know our Splunk app?

Download it now for free!