CVE-2026-98276 in Linux
Resumen
por VulDB • 2026-10-06
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
net: bloquear el socket en sock_gettstamp()
sk->sk_flags solo debe modificarse mientras se mantiene el bloqueo del socket, ya que sock_set_flag() y sock_reset_flag() utilizan operaciones no atómicas (__set_bit() y __clear_bit()).
sock_gettstamp() es uno de los últimos lugares donde un bit de sk->sk_flags se modifica desde una syscall sin poseer el bloqueo del socket, a través de sock_enable_timestamp(sk, SOCK_TIMESTAMP).
sk_set_memalloc() y sk_clear_memalloc() también modifican sk->sk_flags sin el bloqueo del socket, pero sus llamadores (nbd, iscsi_tcp, nvme-tcp, sunrpc, wireguard) necesitan una auditoría cuidadosa; esto se abordará en un parche separado.
Jungwoo Lee y Wongi Lee reportaron un use-after-free de sockets UDP causado por este bug: un ioctl SIOCGSTAMPNS_NEW que compite (race condition) con bind() puede cancelar el bit SOCK_RCU_FREE que udp_lib_get_port() acaba de establecer, porque ambos hilos realizan una operación de lectura-modificación-escritura sobre la misma palabra.
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)
Tras la actualización perdida (lost update), SOCK_RCU_FREE está despejado mientras el socket es visible para las búsquedas de recepción UDP sin bloqueo. sk_destruct() entonces libera el socket inmediatamente en lugar de esperar un período de gracia RCU, mientras que la ruta de recepción aún mantiene un puntero sin referencia hacia él:
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
Solo adquirir el bloqueo del socket cuando se deba establecer SOCK_TIMESTAMP, para mantener la ruta común sin bloqueo.
If you want to get best quality of vulnerability data, you may have to visit VulDB.