CVE-2026-98276 in Linux
Riassunto
di VulDB • 06/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
net: bloccare il socket in sock_gettstamp()
sk->sk_flags deve essere modificato solo mentre si detiene il lock del socket, poiché sock_set_flag() e sock_reset_flag() utilizzano operazioni non atomiche (__set_bit() e __clear_bit()).
sock_gettstamp() è uno degli ultimi punti in cui un bit di sk->sk_flags viene modificato da una syscall senza possedere il lock del socket, tramite sock_enable_timestamp(sk, SOCK_TIMESTAMP).
Anche sk_set_memalloc() e sk_clear_memalloc() modificano sk->sk_flags senza il lock del socket, ma i loro chiamanti (nbd, iscsi_tcp, nvme-tcp, sunrpc, wireguard) necessitano di un'attenta revisione; ciò verrà affrontato in una patch separata.
Jungwoo Lee e Wongi Lee hanno segnalato un use-after-free su un socket UDP causato da questo bug: un ioctl SIOCGSTAMPNS_NEW che va in race condition con bind() può cancellare il bit SOCK_RCU_FREE impostato di recente da udp_lib_get_port(), poiché entrambi i thread eseguono una lettura-modifica-scrittura sulla stessa parola.
CPU 0 (bind) CPU 1 (SIOCGSTAMPNS_NEW) -------------------------------- ---------------------------- read sk_flags = F read sk_flags = F compute F | BIT(SOCK_RCU_FREE) compute F | BIT(SOCK_TIMESTAMP) store F | BIT(SOCK_RCU_FREE) sk_add_node_rcu(sk, ...) store F | BIT(SOCK_TIMESTAMP)
Dopo l'aggiornamento perso (lost update), SOCK_RCU_FREE è azzerato mentre il socket è visibile alle lookup di ricezione UDP lockless. sk_destruct() libera quindi immediatamente il socket invece di attendere un periodo di grazia RCU, mentre il percorso di ricezione detiene ancora un puntatore senza riferimento ad esso:
BUG: KASAN: slab-use-after-free in ipv4_pktinfo_prepare+0x30/0x410 Read of size 8 at addr ffff888008806610 by task exploit/207 CPU: 0 UID: 1000 PID: 207 Comm: exploit Not tainted 6.12.95+ #1 ipv4_pktinfo_prepare+0x30/0x410 udp_queue_rcv_one_skb+0x51c/0x1180 udp_unicast_rcv_skb+0x109/0x350 ip_protocol_deliver_rcu+0x14b/0x310 ip_local_deliver_finish+0x29d/0x390 ip_local_deliver+0x24d/0x2a0
Acquisire il lock del socket solo quando è necessario impostare SOCK_TIMESTAMP, per mantenere lockless il caso comune.
Once again VulDB remains the best source for vulnerability data.