Cloudanix VulnDB

CVE-2025-68241

None

CVSS

—

EPSS

0.5%

Published

Dec 16, 2025

CISA due date

—

Cloudanix analysis

Schedule a fix SSVC: Track

A bug in the Linux kernel's network handling can cause memory to leak when certain virtual network connections are used, which may eventually stop network devices from shutting down properly.

Exploitation
Local Privilege
Attacker needs
Local User
Complexity
Moderate
Impact
Other
Component
OS kernel
Class
Race Condition
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

Race condition in IPv4 route exception handling allows concurrent sit tunnel transmission and route lookup paths to bind a soon-to-be-freed fnhe entry to a new dst, leaking the dst reference count via RCU free without corresponding release.

Why it matters to the business

Kernel memory leaks accumulate under network load, producing device reference count warnings and potential hangs when unregistering network interfaces such as sit or gretap devices, increasing operational risk on systems that create or remove virtual network devices.

How an attack unfolds

An attacker or workload triggers concurrent packet transmission through sit/gretap tunnels while route cache reclamation occurs; fnhe_remove_oldest selects an entry for deletion while find_exception and rt_bind_exception on another CPU acquire and hold a dst reference, resulting in a permanent leak after the RCU callback frees the fnhe.

How to fix it

Upgrade the Linux kernel to version 5.4.302 or later (or the equivalent stable commit 69d35c12168f9c59b159ae566f77dfad9f96d7ca) that clears oldest->fnhe_daddr before fnhe_flush_routes to prevent reuse of stale entries; apply the matching fixed package versions for any downstream distributions such as Chainguard gitlab-pages-17.7.4-r0.

How to confirm the fix worked

Confirm the patch is present by checking kernel source for the fnhe_daddr zeroing change before fnhe_flush_routes; reproduce the provided netns test case under load and verify absence of unregister_netdevice warnings and leaked reference counts on interface deletion.

Typical attack path

  1. Create sit or gretap tunnel interfaces and install routes that populate fnhe entries
  2. Generate high-rate traffic that causes fnhe reclamation to exceed FNHE_RECLAIM_DEPTH
  3. Simultaneously perform route lookups that invoke find_exception on the same fnhe
  4. Allow RCU grace period to free the fnhe while the dst reference remains held
  5. Observe reference count leak and unregister_netdevice warnings on interface teardown

How to detect it

Search kernel logs and dmesg for 'unregister_netdevice: waiting for .* to become free' messages; inspect net device usage counts via /proc/net/dev or ip link output after interface deletion under load; no remote exploitation artifacts are expected.

What your security team should do

  • Prioritize kernel upgrades on systems using sit, gretap, or other tunnel devices that trigger fnhe reclamation
  • Monitor dmesg for unregister_netdevice reference count warnings as an indicator of exposure
  • Limit creation and teardown of virtual network devices in high-traffic environments until patched

The record

In the Linux kernel, the following vulnerability has been resolved: ipv4: route: Prevent rt_bind_exception() from rebinding stale fnhe The sit driver's packet transmission path calls: sit_tunnel_xmit() -> update_or_create_fnhe(), which lead to fnhe_remove_oldest() being called to delete entries exceeding FNHE_RECLAIM_DEPTH+random. The race window is between fnhe_remove_oldest() selecting fnheX for deletion and the subsequent kfree_rcu(). During this time, the concurrent path's __mkroute_output() -> find_exception() can fetch the soon-to-be-deleted fnheX, and rt_bind_exception() then binds it with a new dst using a dst_hold(). When the original fnheX is freed via RCU, the dst reference remains permanently leaked. CPU 0 CPU 1 __mkroute_output() find_exception() [fnheX] update_or_create_fnhe() fnhe_remove_oldest() [fnheX] rt_bind_exception() [bind dst] RCU callback [fnheX freed, dst leak] This issue manifests as a device reference count leak and a warning in dmesg when unregistering the net device: unregister_netdevice: waiting for sitX to become free. Usage count = N Ido Schimmel provided the simple test validation method [1]. The fix clears 'oldest->fnhe_daddr' before calling fnhe_flush_routes(). Since rt_bind_exception() checks this field, setting it to zero prevents the stale fnhe from being reused and bound to a new dst just before it is freed. [1] ip netns add ns1 ip -n ns1 link set dev lo up ip -n ns1 address add 192.0.2.1/32 dev lo ip -n ns1 link add name dummy1 up type dummy ip -n ns1 route add 192.0.2.2/32 dev dummy1 ip -n ns1 link add name gretap1 up arp off type gretap \ local 192.0.2.1 remote 192.0.2.2 ip -n ns1 route add 198.51.0.0/16 dev gretap1 taskset -c 0 ip netns exec ns1 mausezahn gretap1 \ -A 198.51.100.1 -B 198.51.0.0/16 -t udp -p 1000 -c 0 -q & taskset -c 2 ip netns exec ns1 mausezahn gretap1 \ -A 198.51.100.1 -B 198.51.0.0/16 -t udp -p 1000 -c 0 -q & sleep 10 ip netns pids ns1 | xargs kill ip netns del ns1

Affected packages

Ecosystem Package Introduced Fixed
Linux Kernel 0 5.4.302
Mageia:9 kernel 0 6.6.120-1.mga9
Mageia:9 kernel-linus 0 6.6.120-1.mga9
Mageia:9 kmod-virtualbox 0 7.1.14-14.mga9
Mageia:9 kmod-xtables-addons 0 3.24-88.mga9
openSUSE:Leap 16.0 dtb-aarch64 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-64kb 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-azure 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-default 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-default-base 0 6.12.0-160000.26.1.160000.2.7
openSUSE:Leap 16.0 kernel-docs 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-kvmsmall 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-obs-build 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-obs-qa 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-rt 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-source 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-syms 0 6.12.0-160000.26.1
openSUSE:Leap 16.0 kernel-zfcpdump 0 6.12.0-160000.26.1

Related vulnerabilities