CVE-2026-80837 in Linux
要約
〜によって VulDB • 2026年09月04日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
netfilter: nf_tables: パケットパスオブジェクトの通知をキューに入れないこと
以下にあるすべての file:line 参照は v7.2-rc4 (ac5b0e5651b1) を対象としています。 トレースは同じ行が適用される 7.2.0-rc6-kasan72rc6 (075b74841bd0) でキャプチャされました。
nft_obj_notify() はエクスポートされており、パケットパスから到達可能です。その唯一のインツリー(in-tree)呼び出し元は nft_quota_obj_eval() (net/netfilter/nft_quota.c:68) であり、これは通過中のパケットに対してルールを評価する際に mutex を保持せずに GFP_ATOMIC で通知を行います。
コミット 67cc570edaa0 ("netfilter: nf_tables: coalesce multiple notifications into one skbuff") 以降、この通知は即座に送信されなくなりました。__nft_obj_notify() は nft_notify_enqueue() (net/netfilter/nf_tables_api.c:1211) を介して nft_net->notify_list にそれをキューに入れますが、これは単なる list_add_tail() です。notify_list には独自のロックがなく(include/net/netfilter/nf_tables.h:1951)、commit_mutex によって直列化されます:他の6つのエンキューサイトはすべて netlink トランザクション内で実行され、nft_commit_notify() (net/netfilter/nf_tables_api.c:10746) のドレイン処理では nf_tables_commit() から commit_mutex を保持した状態で list_del() + kfree_skb() が行われます。
したがって、枯渇したクォータオブジェクトを参照するチェーンを通じてパケットを送信すると、別の CPU 上でロックされていない list_add_tail() と list_del() + kfree_skb() の間でレース条件が発生します。__list_add() 内の WRITE_ONCE(prev->next, new) は、すでに解放された sk_buff を介して書き込みを行います:
BUG: KASAN: slab-use-after-free in __nft_obj_notify+0x2c5/0x2d0 Write of size 8 at addr ff110001047183c0 by task poc/76 CPU: 0 UID: 1000 PID: 76 Comm: poc Tainted: G W 7.2.0-rc6-kasan72rc6 #4 Call Trace: <IRQ> __nft_obj_notify (include/linux/list.h:164 include/linux/list.h:191 net/netfilter/nf_tables_api.c:1211 net/netfilter/nf_tables_api.c:8743) nft_quota_obj_eval (net/netfilter/nft_quota.c:68) nft_do_chain_inet nf_hook_slow __ip_local_out ip_push_pending_frames udp_send_skb udp_sendmsg __x64_sys_sendto
Allocated by task 77: __alloc_skb (net/core/skbuff.c:704) __nft_obj_notify (include/net/netlink.h:1055 net/netfilter/nf_tables_api.c:8731) nft_quota_obj_eval (net/netfilter/nft_quota.c:68) nft_do_chain
Freed by task 79: nf_tables_commit (include/linux/skbuff.h:1332 net/netfilter/nf_tables_api.c:10759 net/netfilter/nf_tables_api.c:11185) nfnetlink_rcv_batch (net/netfilter/nfnetlink.c:574) netlink_unicast netlink_sendmsg
The buggy address belongs to the cache skbuff_head_cache of size 232
パケットパスからのキューイングは、レース条件を脇に置いても誤りです:notify_list は nf_tables_commit() (:11185) の nft_commit_notify() によってのみドレインされるため、トランザクションの外でエンキューされた通知は、もし行われるとしても、後続の netlink バッチがコミットされるまで送信されません。
nft_obj_notify() がまだ受け取る gfp 引数は、このパスが直接 nfnetlink_send() を呼び出していた pre-67cc570edaa0 の動作の名残です。これを復元します:メッセージ構築を nft_obj_notify_alloc() に分離し、各呼び出し元に skb をどうするかを決めさせます。パケットパスから到達されるエクスポートされた関数である nft_obj_notify() はそれを即座に送信し、commit_mutex の下で実行されキューイングを維持する nf_tables_obj_notify() により、トランザクション通知は依然として結合(coalesced)されます。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.