Look up another CVE · open CVE-2026-90111 in the interactive tracker
CVE-2026-90111
ip6mr: do not clone dst in ip6mr_cache_report()
Published 2026-09-17 (31 days ago) by the Linux kernel CNA. Subsystem net/ipv6. Debian urgency: not yet assigned.
What to do, per Debian release
Debian's own status for CVE-2026-90111 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source
| Release | Status | Version | What this means |
|---|---|---|---|
| Debian 12bookworm | vulnerable | 6.1.190-1 | No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication. |
| Debian 13trixie | vulnerable | 6.12.113-1 | No fix published anywhere yet, neither in Debian nor upstream for the series trixie tracks. Watch the Debian tracker page for this CVE. Advisories for trixie have historically landed a median of 11 days after publication. |
| Debian 14forky | fixed | 7.2.6-1 | Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.2.6-1 | Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
IPv6 input attaches a non-refcounted (NOREF) dst to skbs under RCU. When an ingress multicast packet misses MFC lookup, ip6mr_cache_unresolved() places the skb onto the unresolved queue, escaping the receive-side RCU grace period. If the underlying route is deleted and freed, and the MFC queue is later resolved with a wrong parent interface, ip6_mr_forward() invokes ip6mr_cache_report(..., MRT6MSG_WRONGMIF), which executes dst_clone(skb_dst(pkt)) on the freed dst entry, triggering a slab use-after-free. Report packets queued to mroute6_sk (a raw socket) and netlink notifications do not require an attached dst entry. Fix this by: 1. Removing dst_clone() in ip6mr_cache_report() and ensuring report skbs do not hold a dst. 2. Dropping skb_dst before queuing unresolved skbs in ip6mr_cache_unresolved(), matching the fact that multicast forwarding resolves outgoing routes anew via ip6_route_output().
Where it lives
The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.
net/ipv6/ip6mr.c
- What this is
- NETWORKING [IPv4/IPv6]MAINTAINERS section matched on net/ipv6/ip* · netdev@vger.kernel.org · Maintained
Check it on the machine
grep -wE 'CONFIG_IPV6|CONFIG_IPV6_MROUTE' /boot/config-$(uname -r)Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.
Show whether Debian builds this, per release
Debian builds this code. Every release below compiles the affected file into the kernels it ships.
- bookworm, trixie, forky, sidy
- y
- built into the kernel image on every flavour - only a patch removes it
- Build switches
- CONFIG_IPV6, CONFIG_IPV6_MROUTE
- Reads as
- all on means the file is compiled; any one off means it is not.
From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages
Signals
- Published
- 2026-09-17 (31 days ago)source
- CVSS
- 7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- local (AV:L)source
- EPSS
- 0.17%, higher than 5.8% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- not yet assignedsource
- Subsystem
- net/ipv6
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 5.3 | 6.18.57 | f57b0fd1c62e |
| 5.3 | 7.2.6 | 4a674afaae41 |
| 5.3 | 7.3 | 235b42b58601 |
Why the CNA scored it this way
Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source
- AV:LAttack vector, local
- The UAF is dst_clone(skb_dst(pkt)) in ip6mr_cache_report(MRT6MSG_WRONGMIF) on a NOREF dst that ip6_route_input() attached and ip6mr_cache_unresolved() queued past RCU. Completing it requires deleting that fib6 route and MRT6_ADD_MFC with mf6cc_parent != the arrival vif; those are local setsockopt/netlink from the same attacker, not a field in the IPv6 multicast datagram.
- AC:LAttack complexity, low
- The attacker owns every step: MRT6_INIT/ADD_MIF/ASSERT, inject a non-link-local IPv6 multicast skb so ip6_mr_input() misses the MFC and ip6mr_cache_unresolved() queues it, delete the fib6 route and wait an RCU grace period, then MRT6_ADD_MFC with the wrong parent so ip6_mr_forward() takes the WRONGMIF path.
- PR:LPrivileges required, low
- inet6_create() allows SOCK_RAW/IPPROTO_ICMPV6 only with ns_capable(CAP_NET_RAW); ip6_mroute_setsockopt() then lets that mroute socket (or ns_capable(CAP_NET_ADMIN)) run MRT6_ADD_MIF, MRT6_ASSERT, and MRT6_ADD_MFC. An unprivileged user obtains both capabilities in a user+net namespace via unshare -Urn.
- UI:NUser interaction, none
- The attacker opens the raw ICMPv6 mroute socket, adds MIFs, injects the multicast skb onto a veth, deletes the fib6 route, and installs the mismatched-parent MFC entirely with their own syscalls; no other user must mount a volume or otherwise interact.
- S:UScope, unchanged
- dst_clone()/dst_hold() touch the host kernel's struct dst_entry from the IPv6 fib looked up for the queued skb; the use-after-free stays in that networking authority and does not cross a VM, IOMMU, or other boundary.
- C:HConfidentiality impact, high
- After the fib6 route is freed, ip6mr_cache_report() still does dst_clone(skb_dst(pkt)) and dst_hold() reads __rcuref on the dangling dst_entry; that slab UAF can be reclaimed with attacker-controlled objects and used as an arbitrary kernel read.
- I:HIntegrity impact, high
- dst_hold() calls rcuref_get(&dst->__rcuref) on the freed dst_entry, writing a reclaimable slab object that can be sprayed to forge a refcount/control-flow hijack when the WRONGMIF report clones the stale dst.
- A:HAvailability impact, high
- ip6_mr_forward() invoking ip6mr_cache_report(MRT6MSG_WRONGMIF) oopses in dst_hold()/rcuref_get() on the already-freed dst_entry even without a full exploit, so the bug is a reliable kernel crash as well as a UAF.