CVE-2026-23016
N/A
Summary
In the Linux kernel, the following vulnerability has been resolved:
inet: frags: drop fraglist conntrack references
Jakub added a warning in nf_conntrack_cleanup_net_list() to make debugging leaked skbs/conntrack references more obvious.
syzbot reports this as triggering, and I can also reproduce this via ip_defrag.sh selftest:
conntrack cleanup blocked for 60s WARNING: net/netfilter/nf_conntrack_core.c:2512 [..]
conntrack clenups gets stuck because there are skbs with still hold nf_conn references via their frag_list.
net.core.skb_defer_max=0 makes the hang disappear.
Eric Dumazet points out that skb_release_head_state() doesn't follow the fraglist.
ip_defrag.sh can only reproduce this problem since commit 6471658dc66c ("udp: use skb_attempt_defer_free()"), but AFAICS this problem could happen with TCP as well if pmtu discovery is off.
The relevant problem path for udp is:
- netns emits fragmented packets
- nf_defrag_v6_hook reassembles them (in output hook)
- reassembled skb is tracked (skb owns nf_conn reference)
- ip6_output refragments
- refragmented packets also own nf_conn reference (ip6_fragment calls ip6_copy_metadata())
- on input path, nf_defrag_v6_hook skips defragmentation: the fragments already have skb->nf_conn attached
- skbs are reassembled via ipv6_frag_rcv()
- skb_consume_udp -> skb_attempt_defer_free() -> skb ends up in pcpu freelist, but still has nf_conn reference.
Possible solutions: 1 let defrag engine drop nf_conn entry, OR 2 export kick_defer_list_purge() and call it from the conntrack netns exit callback, OR 3 add skb_has_frag_list() check to skb_attempt_defer_free()
2 & 3 also solve ip_defrag.sh hang but share same drawback:
Such reassembled skbs, queued to socket, can prevent conntrack module removal until userspace has consumed the packet. While both tcp and udp stack do call nf_reset_ct() before placing skb on socket queue, that function doesn't iterate frag_list skbs.
Therefore drop nf_conn entries when they are placed in defrag queue. Keep the nf_conn entry of the first (offset 0) skb so that reassembled skb retains nf_conn entry for sake of TX path.
Note that fixes tag is incorrect; it points to the commit introducing the 'ip_defrag.sh reproducible problem': no need to backport this patch to every stable kernel.
Affected Software
| Vendor | Product | Version Range | Status |
|---|---|---|---|
| Linux | Linux | 6471658dc66c670580a7616e75f51b52917e7883 < 088ca99dbb039c444c3ff987c5412a73f4f0cbf8 | affected |
| Linux | Linux | 6471658dc66c670580a7616e75f51b52917e7883 < 2ef02ac38d3c17f34a00c4b267d961a8d4b45d1a | affected |
| Linux | Linux | 6.18 | affected |
| Linux | Linux | 0 < 6.18 | unaffected |
| Linux | Linux | 6.18.6 <= 6.18.* | unaffected |
| Linux | Linux | 6.19 <= * | unaffected |
Weaknesses
References
- https://git.kernel.org/stable/c/088ca99dbb039c444c3ff987c5412a73f4f0cbf8
- https://git.kernel.org/stable/c/2ef02ac38d3c17f34a00c4b267d961a8d4b45d1a
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.