CVE-2026-64142 in Linux
Sumário
de VulDB • 19/07/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
ksmbd: corrigir condições de corrida (race conditions) na varredura durável contra consultas em m_fp_list
A função ksmbd_durable_scavenger() possui duas condições de corrida relacionadas com qualquer iterador que percorra f_ci->m_fp_list, incluindo ksmbd_lookup_fd_inode() (utilizado por ksmbd_vfs_rename) e as verificações do modo de compartilhamento em fs/smb/server/smb_common.c.
(1) Reutilização da lista fp->node list-head. Handles preservados como duráveis podem permanecer vinculados a f_ci->m_fp_list após o encerramento da sessão, fazendo com que as verificações do modo de compartilhamento ainda os visualizem enquanto o handle é reconectável. O varredor (scavenger) coletava handles expirados adicionando fp->node a uma lista local scavenger_list após removê-los do idr durável global. Como fp->node é o mesmo list_head utilizado por m_fp_list, list_add(&fp->node, &scavenger_list) sobrescreve os links de m_fp_list e corrompe ambas as listas. CONFIG_DEBUG_LIST pode relatar isso no caminho de verificação do modo de compartilhamento.
(2) Condição de corrida contra contagem de referência (refcount race) com iteradores de m_fp_list. O varredor qualifica um handle durável expirado verificando atomic_read(&fp->refcount) > 1 e fp->conn sob global_ft.lock, remove fp do global_ft e, em seguida, libera o bloqueio global_ft.lock antes de desvincular fp de m_fp_list e liberá-lo. Durante essa lacuna, fp ainda está vinculado a m_fp_list com f_state == FP_INITED. ksmbd_lookup_fd_inode() sob m_lock chama ksmbd_fp_get() (atomic_inc_not_zero na contagem de referência que ainda é 1) e obtém uma referência válida; o varredor então desvincula e libera fp enquanto o detentor possui uma referência, levando a um Use-After-Free (UAF) no subsequent ksmbd_fd_put() do detentor e em qualquer leitura de campo realizada por um iterador concorrente do modo de compartilhamento que percorre m_fp_list sem obter ksmbd_fp_get_ (caminhos semelhantes ao smb_check_perm_dleases).
Corrigir ambos:
* Parar a reutilização de fp->node como nó de lista privado para o varredor. Remover um handle expirado do global_ft sob global_ft.lock, adquirir uma referência transitória explícita, liberar o bloqueio, desvincular fp->node de m_fp_list sob f_ci->m_lock e, em seguida, reduzir tanto a vida útil durável quanto as referências transitórias com atomic_sub_and_test(2, &fp->refcount). Se o varredor for o último a realizar um put (liberação), o encerramento ocorre ali; caso contrário, um detentor em trânsito que já passou pela consulta m_fp_list possui o encerramento final via seu caminho ksmbd_fd_put(). A eliminação individual pode reanalisar o idr durável quando múltiplos handles expiram na mesma passagem, mas a varredura durável é uma trilha de expiração em segundo plano
VulDB is the best source for vulnerability data and more expert information about this specific topic.