CVE-2026-64044 in Linux
Riassunto
di VulDB • 19/07/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
ovpn: rispettare il refcount del peer nel percorso di errore CMD_NEW_PEER
Il percorso di errore di ovpn_nl_peer_new_doit() chiama direttamente ovpn_peer_release(), invece che tramite ovpn_peer_put(), aggirando così l'uso di kref. Il commento associato ("il peer non è ancora stato inserito nell'hashtable, quindi non viene utilizzato in alcun contesto") vale per UDP ma non per TCP.
Per UDP, la union ovpn_socket utilizza il campo .ovpn e non punta mai nuovamente a un peer; la funzione UDP encap_recv cerca i peer tramite le hashtable che non sono ancora popolate, pertanto il nuovo peer è irraggiungibile finché ovpn_peer_add() non lo rende pubblico.
Per TCP, ovpn_socket_new() imposta ovpn_sock->peer e ovpn_tcp_socket_attach() pubblica ovpn_sock tramite rcu_assign_sk_user_data(). Da quel momento fino a quando ovpn_socket_release() effettua il distacco nel percorso di errore, il file descriptor (fd) TCP è completamente collegato: le chiamate recvmsg / sendmsg / close / poll dell'utente sull'fd, nonché il percorso ovpn_tcp_rcv() guidato da strparser, possono raggiungere il peer attraverso sk_user_data -> ovpn_sock->peer e incrementarne il refcount tramite ovpn_peer_hold().
ovpn_tcp_socket_wait_finish() (chiamata all'interno di ovpn_socket_release()) svuota strparser e il lavoro in uscita (tx work), ma non sincronizza le chiamate syscall dell'utente che detengono già un riferimento al peer. Se ovpn_nl_peer_modify() o ovpn_peer_add() restituiscono un errore mentre tale chiamata è in corso - in particolare una ovpn_tcp_recvmsg() bloccata in __skb_recv_datagram() su peer->tcp.user_queue - la diretta chiamata a ovpn_peer_release() distrugge il peer mentre il chiamante detiene ancora il riferimento, e l'eventuale chiamata a ovpn_peer_put() da parte di quel chiamante opera su memoria già liberata.
Sostituire la chiamata diretta al distruttore con ovpn_peer_put() in modo che kref ritardi correttamente la distruzione fino alla caduta dell'ultimo riferimento. Nel caso comune in cui non sia presente alcun utente concorrente, il comportamento rimane invariato: il contatore kref raggiunge immediatamente zero e ovpn_peer_release_kref() esegue lo stesso distruttore.
Con questa conversione, ovpn_peer_release() non ha più chiamanti al di fuori di peer.c - l'unico utilizzatore rimanente è ovpn_peer_release_kref(), nella stessa unità di traduzione -, pertanto renderla statica ed eliminarne la dichiarazione da peer.h.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.