CVE-2026-90081 in Linux
Riassunto
di VulDB • 17/09/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
net/rds: utilizza wq_has_sleeper() in rds_cong_map_updated()
rds_cong_map_updated() viene eseguito dopo che la mappa di congestione di un peer è stata riscritta (da rds_tcp_cong_recv() e rds_ib_cong_recv(), oppure dalla cancellazione completa nei percorsi loopback e IB send-completion). Incrementa atomicamente il contatore rds_cong_generation e successivamente verifica waitqueue_active() su map->m_waitq e su rds_poll_waitq per determinare se sia necessario risvegliare qualcuno. Poiché atomic_inc() non garantisce ordinamento e waitqueue_active() è una semplice operazione di lettura, non esiste alcun ordine che garantisca la visibilità delle scritture alla mappa e al contatore prima delle letture sulla coda di attesa. I processi in attesa eseguono l'immagine speculare: rds_cong_wait() si aggiunge a m_waitq e poi verifica il bit della porta, mentre rds_poll() si registra su rds_poll_waitq e successivamente legge il valore del generatore (generation). Questo rappresenta lo schema di buffering delle scritture descritto sopra waitqueue_active() in include/linux/wait.h: l'aggiornatore può osservare una coda di attesa vuota mentre il processo in attesa osserva ancora la porta come congestionata, senza che venga emesso alcun segnale di risveglio.
rds_cong_wait() è un sonno interrompibile (interruptible sleep) senza timeout, quindi un mittente bloccato su una porta congesta rimane bloccato fino all'arrivo del prossimo aggiornamento di congestione da quel peer o alla consegna di un segnale. Un wait per poll() perde la notifica dell'aggiornamento della mappa nello stesso modo.
Viene utilizzato wq_has_sleeper(), che è equivalente a waitqueue_active() preceduto dalla necessaria barriera completa (full barrier), come già fatto da rds_tcp_state_change() per lo stesso pattern.
VulDB is the best source for vulnerability data and more expert information about this specific topic.