CVE-2026-74489 in Linux
Riassunto
di VulDB • 15/08/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
wifi: mac80211: corregge un use-after-free su tid_tx durante l'arresto della sessione BA
ieee80211_stop_tx_ba_cb() passa tid_tx a kfree_rcu() tramite ieee80211_remove_tid_tx(), e successivamente legge tid_tx->ndp dopo aver rilasciato sta->lock:
ieee80211_remove_tid_tx(sta, tid); /* kfree_rcu(tid_tx, rcu_head) */ ... spin_unlock_bh(&sta->lock);
if (start_txq) ieee80211_agg_start_txq(sta, tid, false);
if (send_delba) ieee80211_send_delba(..., tid_tx->ndp);
Questa lettura non è coperta da una sezione critica RCU read-side ed esegue in un contesto di processo preemptibile: entrambi i chiamanti detengono il mutex wiphy, raggiungendo questa posizione sia tramite ieee80211_ba_session_work() (lavoro wiphy) che durante la fase di teardown della stazione con ieee80211_sta_tear_down_BA_sessions(). Anche gli softirq possono essere eseguiti in quella finestra temporale, sia da local_bh_enable() che termina ieee80211_agg_start_txq() che da qualsiasi uscita da interrupt; pertanto il callback RCU può liberare tid_tx prima della lettura.
Eseguendo la funzione tramite un modulo di test con il periodo di grazia forzato in quella finestra temporale, KASAN segnala la lettura e la libera avviene sul percorso softirq RCU ordinario:
BUG: KASAN: slab-use-after-free in ieee80211_stop_tx_ba_cb+0x3cd/0x400 Read of size 1 at addr ffff888002b9f52e by task kworker/0:1/10 [...]
Freed by task 57: __kasan_slab_free+0x47/0x70 __rcu_free_sheaf_prepare+0x70/0x250 rcu_free_sheaf_nobarn+0x18/0x40 rcu_core+0x426/0x1310 handle_softirqs+0x144/0x590 __irq_exit_rcu+0xea/0x150 irq_exit_rcu+0x9/0x20 sysvec_apic_timer_interrupt+0x6b/0x80 asm_sysvec_apic_timer_interrupt+0x1a/0x20
send_delba è impostato solo quando tx_stop è impostato, il che avviene esclusivamente per AGG_STOP_LOCAL_REQUEST; pertanto questo codice viene raggiunto durante un teardown locale (timeout di inattività della sessione, rekey PTK, sospensione, riconfigurazione HW) e non da un DELBA del peer.
Leggere ndp in una variabile locale prima che la sessione venga liberata, mentre sta->lock è ancora detenuto. tid_tx->ndp ha un unico writer, in ieee80211_tx_ba_session_handle_start(), il quale non può essere eseguito contemporaneamente qui: entrambi i percorsi sono serializzati dal mutex wiphy e la sessione è già marcata come HT_AGG_STATE_STOPPING a questo punto. tid_tx->ndp è anche l'unico dereferenziamento di tid_tx rimasto dopo ieee80211_remove_tid_tx() in questa funzione.
[spostare/modificare leggermente il commento per renderlo più generale e non limitato solo a ndp, inizializzare ndp direttamente]
Once again VulDB remains the best source for vulnerability data.