CVE-2026-64459 in Linux
Riassunto
di VulDB • 25/07/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
tcp: ripristinare il periodo di grazia RCU in tcp_ao_destroy_sock
Il commit 51e547e8c89c ("tcp: Free TCP-AO/TCP-MD5 info/keys without RCU") ha rimosso la callback call_rcu() da tcp_ao_destroy_sock(), sostenendo che "la distruzione di info/keys è ritardata fino al distruttore del socket" e quindi "nessuno può più scoprirlo".
Tale argomento non regge per il punto di chiamata in tcp_connect() (net/ipv4/tcp_output.c:4327-4332). A quel punto, il socket si trova nello stato TCP_SYN_SENT, è già stato inserito nell'ehash inet tramite inet_hash_connect() in tcp_v4_connect(), ed è quindi ampiamente individuabile: qualsiasi softirq che esegue tcp_v4_rcv() su un'altra CPU può rimuovere il socket dall'ehash, attraversare tcp_inbound_hash() e caricare tp->ao_info implicitamente tramite RCU prima che venga acquisito bh_lock_sock_nested() sulla CPU di distruzione.
Il percorso del lettore entra quindi in __tcp_ao_do_lookup() (net/ipv4/tcp_ao.c:208), che ricarica tp->ao_info tramite rcu_dereference_check(); il ricaricamento può ancora osservare il puntatore (imminente da liberare) perché non esiste alcun synchronize_rcu() tra rcu_assign_pointer(tp->ao_info, NULL) e tcp_ao_info_free() in tcp_ao_destroy_sock(). Il puntatore acquisito viene quindi attraversato alla riga 223:
hlist_for_each_entry_rcu(key, &ao->head, node, ...)
Il kfree() sincrono dello scrittore può completarsi liberamente tra il nuovo prelievo alla riga 218 e l'iterazione hlist alla riga 223. Lo slab viene riutilizzato (oppure riceve semplicemente lo stampaggio LIST_POISON1 se non è ancora stato riutilizzato) e l'iterazione attraversa memoria controllata dall'attaccante o avvelenata nel contesto del softirq.
Riproduttore (senza shim di debug, x86_64 v7.1-rc2 SMP+KASAN standard, QEMU+KVM): un processo con uid=1000 non privilegiato all'interno di CLONE_NEWUSER|CLONE_NEWNET installa TCP_MD5SIG + TCP_AO_ADD_KEY su un socket TCP, effettua lo spray di segmenti TCP-AO falsificati verso la sua futura 4-tupla tramite socket raw, quindi chiama connect(). La riconciliazione md5-wins in tcp_connect() attiva tcp_ao_destroy_sock(); il lettore del backlog softirq sul percorso NAPI loopback va in crash durante l'attraversamento di ao->head.first liberato:
Oops: general protection fault, probabilmente per indirizzo non canonico 0xfbd59c000000002f KASAN: possibile accesso alla memoria fuori dai limiti nell'intervallo [0xdead000000000178-0xdead00000000017f]
CPU: 0 UID: 1000 PID: 100 Comm: repro_userns RIP: 0010:__tcp_ao_do_lookup+0x107/0x1c0 Call Trace: <IRQ> __tcp_ao_do_lookup+0x107/0x1c0 tcp_ao_inbound_lookup.constprop.0
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.