cbcvebase.
CVE-2025-38472
published 2025-07-28

CVE-2025-38472: In the Linux kernel, the following vulnerability has been resolved: netfilter: nf_conntrack: fix crash due to removal of uninitialised entry A crash in…

medium5.5CVSS 3.1
AVLACLPRLUINSUCNINAH
In the Linux kernel, the following vulnerability has been resolved: netfilter: nf_conntrack: fix crash due to removal of uninitialised entry A crash in conntrack was reported while trying to unlink the conntrack entry from the hash bucket list: [exception RIP: __nf_ct_delete_from_lists+172] [..] #7 [ff539b5a2b043aa0] nf_ct_delete at ffffffffc124d421 [nf_conntrack] #8 [ff539b5a2b043ad0] nf_ct_gc_expired at ffffffffc124d999 [nf_conntrack] #9 [ff539b5a2b043ae0] __nf_conntrack_find_get at ffffffffc124efbc [nf_conntrack] [..] The nf_conn struct is marked as allocated from slab but appears to be in a partially initialised state: ct hlist pointer is garbage; looks like the ct hash value (hence crash). ct->status is equal to IPS_CONFIRMED|IPS_DYING, which is expected ct->timeout is 30000 (=30s), which is unexpected. Everything else looks like normal udp conntrack entry. If we ignore ct->status and pretend its 0, the entry matches those that are newly allocated but not yet inserted into the hash: - ct hlist pointers are overloaded and store/cache the raw tuple hash - ct->timeout matches the relative time expected for a new udp flow rather than the absolute 'jiffies' value. If it were not for the presence of IPS_CONFIRMED, __nf_conntrack_find_get() would have skipped the entry. Theory is that we did hit following race: cpu x cpu y cpu z found entry E found entry E E is expired nf_ct_delete() return E to rcu slab init_conntrack E is re-inited, ct->status set to 0 reply tuplehash hnnode.pprev stores hash value. cpu y found E right before it was deleted on cpu x. E is now re-inited on cpu z. cpu y was preempted before checking for expiry and/or confirm bit. ->refcnt set to 1 E now owned by skb ->timeout set to 30000 If cpu y were to resume now, it would observe E as expired but would skip E due to missing CONFIRMED bit. nf_conntrack_confirm gets called sets: ct->status |= CONFIRMED This is wrong: E is not yet added to hashtable. cpu y resumes, it observes E as expir

Affected

38 ranges· showing 25
VendorProductVersion rangeFixed in
debiandebian_linux
debianlinux< linux 6.1.147-1 (bookworm)linux 6.1.147-1 (bookworm)
debianlinux-6.1< linux 6.1.147-1 (bookworm)linux 6.1.147-1 (bookworm)
linuxlinux
linuxlinux
linuxlinux>= 1397af5bfd7d32b0cf2adb70a78c9a9e8f11d912 < a47ef874189d47f934d0809ae738886307c0ea22a47ef874189d47f934d0809ae738886307c0ea22
linuxlinux>= 1397af5bfd7d32b0cf2adb70a78c9a9e8f11d912 < 76179961c423cd698080b5e4d5583cf7f4fcdde976179961c423cd698080b5e4d5583cf7f4fcdde9
linuxlinux>= 1397af5bfd7d32b0cf2adb70a78c9a9e8f11d912 < fc38c249c622ff5e3011b8845fd49dbfd9289afcfc38c249c622ff5e3011b8845fd49dbfd9289afc
linuxlinux>= 1397af5bfd7d32b0cf2adb70a78c9a9e8f11d912 < 938ce0e8422d3793fe30df2ed0e37f6bc0598379938ce0e8422d3793fe30df2ed0e37f6bc0598379
linuxlinux>= 1397af5bfd7d32b0cf2adb70a78c9a9e8f11d912 < 2d72afb340657f03f7261e9243b44457a9228ac72d72afb340657f03f7261e9243b44457a9228ac7
linuxlinux>= 5.18.13 < 5.195.19
linuxlinux_kernel
linuxlinux_kernel>= 0 < 6.1.147-16.1.147-1
linuxlinux_kernel>= 0 < 6.12.41-16.12.41-1
linuxlinux_kernel>= 0 < 6.16.3-16.16.3-1
linuxlinux_kernel>= 0 < 6.8.0-100.1006.8.0-100.100
linuxlinux_kernel>= 5.18.13 < 6.1.1476.1.147
linuxlinux_kernel>= 6.13 < 6.15.86.15.8
linuxlinux_kernel>= 6.2 < 6.6.1006.6.100
linuxlinux_kernel>= 6.7 < 6.12.406.12.40
msrcazl3_avahi_0.8-4_on_azure_linux_3.0
msrcazl3_avahi_0.8-5_on_azure_linux_3.0
msrcazl3_kernel_6.6.96.2-1_on_azure_linux_3.0
msrcazl3_kernel_6.6.96.2-2_on_azure_linux_3.0
msrcazure_linux_3.0_arm

CVSS provenance

nvdv3.15.5MEDIUMCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
osv5.5MEDIUM