{"id":"CVE-2025-39894","state":"PUBLISHED","title":"netfilter: br_netfilter: do not check confirmed bit in br_nf_local_in() after confirm","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nnetfilter: br_netfilter: do not check confirmed bit in br_nf_local_in() after confirm\n\nWhen send a broadcast packet to a tap device, which was added to a bridge,\nbr_nf_local_in() is called to confirm the conntrack. If another conntrack\nwith the same hash value is added to the hash table, which can be\ntriggered by a normal packet to a non-bridge device, the below warning\nmay happen.\n\n  ------------[ cut here ]------------\n  WARNING: CPU: 1 PID: 96 at net/bridge/br_netfilter_hooks.c:632 br_nf_local_in+0x168/0x200\n  CPU: 1 UID: 0 PID: 96 Comm: tap_send Not tainted 6.17.0-rc2-dirty #44 PREEMPT(voluntary)\n  RIP: 0010:br_nf_local_in+0x168/0x200\n  Call Trace:\n   <TASK>\n   nf_hook_slow+0x3e/0xf0\n   br_pass_frame_up+0x103/0x180\n   br_handle_frame_finish+0x2de/0x5b0\n   br_nf_hook_thresh+0xc0/0x120\n   br_nf_pre_routing_finish+0x168/0x3a0\n   br_nf_pre_routing+0x237/0x5e0\n   br_handle_frame+0x1ec/0x3c0\n   __netif_receive_skb_core+0x225/0x1210\n   __netif_receive_skb_one_core+0x37/0xa0\n   netif_receive_skb+0x36/0x160\n   tun_get_user+0xa54/0x10c0\n   tun_chr_write_iter+0x65/0xb0\n   vfs_write+0x305/0x410\n   ksys_write+0x60/0xd0\n   do_syscall_64+0xa4/0x260\n   entry_SYSCALL_64_after_hwframe+0x77/0x7f\n   </TASK>\n  ---[ end trace 0000000000000000 ]---\n\nTo solve the hash conflict, nf_ct_resolve_clash() try to merge the\nconntracks, and update skb->_nfct. However, br_nf_local_in() still use the\nold ct from local variable 'nfct' after confirm(), which leads to this\nwarning.\n\nIf confirm() does not insert the conntrack entry and return NF_DROP, the\nwarning may also occur. There is no need to reserve the WARN_ON_ONCE, just\nremove it.","publishedAt":"2025-10-01T07:42:43.126Z","updatedAt":"2026-10-15T22:02:32.869Z","severity":{"score":7.5,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"7c3f28599652acf431a2211168de4a583f30b6d5","status":"affected","lessThan":"d00c8b0daf56012f69075e3377da67878c775e4c","versionType":"git"},{"version":"2b1414d5e94e477edff1d2c79030f1d742625ea0","status":"affected","lessThan":"ccbad4803225eafe0175d3cb19f0d8d73b504a94","versionType":"git"},{"version":"80cd0487f630b5382734997c3e5e3003a77db315","status":"affected","lessThan":"50db11e2bbb635e38e3dd096215580d6adb41fb0","versionType":"git"},{"version":"62e7151ae3eb465e0ab52a20c941ff33bb6332e9","status":"affected","lessThan":"c47ca77fee9071aa543bae592dd2a384f895c8b6","versionType":"git"},{"version":"62e7151ae3eb465e0ab52a20c941ff33bb6332e9","status":"affected","lessThan":"a74abcf0f09f59daeecf7a3ba9c1d690808b0afe","versionType":"git"},{"version":"62e7151ae3eb465e0ab52a20c941ff33bb6332e9","status":"affected","lessThan":"479a54ab92087318514c82428a87af2d7af1a576","versionType":"git"},{"version":"cb734975b0ffa688ff6cc0eed463865bf07b6c01","status":"affected","versionType":"git"},{"version":"5.15.151","status":"affected","lessThan":"5.15.192","versionType":"semver"},{"version":"6.1.81","status":"affected","lessThan":"6.1.151","versionType":"semver"},{"version":"6.6.21","status":"affected","lessThan":"6.6.105","versionType":"semver"},{"version":"6.7.9","status":"affected","lessThan":"6.8","versionType":"semver"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/bridge/br_netfilter_hooks.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"6.8","status":"affected"},{"version":"0","status":"unaffected","lessThan":"6.8","versionType":"semver"},{"version":"5.15.192","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.151","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.105","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.46","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.16.6","status":"unaffected","lessThanOrEqual":"6.16.*","versionType":"semver"},{"version":"6.17","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/bridge/br_netfilter_hooks.c"]}],"references":["https://git.kernel.org/stable/c/d00c8b0daf56012f69075e3377da67878c775e4c","https://git.kernel.org/stable/c/ccbad4803225eafe0175d3cb19f0d8d73b504a94","https://git.kernel.org/stable/c/50db11e2bbb635e38e3dd096215580d6adb41fb0","https://git.kernel.org/stable/c/c47ca77fee9071aa543bae592dd2a384f895c8b6","https://git.kernel.org/stable/c/a74abcf0f09f59daeecf7a3ba9c1d690808b0afe","https://git.kernel.org/stable/c/479a54ab92087318514c82428a87af2d7af1a576","https://lists.debian.org/debian-lts-announce/2025/10/msg00008.html"],"weaknesses":[],"ingestedAt":"2026-10-29T20:09:09.358Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2025/39xxx/CVE-2025-39894.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2025-39894","state":"PUBLISHED","datePublished":"2025-10-01T07:42:43.126Z","dateUpdated":"2026-10-15T22:02:32.869Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2025-04-16T07:20:57.145Z"},"containers":{"cna":{"title":"netfilter: br_netfilter: do not check confirmed bit in br_nf_local_in() after confirm","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nnetfilter: br_netfilter: do not check confirmed bit in br_nf_local_in() after confirm\n\nWhen send a broadcast packet to a tap device, which was added to a bridge,\nbr_nf_local_in() is called to confirm the conntrack. If another conntrack\nwith the same hash value is added to the hash table, which can be\ntriggered by a normal packet to a non-bridge device, the below warning\nmay happen.\n\n  ------------[ cut here ]------------\n  WARNING: CPU: 1 PID: 96 at net/bridge/br_netfilter_hooks.c:632 br_nf_local_in+0x168/0x200\n  CPU: 1 UID: 0 PID: 96 Comm: tap_send Not tainted 6.17.0-rc2-dirty #44 PREEMPT(voluntary)\n  RIP: 0010:br_nf_local_in+0x168/0x200\n  Call Trace:\n   <TASK>\n   nf_hook_slow+0x3e/0xf0\n   br_pass_frame_up+0x103/0x180\n   br_handle_frame_finish+0x2de/0x5b0\n   br_nf_hook_thresh+0xc0/0x120\n   br_nf_pre_routing_finish+0x168/0x3a0\n   br_nf_pre_routing+0x237/0x5e0\n   br_handle_frame+0x1ec/0x3c0\n   __netif_receive_skb_core+0x225/0x1210\n   __netif_receive_skb_one_core+0x37/0xa0\n   netif_receive_skb+0x36/0x160\n   tun_get_user+0xa54/0x10c0\n   tun_chr_write_iter+0x65/0xb0\n   vfs_write+0x305/0x410\n   ksys_write+0x60/0xd0\n   do_syscall_64+0xa4/0x260\n   entry_SYSCALL_64_after_hwframe+0x77/0x7f\n   </TASK>\n  ---[ end trace 0000000000000000 ]---\n\nTo solve the hash conflict, nf_ct_resolve_clash() try to merge the\nconntracks, and update skb->_nfct. However, br_nf_local_in() still use the\nold ct from local variable 'nfct' after confirm(), which leads to this\nwarning.\n\nIf confirm() does not insert the conntrack entry and return NF_DROP, the\nwarning may also occur. There is no need to reserve the WARN_ON_ONCE, just\nremove it."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"7c3f28599652acf431a2211168de4a583f30b6d5","status":"affected","lessThan":"d00c8b0daf56012f69075e3377da67878c775e4c","versionType":"git"},{"version":"2b1414d5e94e477edff1d2c79030f1d742625ea0","status":"affected","lessThan":"ccbad4803225eafe0175d3cb19f0d8d73b504a94","versionType":"git"},{"version":"80cd0487f630b5382734997c3e5e3003a77db315","status":"affected","lessThan":"50db11e2bbb635e38e3dd096215580d6adb41fb0","versionType":"git"},{"version":"62e7151ae3eb465e0ab52a20c941ff33bb6332e9","status":"affected","lessThan":"c47ca77fee9071aa543bae592dd2a384f895c8b6","versionType":"git"},{"version":"62e7151ae3eb465e0ab52a20c941ff33bb6332e9","status":"affected","lessThan":"a74abcf0f09f59daeecf7a3ba9c1d690808b0afe","versionType":"git"},{"version":"62e7151ae3eb465e0ab52a20c941ff33bb6332e9","status":"affected","lessThan":"479a54ab92087318514c82428a87af2d7af1a576","versionType":"git"},{"version":"cb734975b0ffa688ff6cc0eed463865bf07b6c01","status":"affected","versionType":"git"},{"version":"5.15.151","status":"affected","lessThan":"5.15.192","versionType":"semver"},{"version":"6.1.81","status":"affected","lessThan":"6.1.151","versionType":"semver"},{"version":"6.6.21","status":"affected","lessThan":"6.6.105","versionType":"semver"},{"version":"6.7.9","status":"affected","lessThan":"6.8","versionType":"semver"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/bridge/br_netfilter_hooks.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"6.8","status":"affected"},{"version":"0","status":"unaffected","lessThan":"6.8","versionType":"semver"},{"version":"5.15.192","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.151","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.105","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.46","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.16.6","status":"unaffected","lessThanOrEqual":"6.16.*","versionType":"semver"},{"version":"6.17","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/bridge/br_netfilter_hooks.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/d00c8b0daf56012f69075e3377da67878c775e4c"},{"url":"https://git.kernel.org/stable/c/ccbad4803225eafe0175d3cb19f0d8d73b504a94"},{"url":"https://git.kernel.org/stable/c/50db11e2bbb635e38e3dd096215580d6adb41fb0"},{"url":"https://git.kernel.org/stable/c/c47ca77fee9071aa543bae592dd2a384f895c8b6"},{"url":"https://git.kernel.org/stable/c/a74abcf0f09f59daeecf7a3ba9c1d690808b0afe"},{"url":"https://git.kernel.org/stable/c/479a54ab92087318514c82428a87af2d7af1a576"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","baseScore":7.5,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:N - The trigger is a broadcast/multicast IP frame arriving on a bridge port and being locally delivered via br_pass_frame_up() → NF_BR_LOCAL_IN, requiring no host access at all; on the very common overlay deployments (VXLAN/GRE port enslaved to a Linux bridge in Docker overlay, k8s CNI, OpenStack) those inner broadcast frames originate from a routed, remote VTEP, making the vulnerable code reachable across layer 3.\nAC:L - The attacker drives both sides of the clash by flooding duplicate same-tuple broadcast datagrams, which the bridge itself fans out concurrently (flood to N ports plus local receive, plus a copy to a non-bridge device as noted in the commit), so two unconfirmed conntracks with an identical tuple reach __nf_conntrack_confirm() in parallel. The required br_netfilter+conntrack+bridge configuration is the default on container and virtualization hosts, not a rare option.\nPR:N - No credentials or capabilities on the target are needed — the attacker only has to get an IP broadcast/multicast frame onto a segment bridged by the victim, which is unauthenticated packet delivery.\nUI:N - No victim action is required; the bridge processes the received frames automatically in softirq context.\nS:U - The stale conntrack read and the WARNING both occur in the host kernel's own netfilter/bridge context, with no crossing of a VM, IOMMU, or sandbox boundary.\nC:N - The stale read is a single unsigned long from a SLAB_TYPESAFE_BY_RCU nf_conn object and its value is consumed only by the WARN condition — it is never returned to the attacker, and the remote attacker has no channel to read the resulting dmesg splat.\nI:N - No write occurs on the stale pointer; confirm() has already repointed skb->_nfct at the surviving conntrack with a valid reference, so no kernel memory is modified and no control flow is influenced.\nA:H - The bug fires a kernel WARNING from a remotely reachable softirq path, which taints the kernel and causes an immediate panic on the many hardened, Android, ChromeOS, and cloud/CI deployments that run with panic_on_warn=1, yielding a full denial of service."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-08-05T12:05:56.359Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.15.151","versionEndExcluding":"5.15.192"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.1.81","versionEndExcluding":"6.1.151"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.6.21","versionEndExcluding":"6.6.105"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.8","versionEndExcluding":"6.12.46"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.8","versionEndExcluding":"6.16.6"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.8","versionEndExcluding":"6.17"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.7.9"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}},"adp":[{"title":"CVE Program Container","references":[{"url":"https://lists.debian.org/debian-lts-announce/2025/10/msg00008.html"}],"providerMetadata":{"shortName":"CVE","orgId":"af854a3a-2127-422b-91ae-364da2661108","dateUpdated":"2025-11-03T17:44:28.733Z"}},{"title":"CISA ADP Vulnrichment","metrics":[{"other":{"type":"ssvc","content":{"id":"CVE-2025-39894","role":"CISA Coordinator","options":[{"Exploitation":"none"},{"Automatable":"yes"},{"Technical Impact":"partial"}],"version":"2.0.3","timestamp":"2026-10-15T21:54:35.991421Z"}}}],"providerMetadata":{"shortName":"CISA-ADP","orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","dateUpdated":"2026-10-15T22:02:32.869Z"}}]}}}