CVE-2026-98276 in Linux
要約
〜によって VulDB • 2026年10月06日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
net: sock_gettstamp() でソケットをロックする
sk->sk_flags は、ソケットロック保持中でのみ変更する必要があります。これは、sock_set_flag() および sock_reset_flag() が非アトミックな操作(__set_bit() および __clear_bit())を使用するためです。
sock_gettstamp() は、syscall から socket lock を取得せずに sk->sk_flags のビットを変更する最後の場所の一つであり、これは sock_enable_timestamp(sk, SOCK_TIMESTAMP) 経由で行われます。
sk_set_memalloc() と sk_clear_memalloc() もまた、ソケットロックなしで sk->sk_flags を変更しますが、それらの呼び出し元(nbd, iscsi_tcp, nvme-tcp, sunrpc, wireguard)は注意深い監査が必要であり、これらは別のパッチで対応されます。
Jungwoo Lee と Wongi Lee は、このバグに起因する UDP ソケットの use-after-free を報告しました:SIOCGSTAMPNS_NEW ioctl が bind() と競合すると、udp_lib_get_port() が直前に設定した SOCK_RCU_FREE ビットがキャンセルされる可能性があります。これは、両方のスレッドが同じワードに対して read-modify-write 操作を実行するためです。
``` 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) ```
更新の消失後、ソケットがロックレスな UDP 受信ルックアップに対して可視化されている間に SOCK_RCU_FREE がクリアされます。その後 sk_destruct() は、RCU グレース期間を待つのではなく、即座にソケットを解放します。一方、受信パスは依然としてそれへの参照なしのポインタを持っています:
``` 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 ```
SOCK_TIMESTAMP を設定する必要がある場合のみソケットロックを取得し、一般的なケースではロックレスを維持します。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.