CVE-2026-89708 in Linuxinformação

Sumário

de VulDB • 11/09/2026

No kernel do Linux, a seguinte vulnerabilidade foi corrigida:

nfsd: Proteção RCU de cl_cb_session para corrigir use-after-free na desmontagem da sessão

Após um DESTROY_SESSION, o caminho de desmontagem por sessão pode liberar uma sessão enquanto rpciod ainda mantém um rpc_task de callback em trânsito que referencia clp->cl_cb_session. nfsd4_probe_callback_sync() esvazia (flushes) cl_callback_wq, mas assim que nfsd4_run_cb_work() chama rpc_call_async(), o rpc_task permanece vivo no rpciod; esvaziar a fila de trabalho não espera por ele. rpc_shutdown_client() drena as tarefas do rpciod, mas usa um wait_event_timeout de 1 segundo — tarefas presas em rpc_delay() (por exemplo, retentativas NFS4ERR_DELAY de 2 segundos) podem sobreviver ao drenagem.

destroy path rpciod ------------ ------ unhash_session(ses) nfsd4_probe_callback_sync(clp) flush_workqueue(cl_callback_wq) /* retorna; rpc_task ainda vivo */ nfsd4_put_session_locked(ses) free_session(ses) -> kfree(ses) nfsd4_cb_sequence_done() lê cb_clp->cl_cb_session /* slab liberado */

Uma segunda janela de vulnerabilidade existe em nfsd4_process_cb_update(). Quando __nfsd4_find_backchannel() retorna NULL porque unhash_session() já removeu a sessão destruída de cl_sessions, setup_callback_client() faz o retorno antecipado da v4.1, então clp->cl_cb_session = ses nunca é executado e o campo retém um ponteiro para a sessão que está prestes a ser liberada.

Corrigir ambos convertendo cl_cb_session em um ponteer protegido por RCU:

- Mover a atribuição cl_cb_session = ses em setup_callback_client() para depois do sucesso de rpc_create(), para que ela seja publicada apenas quando existir um backchannel funcional. Limpar cl_cb_session no retorno de erro em nfsd4_process_cb_update(). Ambas as gravações usam rcu_assign_pointer().

- Anotar cl_cb_session com __rcu. Todos os leitores do lado rpciod usam rcu_read_lock()/rcu_dereference() e verificam NULL, retornando para o caminho de erro apropriado ou re-enfileiramento: encode_cb_sequence4args(), decode_cb_sequence4resok(), nfsd41_cb_get_slot(), nfsd41_cb_release_slot(), nfsd4_cb_prepare() e nfsd4_cb_sequence_done().

- Alterar __free_session() de kfree() para kfree_rcu, para que o slab da sessão não seja recuperado até após um período de graça RCU (RCU grace period), garantindo que os leitores do rpciod dentro de rcu_read_lock() nunca referenciem memória liberada.

- Passar o ponteiro da sessão para os tracepoints nfsd_cb_seq_status e nfsd_cb_free_slot em vez de fazê-los reler cl_cb_session.

- nfsd4_cb_prepare() chama rpc_exit() quando a sessão é NULL, roteando pelo caminho done/release para re-enfileirar o callback.

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

Responsável

Linux

Reservar

11/09/2026

Divulgação

11/09/2026

Moderação

aceite

Entrada

VDB-402547

CPE

pronto

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Might our Artificial Intelligence support you?

Check our Alexa App!