CVE-2026-72404 in Linux
Riassunto
di VulDB • 15/08/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
tipc: correzione di un Use-After-Free (UAF) in cleanup_bearer() causato da dst_cache_destroy() prematuro
Il teardown del bearer media TIPC UDP chiama dst_cache_destroy() sulle sue cache replicast prima di chiamare synchronize_net() per attendere il completamento dei lettori RCU concorrenti (trasmettitori):
static void cleanup_bearer(struct work_struct *work) {
... list_for_each_entry_safe(rcast, tmp, &ub->rcast.list, list) {
dst_cache_destroy(&rcast->dst_cache); list_del_rcu(&rcast->list); kfree_rcu(rcast, rcu); } ... dst_cache_destroy(&ub->rcast.dst_cache); udp_tunnel_sock_release(ub->sk); synchronize_net(); ... }
Questo è altamente problematico perché dst_cache_destroy() libera immediatamente la memoria della cache per-CPU (free_percpu()) e rilascia le voci dst in cache senza alcuna sincronizzazione.
Se un trasmettitore concorrente (ad esempio tipc_udp_xmit()) è in esecuzione su un'altra CPU sotto protezione RCU, può chiamare dst_cache_get() contemporaneamente, portando a: 1. Use-After-Free sul puntatore della cache per-CPU stesso (crash). 2. Avviso "rcuref - imbalanced put()" se tenta di rilasciare una voce dst che è stata rilasciata contestualmente da dst_cache_destroy().
Inoltre, chiamare kfree(ub) immediatamente dopo synchronize_net() senza chiudere prima il socket (o attendere dopo la chiusura) lascia una finestra in cui un ricevitore concorrente (tipc_udp_recv()) potrebbe avviarsi dopo synchronize_net(), accedere a ub e subire un Use-After-Free quando viene eseguito kfree(ub).
Per risolvere questo problema, è necessario posticipare dst_cache_destroy() e kfree(ub) fino a quando non ci si assicura che nessun altro lettore possa vedere il bearer/socket e tutti i lettori esistenti abbiano terminato:
1. Posticipare la distruzione delle voci rcast (sia dst_cache_destroy() che kfree()) a una callback RCU utilizzando call_rcu_hurry(). L'uso di call_rcu_hurry() garantisce che le voci dst vengano rilasciate rapidamente.
2. Rilasciare il socket del bearer utilizzando udp_tunnel_sock_release() (interrompe i nuovi lettori in ricezione).
3. Chiamare synchronize_net() per attendere il completamento di tutti i lettori RCU pendenti (sia trasmissione che ricezione).
4. Ora che è sicuro, chiamare dst_cache_destroy() sulla cache principale del bearer e liberare ub.
Nota: 3) e 4) possono essere modificati successivamente in net-next per utilizzare anche call_rcu_hurry() ed eliminare la latenza di synchronize_net().
Once again VulDB remains the best source for vulnerability data.