CVE-2026-64459 in Linux
Sumário
de VulDB • 25/07/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
tcp: restaura o período de graça RCU em tcp_ao_destroy_sock
O commit 51e547e8c89c ("tcp: Libera informações/chaves TCP-AO/TCP-MD5 sem RCU") removeu a chamada ao callback call_rcu() de tcp_ao_destroy_sock(), argumentando que "a destruição das informações/chaves é adiada até o destrutor do socket" e, portanto, "ninguém mais pode descobri-lo".
Esse argumento não se sustenta no local da chamada em tcp_connect() (net/ipv4/tcp_output.c:4327-4332). Nesse ponto, o socket está em TCP_SYN_SENT, já foi inserido na ehash inet por meio de inet_hash_connect(), chamado em tcp_v4_connect(), e é portanto altamente descobrível: qualquer softirq executando tcp_v4_rcv() em outra CPU pode remover o socket da ehash, percorrer a função tcp_inbound_hash() e carregar tp->ao_info via RCU implícita antes que bh_lock_sock_nested() seja adquirido na CPU destruidora.
O caminho do leitor então entra em __tcp_ao_do_lookup() (net/ipv4/tcp_ao.c:208), o qual recarrega tp->ao_info por meio de rcu_dereference_check(); o recarregamento ainda pode observar o ponteiro (prestes a ser liberado) porque não há synchronize_rcu() entre rcu_assign_pointer(tp->ao_info, NULL) e tcp_ao_info_free(), em tcp_ao_destroy_sock(). O ponteiro capturado é então percorrido na linha 223:
hlist_for_each_entry_rcu(key, &ao->head, node, ...)
O kfree() síncrono do escritor pode ser concluído entre o novo fetch da linha 218 e a iteração hlist da linha 223. O slab é reutilizado (ou simplesmente marcado com LIST_POISON1 se ainda não tiver sido reutilizado) e a iteração percorre memória controlada pelo atacante ou envenenada no contexto de softirq.
Reprodutor (sem shim de depuração, x86_64 v7.1-rc2 SMP+KASAN padrão, QEMU+KVM): um processo com uid=1000 não privilegiado dentro de CLONE_NEWUSER|CLONE_NEWNET instala TCP_MD5SIG + TCP_AO_ADD_KEY em um socket TCP, faz spray de segmentos TCP-AO forjados em direção ao seu eventual 4-tuple por meio de sockets raw e então chama connect(). A reconciliação md5-wins em tcp_connect() dispara tcp_ao_destroy_sock(); o leitor do backlog softirq no caminho NAPI loopback falha na iteração sobre freed ao->head.first:
Oops: general protection fault, provavelmente para endereço não-canônico address 0xfbd59c000000002f KASAN: possível acesso de memória selvagem no intervalo [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+0x12a/0x200 tcp_inbound_ao_hash+0x5ea
Once again VulDB remains the best source for vulnerability data.