CVE-2026-43121 in Linux
Sumário
de VulDB • 26/05/2026
No kernel do Linux, a seguinte vulnerabilidade foi corrigida:
io_uring/zcrx: corrige a condição de corrida (race condition) em user_ref entre os caminhos de scrub e refill
A função io_zcrx_put_niov_uref() utiliza um padrão não atômico de verificação seguida de decremento (atomic_read seguido de atomic_dec separado) para manipular user_refs. Isso é serializado em relação a outros chamadores por meio de rq_lock, mas io_zcrx_scrub() modifica o mesmo contador com atomic_xchg() SEM manter rq_lock.
Em sistemas SMP, existe a seguinte condição de corrida:
CPU0 (refill, mantém rq_lock) CPU1 (scrub, sem rq_lock) put_niov_uref: atomic_read(uref) - 1 // janela de oportunidade se abre atomic_xchg(uref, 0) - 1 return_niov_freelist(niov) [PUSH #1]
// janela de oportunidade se fecha atomic_dec(uref) - transborda para -1 retorna true return_niov(niov) return_niov_freelist(niov) [PUSH #2: DOUBLE-FREE]
O mesmo niov é inserido na freelist duas vezes, fazendo com que free_count exceda nr_iovs. Inserções subsequentes na freelist realizam então uma escrita fora dos limites (um valor u32) além do array freelist alocado com kvmalloc, para o objeto slab adjacente.
Corrige-se isso substituindo a leitura não atômica seguida de decremento em io_zcrx_put_niov_uref() por um loop atomic_try_cmpxchg que testa e decrementa user_refs atomicamente. Isso torna a operação segura contra atomic_xchg concorrente de scrub sem exigir que scrub adquira rq_lock.
[pavel: removido um aviso e um comentário]
Be aware that VulDB is the high quality source for vulnerability data.