{"api_version":"1","generated_at":"2026-09-26T13:04:50+00:00","cve":"CVE-2026-90111","urls":{"html":"https://cve.report/CVE-2026-90111","api":"https://cve.report/api/cve/CVE-2026-90111.json","docs":"https://cve.report/api","cve_org":"https://www.cve.org/CVERecord?id=CVE-2026-90111","nvd":"https://nvd.nist.gov/vuln/detail/CVE-2026-90111"},"summary":{"title":"ip6mr: do not clone dst in ip6mr_cache_report()","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nip6mr: do not clone dst in ip6mr_cache_report()\n\nIPv6 input attaches a non-refcounted (NOREF) dst to skbs under RCU.\nWhen an ingress multicast packet misses MFC lookup,\nip6mr_cache_unresolved() places the skb onto the unresolved queue,\nescaping the receive-side RCU grace period.\n\nIf the underlying route is deleted and freed, and the MFC queue is later\nresolved with a wrong parent interface, ip6_mr_forward() invokes\nip6mr_cache_report(..., MRT6MSG_WRONGMIF), which executes\ndst_clone(skb_dst(pkt)) on the freed dst entry, triggering a slab\nuse-after-free.\n\nReport packets queued to mroute6_sk (a raw socket) and netlink\nnotifications do not require an attached dst entry.\n\nFix this by:\n1. Removing dst_clone() in ip6mr_cache_report() and ensuring report skbs\n   do not hold a dst.\n2. Dropping skb_dst before queuing unresolved skbs in\n   ip6mr_cache_unresolved(), matching the fact that multicast\n   forwarding resolves outgoing routes anew via ip6_route_output().","state":"PUBLISHED","assigner":"Linux","published_at":"2026-09-17 17:17:03","updated_at":"2026-09-18 18:17:42"},"problem_types":[],"metrics":[{"version":"3.1","source":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","type":"Secondary","score":"7.8","severity":"HIGH","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","data":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH","attackVector":"LOCAL","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"HIGH"}},{"version":"3.1","source":"CNA","type":"DECLARED","score":"7.8","severity":"HIGH","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","data":{"baseScore":7.8,"baseSeverity":"HIGH","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","version":"3.1"}}],"references":[{"url":"https://git.kernel.org/stable/c/235b42b5860189eb8c27c36435ad932cae65a734","name":"https://git.kernel.org/stable/c/235b42b5860189eb8c27c36435ad932cae65a734","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/4a674afaae4136c71943aa3e35d433676fd40e8f","name":"https://git.kernel.org/stable/c/4a674afaae4136c71943aa3e35d433676fd40e8f","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-90111","name":"CVE Program record","refsource":"CVE.ORG","tags":["canonical"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-90111","name":"NVD vulnerability detail","refsource":"NVD","tags":["canonical","analysis"]}],"affected":[{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 67f415dd29063a5906c560051c00e42dcf01a4dd 4a674afaae4136c71943aa3e35d433676fd40e8f git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 67f415dd29063a5906c560051c00e42dcf01a4dd 235b42b5860189eb8c27c36435ad932cae65a734 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 5.3","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 5.3 semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.2.6 7.2.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.3-rc1 * original_commit_for_fix","platforms":[]}],"timeline":[],"solutions":[],"workarounds":[],"exploits":[],"credits":[],"nvd_cpes":[],"vendor_comments":[],"enrichments":{"kev":null,"epss":{"cve_year":"2026","cve_id":"90111","cve":"CVE-2026-90111","epss":"0.001540000","percentile":"0.048950000","score_date":"2026-09-21","updated_at":"2026-09-22 00:03:19"},"legacy_qids":[]},"source_records":{"cve_program":{"containers":{"cna":{"affected":[{"defaultStatus":"unaffected","product":"Linux","programFiles":["net/ipv6/ip6mr.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"lessThan":"4a674afaae4136c71943aa3e35d433676fd40e8f","status":"affected","version":"67f415dd29063a5906c560051c00e42dcf01a4dd","versionType":"git"},{"lessThan":"235b42b5860189eb8c27c36435ad932cae65a734","status":"affected","version":"67f415dd29063a5906c560051c00e42dcf01a4dd","versionType":"git"}]},{"defaultStatus":"affected","product":"Linux","programFiles":["net/ipv6/ip6mr.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"status":"affected","version":"5.3"},{"lessThan":"5.3","status":"unaffected","version":"0","versionType":"semver"},{"lessThanOrEqual":"7.2.*","status":"unaffected","version":"7.2.6","versionType":"semver"},{"lessThanOrEqual":"*","status":"unaffected","version":"7.3-rc1","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"cpeMatch":[{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.2.6","versionStartIncluding":"5.3","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.3-rc1","versionStartIncluding":"5.3","vulnerable":true}],"negate":false,"operator":"OR"}]}],"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nip6mr: do not clone dst in ip6mr_cache_report()\n\nIPv6 input attaches a non-refcounted (NOREF) dst to skbs under RCU.\nWhen an ingress multicast packet misses MFC lookup,\nip6mr_cache_unresolved() places the skb onto the unresolved queue,\nescaping the receive-side RCU grace period.\n\nIf the underlying route is deleted and freed, and the MFC queue is later\nresolved with a wrong parent interface, ip6_mr_forward() invokes\nip6mr_cache_report(..., MRT6MSG_WRONGMIF), which executes\ndst_clone(skb_dst(pkt)) on the freed dst entry, triggering a slab\nuse-after-free.\n\nReport packets queued to mroute6_sk (a raw socket) and netlink\nnotifications do not require an attached dst entry.\n\nFix this by:\n1. Removing dst_clone() in ip6mr_cache_report() and ensuring report skbs\n   do not hold a dst.\n2. Dropping skb_dst before queuing unresolved skbs in\n   ip6mr_cache_unresolved(), matching the fact that multicast\n   forwarding resolves outgoing routes anew via ip6_route_output()."}],"metrics":[{"cvssV3_1":{"baseScore":7.8,"baseSeverity":"HIGH","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","version":"3.1"},"scenarios":[{"lang":"en","value":"AV:L - 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.\nAC:L - 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.\nPR:L - 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.\nUI:N - 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.\nS:U - 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.\nC:H - 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.\nI:H - 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.\nA:H - 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."}]}],"providerMetadata":{"dateUpdated":"2026-09-18T17:53:06.232Z","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux"},"references":[{"url":"https://git.kernel.org/stable/c/4a674afaae4136c71943aa3e35d433676fd40e8f"},{"url":"https://git.kernel.org/stable/c/235b42b5860189eb8c27c36435ad932cae65a734"}],"title":"ip6mr: do not clone dst in ip6mr_cache_report()","x_generator":{"engine":"bippy-1.2.0"}}},"cveMetadata":{"assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","assignerShortName":"Linux","cveId":"CVE-2026-90111","datePublished":"2026-09-17T16:06:18.779Z","dateReserved":"2026-09-11T19:38:34.787Z","dateUpdated":"2026-09-18T17:53:06.232Z","state":"PUBLISHED"},"dataType":"CVE_RECORD","dataVersion":"5.2"},"nvd":{"publishedDate":"2026-09-17 17:17:03","lastModifiedDate":"2026-09-18 18:17:42","problem_types":[],"metrics":{"cvssMetricV31":[{"source":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","type":"Secondary","cvssData":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH","attackVector":"LOCAL","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"HIGH"},"exploitabilityScore":1.8,"impactScore":5.9}]},"configurations":[]},"legacy_mitre":{"record":{"CveYear":"2026","CveId":"90111","Ordinal":"1","Title":"ip6mr: do not clone dst in ip6mr_cache_report()","CVE":"CVE-2026-90111","Year":"2026"},"notes":[{"CveYear":"2026","CveId":"90111","Ordinal":"1","NoteData":"In the Linux kernel, the following vulnerability has been resolved:\n\nip6mr: do not clone dst in ip6mr_cache_report()\n\nIPv6 input attaches a non-refcounted (NOREF) dst to skbs under RCU.\nWhen an ingress multicast packet misses MFC lookup,\nip6mr_cache_unresolved() places the skb onto the unresolved queue,\nescaping the receive-side RCU grace period.\n\nIf the underlying route is deleted and freed, and the MFC queue is later\nresolved with a wrong parent interface, ip6_mr_forward() invokes\nip6mr_cache_report(..., MRT6MSG_WRONGMIF), which executes\ndst_clone(skb_dst(pkt)) on the freed dst entry, triggering a slab\nuse-after-free.\n\nReport packets queued to mroute6_sk (a raw socket) and netlink\nnotifications do not require an attached dst entry.\n\nFix this by:\n1. Removing dst_clone() in ip6mr_cache_report() and ensuring report skbs\n   do not hold a dst.\n2. Dropping skb_dst before queuing unresolved skbs in\n   ip6mr_cache_unresolved(), matching the fact that multicast\n   forwarding resolves outgoing routes anew via ip6_route_output().","Type":"Description","Title":"ip6mr: do not clone dst in ip6mr_cache_report()"}]}}}