19 Public Root Exploits in Two Days. Seven Have No Fix on a Longterm Kernel.

exploit-maturityreachabilitylongterm kernelslinux-kernel

On the morning of October 22, 2026, Google merged thirteen new exploit write-ups into the kernelCTF section of its security-research repository. The next morning it merged six more. kernelCTF is Google’s bounty programme for Linux kernel privilege escalation: a submission only lands there after it has taken a hardened Google Container-Optimized OS or mitigation instance from an unprivileged process to root. Every one of the nineteen ships with a working exploit and a write-up of what it needs.

Seventeen of the nineteen CVEs had no kernelCTF exploit before those two mornings; the other two already carried one from an earlier kernelCTF entry. KernelScan has picked up both batches, and all nineteen are flagged Weaponized on every product that tracks them. Two of the entries are for 2023 CVEs — a reminder that the public exploit can arrive years after the fix. The more pressing finding is a different one: for seven of these CVEs, at least one still-maintained longterm kernel has no fix in any release.

The nineteen

CVESubsystemBugWhat the exploit needsCVSSLongterm fix
CVE-2026-23272nf_tables setsUAF (RCU)user namespace, NF_TABLES7.8none on 5.10, 5.15
CVE-2026-31419bonding broadcastdouble freeuser namespace, BONDING7.8none on 5.10, 5.15
CVE-2026-23231nf_tables chain creationUAF (RCU)user namespace, NF_TABLES_INET7.8none on 5.10, 5.15
CVE-2026-23392nf_tables flowtablesUAF (RCU)user namespace, NF_FLOW_TABLE_INET, NETFILTER_INGRESS7.8none on 5.10; 5.15 queued
CVE-2026-23278nf_tables catch-all elementsUAFuser namespace, NF_TABLES7.8none on 5.15
CVE-2025-38248bridge multicastUAFuser namespace, BRIDGE_IGMP_SNOOPING7.8none on 5.15; 6.1 queued
CVE-2024-26583kernel TLSUAF (race)no namespace; TLS + async crypto4.7none on 5.10
CVE-2025-40214AF_UNIX garbage collectorUAFnothing but CONFIG_UNIX7.8all fixed
CVE-2026-43501IPv6 RPL routing headerout-of-bounds writeuser namespace, IPV69.8all fixed
CVE-2026-31418ipset hash setsout-of-bounds writeuser namespace, IP_SET hash types5.5all fixed
CVE-2026-23274xt_IDLETIMERuninitialised timeruser namespace, NETFILTER_XT_TARGET_IDLETIMER7.8all fixed
CVE-2026-23111nf_tables catch-allUAFuser namespace, NF_TABLES7.8all fixed
CVE-2026-23209macvlanUAFuser namespace, MACVLAN, PACKET7.8all fixed
CVE-2026-23273macvlan (follow-up)UAFuser namespace, MACVLAN7.8all fixed
CVE-2026-23074tc teql qdiscUAFuser namespace, NET_SCH_TEQL7.8all fixed
CVE-2025-38177tc HFSC/QFQ/netemUAFuser namespace, three qdisc modules5.5all fixed
CVE-2025-21702tc pfifo_head_dropUAFuser namespace, NET_SCHED7.0all fixed
CVE-2023-3610nf_tables bound chainsUAFuser namespace, NF_TABLES7.8all fixed
CVE-2023-31248nf_tables chain lookupUAFuser namespace, NF_TABLES7.8all fixed

“Longterm fix” covers the kernel.org longterm lines that carry the vulnerable code: 5.10, 5.15, 6.1, 6.6 and 6.12. “Queued” means the backport is in the stable maintainers’ queue for the next release of that branch, but no release carries it yet. CVSS is the score shown on NVD: NVD’s own where it has scored the CVE, otherwise the kernel CNA’s. Status at analysis time, October 24, 2026, checked against the kernel CNA’s records, the current releases 5.10.272, 5.15.223 and 6.1.190, and the stable queue.

Seven with no longterm fix

The usual advice for a public kernel exploit is “update to the latest stable release of your branch.” For these seven, on these branches, there is no release to update to. We confirmed each gap the same way: the fix’s commit is absent from the branch, and the vulnerable code is still in its newest release.

5.105.10.2725.155.15.2236.16.1.1906.66.6.1606.126.12.114CVE-2026-23272nf_tables setsCVE-2026-23272 on 5.10: no fix in 5.10.272no fixCVE-2026-23272 on 5.15: no fix in 5.15.223no fixCVE-2026-23272 on 6.1: fixed in 6.1.1776.1.177CVE-2026-23272 on 6.6: fixed in 6.6.1416.6.141CVE-2026-23272 on 6.12: fixed in 6.12.916.12.91CVE-2026-31419bondingCVE-2026-31419 on 5.10: no fix in 5.10.272no fixCVE-2026-31419 on 5.15: no fix in 5.15.223no fixCVE-2026-31419 on 6.1: fixed in 6.1.1846.1.184CVE-2026-31419 on 6.6: fixed in 6.6.1436.6.143CVE-2026-31419 on 6.12: fixed in 6.12.956.12.95CVE-2026-23231nf_tables chainsCVE-2026-23231 on 5.10: no fix in 5.10.272no fixCVE-2026-23231 on 5.15: no fix in 5.15.223no fixCVE-2026-23231 on 6.1: fixed in 6.1.1656.1.165CVE-2026-23231 on 6.6: fixed in 6.6.1286.6.128CVE-2026-23231 on 6.12: fixed in 6.12.756.12.75CVE-2026-23392nf_tables flowtablesCVE-2026-23392 on 5.10: no fix in 5.10.272no fixCVE-2026-23392 on 5.15: fix queued for the next release, not in 5.15.223queuedCVE-2026-23392 on 6.1: fixed in 6.1.1676.1.167CVE-2026-23392 on 6.6: fixed in 6.6.1306.6.130CVE-2026-23392 on 6.12: fixed in 6.12.786.12.78CVE-2026-23278nf_tables catch-allCVE-2026-23278 on 5.10: the vulnerable code is not in this branchnot affectedCVE-2026-23278 on 5.15: no fix in 5.15.223no fixCVE-2026-23278 on 6.1: fixed in 6.1.1776.1.177CVE-2026-23278 on 6.6: fixed in 6.6.1446.6.144CVE-2026-23278 on 6.12: fixed in 6.12.786.12.78CVE-2025-38248bridge multicastCVE-2025-38248 on 5.10: the vulnerable code is not in this branchnot affectedCVE-2025-38248 on 5.15: no fix in 5.15.223no fixCVE-2025-38248 on 6.1: fix queued for the next release, not in 6.1.190queuedCVE-2025-38248 on 6.6: fixed in 6.6.1226.6.122CVE-2025-38248 on 6.12: fixed in 6.12.676.12.67CVE-2024-26583kernel TLSCVE-2024-26583 on 5.10: no fix in 5.10.272no fixCVE-2024-26583 on 5.15: fixed in 5.15.1605.15.160CVE-2024-26583 on 6.1: fixed in 6.1.796.1.79CVE-2024-26583 on 6.6: fixed in 6.6.186.6.18CVE-2024-26583 on 6.12: the vulnerable code is not in this branchnot affectedno fix in any releasefix queuedfixed innot affected
Status on October 24, 2026. A version is the first release with the fix; “queued” means it is in the stable queue but in no release yet.

Three nf_tables bugs, one mistake

Three of the seven fail the same way: an error path takes an object out of service and frees it at once, while a packet or reader that picked it up a moment earlier is still using it.

the fixwaits hereuntil every readerhas finishedERROR PATHgoes livehooked or linkednext step failse.g. a limitremovedunhookedfreed at onceno grace periodPACKET OR READERpicks up a pointeruse-after-freetime
CVE-2026-23231 and CVE-2026-23392 are fixed by adding that wait (synchronize_rcu()); CVE-2026-23272’s fix stops freeing the element in place.
  • CVE-2026-23272: a set element, freed when the set turns out to be full. The pattern dates from Linux 4.10 (2017). CIP’s own tracking shows fixes only for its 6.1 and 6.12 trees.
  • CVE-2026-23231: a chain. The exploit fills the IPv6 hook table to its limit of 1,024, so an inet chain’s IPv4 hook goes live and its IPv6 hook fails.
  • CVE-2026-23392: a flowtable, freed when a duplicate-device check fails after its hooks are live.

The fourth nf_tables gap, CVE-2026-23278, is a stray break. When a batch deletes a map and adds to it, the map briefly holds two catch-all elements, the helpers handle only the first, and a chain is freed while still in use. It reached 5.15 through a stable backport in 5.15.121. 5.10 has no catch-all elements, so neither this bug nor CVE-2026-23111 applies there, although the CNA record lists 5.10 as affected.

CVE-2026-31419 — bonding

A bond in broadcast mode gives the original packet to the “last” slave and clones it for the rest. Adding or removing a slave mid-loop changes which one is last, and the packet is freed twice. The bug reached 5.10.94 and 5.15.17 in January 2022 through a stable backport. The mainline fix relies on a slave count the older code never computes, so a backport needs adapting.

CVE-2025-38248 — bridge multicast

Deleting a port can leave it on the bridge’s list of multicast-router ports, and the next walk over the list uses freed memory. The variant the exploit uses arrived in 5.15.186 and 6.1.142 with a stable backport on June 27, 2025; a sibling variant has been in both branches since 5.15. IGMP/MLD snooping with VLAN filtering (CONFIG_BRIDGE_IGMP_SNOOPING) is what many switches and gateways ship. The 6.1 fix was queued on October 18; nothing is queued for 5.15.

CVE-2024-26583 — kernel TLS

With asynchronous decryption, the crypto callback wakes the waiting thread before it drops a lock in the socket context. If the socket is freed in that gap, the unlock writes into reused memory. 5.15 got the fix in 5.15.160 (May 2024). 5.10.272 still calls complete() before spin_unlock_bh() in tls_decrypt_done(). It is the only gap that needs no user namespace.

Until a stable fix appears, carry the mainline fix in your own tree, compile the feature out, or close the unprivileged path to it (next section). For CVE-2024-26583 only the configuration helps: it needs CONFIG_TLS plus cryptd or pcrypt, and on x86 the AES-NI drivers select cryptd, so almost any x86 kernel with CONFIG_TLS qualifies.

Seventeen of the nineteen share one front door

Seventeen exploits get CAP_NET_ADMIN the same way: an unprivileged process creates a user namespace and, inside it, a network namespace of its own, where it can configure nf_tables, qdiscs, bridges, bonds and macvlan devices. The host does not need to use any of these features. The code only has to be built in or loadable.

ALL 19 EXPLOITS19workuser namespaces allowedCVE-2025-40214: worksCVE-2024-26583: worksCVE-2026-23272: worksCVE-2026-31419: worksCVE-2026-23231: worksCVE-2026-23392: worksCVE-2026-23278: worksCVE-2025-38248: worksCVE-2026-43501: worksCVE-2026-31418: worksCVE-2026-23274: worksCVE-2026-23111: worksCVE-2026-23209: worksCVE-2026-23273: worksCVE-2026-23074: worksCVE-2025-38177: worksCVE-2025-21702: worksCVE-2023-3610: worksCVE-2023-31248: works2still workunprivileged userns offCVE-2025-40214: worksCVE-2024-26583: worksCVE-2026-23272: blocked, needs an unprivileged user namespaceCVE-2026-31419: blocked, needs an unprivileged user namespaceCVE-2026-23231: blocked, needs an unprivileged user namespaceCVE-2026-23392: blocked, needs an unprivileged user namespaceCVE-2026-23278: blocked, needs an unprivileged user namespaceCVE-2025-38248: blocked, needs an unprivileged user namespaceCVE-2026-43501: blocked, needs an unprivileged user namespaceCVE-2026-31418: blocked, needs an unprivileged user namespaceCVE-2026-23274: blocked, needs an unprivileged user namespaceCVE-2026-23111: blocked, needs an unprivileged user namespaceCVE-2026-23209: blocked, needs an unprivileged user namespaceCVE-2026-23273: blocked, needs an unprivileged user namespaceCVE-2026-23074: blocked, needs an unprivileged user namespaceCVE-2025-38177: blocked, needs an unprivileged user namespaceCVE-2025-21702: blocked, needs an unprivileged user namespaceCVE-2023-3610: blocked, needs an unprivileged user namespaceCVE-2023-31248: blocked, needs an unprivileged user namespaceCVE-2025-40214 · CVE-2024-26583: need only a local shellTHE 7 LONGTERM GAPS7openuser namespaces allowedCVE-2024-26583: worksCVE-2026-23272: worksCVE-2026-31419: worksCVE-2026-23231: worksCVE-2026-23392: worksCVE-2026-23278: worksCVE-2025-38248: works1still openunprivileged userns offCVE-2024-26583: worksCVE-2026-23272: blocked, needs an unprivileged user namespaceCVE-2026-31419: blocked, needs an unprivileged user namespaceCVE-2026-23231: blocked, needs an unprivileged user namespaceCVE-2026-23392: blocked, needs an unprivileged user namespaceCVE-2026-23278: blocked, needs an unprivileged user namespaceCVE-2025-38248: blocked, needs an unprivileged user namespaceCVE-2024-26583 on 5.10: only the kernel config can close it
Each square is one exploit. Crossed out = blocked when unprivileged user namespaces are off.

Ways to switch it off: user.max_user_namespaces=0, Debian’s kernel.unprivileged_userns_clone=0, Ubuntu’s AppArmor restriction on unprivileged user namespaces, or building without CONFIG_USER_NS.

The two that still work need only a local shell. CVE-2025-40214, in the AF_UNIX garbage collector, needs nothing but CONFIG_UNIX. It reached 6.1.141 and 6.6.93 through a stable backport and is fixed in 6.1.159, 6.6.117 and 6.12.59. The other is kernel TLS, above.

It is not a complete answer. Any process that already holds CAP_NET_ADMIN (a container started with it, a networking daemon, a management agent) reaches the bugs without a namespace. And browsers, container runtimes and sandboxes rely on user namespaces, so a general-purpose host often can’t turn them off. On a sealed appliance that runs no untrusted local code, the trade-off looks very different.

The scores point both ways

  • CVE-2026-31418 and CVE-2025-38177 are scored 5.5 by NVD, as local denial of service with no confidentiality or integrity impact. The kernelCTF entries describe an out-of-bounds write in the ipset hash code and a use-after-free in the HFSC/QFQ qdiscs, and both exploits turn them into root on a hardened instance. A queue sorted by CVSS puts them behind every High.
  • CVE-2024-26583 gets two opposite scores. The kernel CNA rates it 9.8, network-reachable with no privileges. NVD’s own analysts rate it 4.7, a local denial of service. The published exploit sits between the two: it is local, needing a shell on the box to open TLS sockets and race their teardown, and it gets root. It is serious because it needs no namespace and is unfixed on 5.10, not for the reason either vector suggests.
  • CVE-2026-43501 is scored 9.8 by the kernel CNA, as a remote bug with no privileges. The code is in the IPv6 receive path, but it only handles RPL source-routing headers when net.ipv6.conf.all.rpl_seg_enabled and the interface’s own setting are both 1. Both default to 0. The published exploit turns them on inside its own network namespace, so in practice it is one more user-namespace exploit. A remote attacker can only reach the bug on hosts where someone switched RPL processing on, such as 6LoWPAN mesh routers. It is fixed on every longterm line.

None of these numbers is useless. Each describes the bug in the abstract. What decides your priority is whether the code is in your build and who can reach it.

Triage by product type

  • Multi-tenant hosts, CI runners, shared build machines: unprivileged user namespaces are usually on. All nineteen are in play wherever the code is unpatched. Treat the seven unfixed longterm cases as backport work now.
  • Container hosts: check which workloads run with CAP_NET_ADMIN. They reach the seventeen namespace-gated bugs directly, whatever the host’s user-namespace setting.
  • Switches, gateways and routers on 5.15 or 6.1: CVE-2025-38248 is the one to check first: multicast snooping is common on these devices, and there is no stable fix yet (6.1 is queued, 5.15 is not). The attacker still needs local code execution plus a way to CAP_NET_ADMIN.
  • Embedded and industrial devices on 5.10 or 5.15: these branches carry most of the gaps — five on 5.10, six on 5.15. If nf_tables is built in, look at the nf_tables group first; then bonding, and kernel TLS on 5.10. If your product can switch off unprivileged user namespaces, that closes every gap on these branches except kernel TLS on 5.10.
  • Sealed appliances with no untrusted local code: all nineteen are local privilege escalations as published. They matter as the second stage after another bug gives an attacker code execution — which is exactly how real attack chains are built, so “local” is not the same as “ignore”.

Keep the urgency honest. kernelCTF exploits are tuned to specific kernel builds, and there is no report of any of these nineteen being used in the wild. Weaponized means public, working, bounty-verified code exists — it raises the priority for products that actually run the affected code. It is not a claim that anyone has been compromised.

How KernelScan helps

Upload your kernel .config and KernelScan answers the question per CVE: is the code in your build, is it reachable, and is your branch’s release already carrying the fix? For the nineteen here that means the Weaponized badge on the ones you are exposed to, a Not affected verdict with the reason — for example CONFIG_BONDING not set — for the ones you aren’t, and the same verdicts in the CycloneDX VEX we push to Dependency-Track. Our earlier post on exploit maturity explains where the Weaponized signal comes from.