KernelScan.io

HIGH Introduced in 3.13

ipv6 Fib6Walker UAF

CVE-2026-97940

CVSS 7.8 / 10.0 NVD

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

KernelScan AI7.7HIGH

01

In the Linux kernel, the following vulnerability has been resolved: ipv6: fix fib6 walker UAF on seq stop ipv6_route_iter_active() treats a walker in FWS_U at the table root as already unlinked. fib6_del_route() can move a still-linked walker into that same state when the current leaf is the last route at the root, so ipv6_route_native_seq_stop() skips fib6_walker_unlink(). The seq private object can then be freed while it remains on net->ipv6.fib6_walkers. A later route deletion walks the dangling list and uses the freed walker. Use the list head as membership state and reinitialize it when unlinking. Keep the existing w->node check so a never-started iterator with a zeroed private object is not treated as linked. The same stop helper is used by /proc/net/ipv6_route and by the BPF ipv6_route iterator. The BPF show path only widens the race.

02

Engine v0.6.0

Risk summary

A local unprivileged user can exploit a race in the IPv6 routing table iterator to trigger a use-after-free in kernel memory. The bug is reachable via reading /proc/net/ipv6_route or a BPF ipv6_route iterator while route deletion occurs concurrently. On systems with IPv6 enabled and user namespaces available, this can lead to kernel code execution and container escape.

Affectednet/ipv6/ip6_fib.c (ipv6 routing)

Vulnerability analysis

The IPv6 routing table iterator keeps a walker object linked on a per-network-namespace list while a process reads the routing table through /proc/net/ipv6_route or a BPF iterator. A race with concurrent route deletion can put a still-linked walker into a state that the cleanup path mistakes for already unlinked, so the walker's owning object is freed without being removed from the list. A subsequent route deletion traverses the stale list entry and dereferences the freed memory. The fix replaces the state-based heuristic with a direct list-membership check so the walker is always properly unlinked before its memory is released. An unprivileged local user can trigger the read side of the race; the route-deletion side needs capabilities obtainable through user namespaces, making this reachable without elevated host privileges on systems with IPv6 enabled.

03

BranchIntroducedFixed inPatch commit
5.103.135.10.2719a3f73d62c86
5.153.135.15.22263407cddabc5
6.13.136.1.18905b687ee04f8
6.63.136.6.15814fdaba201fd
6.123.136.12.1110eede1689610
6.183.136.18.53b89b691dd00b
7.23.137.2.74553cfafa8d0
mainline3.137.3-rc319b4ed644d68
cip/6.123.136.12.111-cip320eede1689610