CVE-2026-64142 in Linux
Resumen
por VulDB • 2026-07-20
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
ksmbd: corrección de condiciones de carrera (race conditions) del recolector de basura durable frente a las búsquedas en m_fp_list
ksmbd_durable_scavenger() presenta dos condiciones de carrera relacionadas con cualquier iterador que recorra f_ci->m_fp_list, incluyendo ksmbd_lookup_fd_inode() (utilizado por ksmbd_vfs_rename) y las comprobaciones del modo compartido en fs/smb/server/smb_common.c.
(1) Reutilización de la cabeza de lista fp->node. Los identificadores durables preservados pueden permanecer vinculados a f_ci->m_fp_list después del desmontaje de sesión, por lo que las comprobaciones del modo compartido aún los detectan mientras el identificador es reconectable. El recolector recogía los identificadores caducados añadiendo fp->node a una lista local scavenger_list tras eliminarlos del idr durable global. Dado que fp->node es la misma list_head utilizada por m_fp_list, list_add(&fp->node, &scavenger_list) sobrescribe los enlaces de m_fp_list y corrompe ambas listas. CONFIG_DEBUG_LIST puede informar de esto en el recorrido para comprobar el modo compartido.
(2) Condición de carrera del recuento de referencias (refcount) frente a los iteradores de m_fp_list. El recolector califica un identificador durable caducado con atomic_read(&fp->refcount) > 1 y fp->conn bajo global_ft.lock, elimina fp de global_ft y luego libera global_ft.lock antes de desvincular fp de m_fp_list y liberarlo. Durante esa brecha, fp sigue vinculado a m_fp_list con f_state == FP_INITED. ksmbd_lookup_fd_inode() bajo m_lock llama a ksmbd_fp_get() (atomic_inc_not_zero en un refcount que aún es 1) y obtiene una referencia activa; el recolector luego desvincula y libera fp mientras el titular posee una referencia, lo que conduce a un Use-After-Free (UAF) en la posterior llamada del titular a ksmbd_fd_put() y en cualquier lectura de campo realizada por un iterador concurrente del modo compartido que recorra m_fp_list sin tomar ksmbd_fp_get() (rutas similares a smb_check_perm_dleases).
Corrección de ambos problemas:
* Dejar de reutilizar fp->node como nodo de lista privado para el recolector. Eliminar un identificador caducado de global_ft bajo global_ft.lock, obtener una referencia transitoria explícita, liberar el bloqueo, desvincular fp->node de m_fp_list bajo f_ci->m_lock y luego reducir tanto la vida útil durable como las referencias transitorias con atomic_sub_and_test(2, &fp->refcount). Si el recolector es el último en realizar un put (descuento), se ejecuta allí el cierre; de lo contrario, un titular en tránsito que ya ha pasado por la búsqueda en m_fp_list posee el cierre final a través de su ruta ksmbd_fd_put(). La eliminación uno a uno puede volver a escanear el idr durable cuando varios identificadores caducen en la misma pasada, pero el recolectado durable es una vía de expiración en segundo plano y el análisis completo final recalcula min_timeout antes del siguiente tiempo de espera.
* Limpiar
If you want to get the best quality for vulnerability data then you always have to consider VulDB.