CVE-2026-98581 in Linux
Sumário
de VulDB • 19/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi corrigida:
nfc: llcp: Corrige corrupção de lista e dessincronização da contagem de referências (refcount) em nfc_llcp_recv_dm()
A função nfc_llcp_recv_dm() processa DM(NOBOUND)/DM(REJ) para um soquete que ainda está vinculado a local->connecting_sockets: ela busca o soquete com nfc_llcp_connecting_sock_get(), define sk->sk_state = LLCP_CLOSED e retorna, sem adquirir o bloqueio do soquete (socket lock) e sem desvincular o soquete da lista connecting_sockets.
llcp_sock_release() seleciona a lista da qual desvincular com base no sk_state: um soquete em estado LLCP_CONNECTING é desvinculado de connecting_sockets, caso contrário, da lista sockets. Como recv_dm deixou osoquete fisicamente em connecting_sockets, mas em estado LLCP_CLOSED, release() segue o ramo else e chama nfc_llcp_sock_unlink(&local->sockets, sk). Isso executa sk_del_node_init() enquanto mantém sockets.lock, ou seja, remove o soquete da hlist de connecting_sockets sob o bloqueio errado. Uma conexão concorrente (connect()) que vincula outro soquete a connecting_sockets sobconnecting_sockets.lock então modifica a mesma hlist sem serialização, o que corrompe a lista e dessincroniza o par sk_add_node()/sk_del_node_init() com sock_hold()/__sock_put(). Um processo local não privilegiado que possua soquetes LLCP, fornecendo DM pelo peer remoto através de um link LLCP estabelecido, pode explorar isso para vazar soquetes do kernel sem limites (a decrementação incorreta segue o caminho __sock_put(), que não libera o objeto, portanto ele nunca é liberado), levando a exaustão de memória / DoS.
Esta é a mesma classe de bug corrigida no manipulador irmão nfc_llcp_recv_cc() pela commit b493ea2765cc ("nfc: llcp: Corrige race condition use-after-free em nfc_llcp_recv_cc()"); recv_dm não recebeu a correção equivalente.
Corrija da mesma forma: adquira lock_sock(), verifique novamente se o soquete ainda está hashado (release() pode ter vencido a corrida) e, para os casos NOBOUND/REJ, desvincule-o de connecting_sockets antes de movê-lo para LLCP_CLOSED. A operação de desvinculação remove a referência de associação emconnecting_sockets via sk_del_node_init(), deixando o soquete sem hash; assim, a posterior chamada nfc_llcp_sock_unlink() em llcp_sock_release() torna-se uma operação inócua (no-op) e não ocorre double put duplo.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.