FR
live
Linux Critical CVSS 7.8

A length miscalculation in Linux IPv6 fragmentation enables container escape

Red Hat has published a bulletin for CVE-2026-53362, an out-of-bounds write in the Linux kernel’s IPv6 fragmentation path that lets a local user escape a container and bypass SELinux. Apply the patched kernel, or disable unprivileged user namespaces in the meantime.

A honeycomb of grey hexagonal tiles with a single tile cracked and pushed out of alignment, its edge amber.

CVE-2026-53362. RHEL 10. CVSS 7.8. On 14 September 2026, Red Hat published a security bulletin for a flaw nicknamed ipv6_frag_escape: an incorrect length calculation in the Linux kernel’s IPv6 fragmentation path produces an out-of-bounds write that lets a local user, from inside a container, escape to the host and bypass SELinux to gain root. Why it matters: this is exactly the class of bug that turns a single compromised pod into a full node takeover.

What the flaw actually does

The vulnerability sits in __ip6_append_data(), the function that assembles outbound IPv6 fragments. When the paged-allocation branch is taken — which happens with MSG_MORE, a NIC advertising NETIF_F_SG, or a large fragment — the kernel computes two lengths: alloclen = fragheaderlen + transhdrlen and pagedlen = datalen - transhdrlen.

The bug is a precise omission: on this paged path, the fragmentation gap (fraggap) is not accounted for in alloclen. The kernel therefore under-allocates the buffer, then writes past its bounds, straight into skb_shared_info, the structure that follows every packet in memory.

The consequence is far from cosmetic. An out-of-bounds write into skb_shared_info can be chained into arbitrary kernel read and write: the attacker overwrites their own credentials, sidesteps SELinux — whose security label travels with the socket — and elevates to root on the host. The CWE-130 classification (Improper Handling of Length Parameter Inconsistency) describes exactly this mechanism.

The exploitation chain

To reach the vulnerable code, an attacker needs two things: the ability to create UDPv6 sockets, and the ability to create network namespaces. The second is the decisive one.

On RHEL 10, the default configuration grants unprivileged users the ability to create user namespaces. A user namespace is enough to create a network namespace — the very mechanism that Podman in rootless mode and most application sandboxes rely on every day. The upshot: a process locked inside a container can assemble the network stack needed for exploitation without any initial root privilege.

The trigger itself goes through a UDPv6 socket driven with the MSG_MORE and MSG_SPLICE_PAGES flags, as the public analysis documents. The combination of the two forces the kernel onto the vulnerable paged branch, where the fraggap is not accounted for. The upstream fix, commit 736b380e28d0 titled “ipv6: account for fraggap on the paged allocation path”, adds precisely that missing accounting.

Why RHEL 10 is the textbook case

Red Hat’s RHSB-2026-009 bulletin names Red Hat Enterprise Linux 10 as the directly affected product, with fixes already released for all affected versions. OpenShift Container Platform is not affected: it runs on RHEL 9, whose kernel does not expose the same path.

The fact that a single major product is affected should not be over-reassuring. Any layered product that consumes the RHEL 10 kernel — base images, appliances, derived distributions — inherits the flaw without its name appearing in the bulletin. Red Hat’s guidance is unambiguous: keep the underlying kernel current, whatever the layered product.

This flaw is distinct from the “Dirty Frag” vulnerabilities covered in RHSB-2026-003CVE-2026-43284 (IPsec ESP) and CVE-2026-46300 (XFRM ESP-in-TCP) — which affect different subsystems of the same kernel. Three fragmentation flaws in a single quarter point to a corner of the kernel that has become a favourite hunting ground for researchers and attackers alike.

The mitigation, and what it breaks

Pending the patched kernel, Red Hat offers an interim mitigation: disable unprivileged user namespaces via sysctl.

bash
sudo sysctl -w user.max_user_namespaces=0
echo 'user.max_user_namespaces = 0' | sudo tee /etc/sysctl.d/99-disable-userns.conf

To roll back:

bash
sudo rm /etc/sysctl.d/99-disable-userns.conf
sudo sysctl -w user.max_user_namespaces=65534

This shrinks the attack surface, but it does not fix the underlying bug. And it has a real cost: it breaks Podman in rootless mode, along with application sandboxes that depend on unprivileged user namespaces. It is a decision an operator must make deliberately: on a host that runs only rootless containers, the mitigation is worse than the flaw; on a host that runs none, it is free.

Verdict

CVE-2026-53362 is the kind of flaw a CISO or SRE should address before a public exploit circulates: the out-of-bounds write is documented, the fix is identified, and the class — container-to-host escape — is the one that does the most damage in a multi-tenant environment.

If you run RHEL 10, apply the patched kernel as soon as it reaches your repositories; that is the only real fix. If you run rootless containers with Podman, do not disable user namespaces blindly — prioritise the kernel update instead. If you run non-containerised workloads on RHEL 10 hosts, the user.max_user_namespaces=0 mitigation is a reasonable stopgap while the patch propagates. In every case, audit your network namespaces: they decide whether a local attacker can reach the vulnerable path at all.

References

cve

Linked vulnerabilities

CVE-2026-53362In the Linux kernel, the following vulnerability has been resolved: ipv6: account for fraggap on the paged allocation path In __ip6_append_data(), when the paged-allocation branch is taken (MSG_MORE / NETIF_F_SG / large fraglen), alloclen and pagedlen are computed as alloclen = fragheaderlen + transhdrlen; pagedlen = datalen - transhdrlen; datalen already includes fraggap (datalen = length + fraggap). When fraggap is non-zero, this is not the first skb and transhdrlen is zero. The fraggap bytes carried over from the previous skb are copied just past the fragment headers in the new skb's linear area. The linear area is therefore undersized by fraggap bytes while pagedlen is overstated by the same amount, and the copy writes past skb->end into the trailing skb_shared_info. An unprivileged user can trigger this via a UDPv6 socket using MSG_MORE together with MSG_SPLICE_PAGES. The bad accounting was introduced by commit 773ba4fe9104 ("ipv6: avoid partial copy for zc"). Before commit ce650a166335 ("udp6: Fix __ip6_append_data()'s handling of MSG_SPLICE_PAGES"), the negative copy value caused -EINVAL to be returned. That later commit allowed MSG_SPLICE_PAGES to proceed in this case, making the corruption triggerable. The non-paged branch sets alloclen to fraglen, which already accounts for fraggap because datalen does. Bring the paged branch in line by adding fraggap to alloclen and subtracting it from pagedlen. After this adjustment, copy no longer collapses to -fraggap on the paged path, so remove the stale comment describing that old arithmetic. Since a negative copy is no longer expected for a valid MSG_SPLICE_PAGES case, remove the MSG_SPLICE_PAGES exception from the negative copy check.Linux Kernel Critical CVSS 7.8 27/08

The cyber brief, every Tuesday

The flaws that matter and the patches to apply, in a ten-minute read.

No spam. One-click unsubscribe.
read next

On the same topic

GNU Coreutils 9.12 speeds up cut and uniq and fixes a recursive traversal race

GNU Coreutils 9.12, released on September 14, 2026, delivers measurable wins — cut up to 4× faster, uniq up to 2.5× — and fixes a race that made -R commands fail against files deleted in parallel. A maintenance release that reminds us the GNU toolkit remains, against its Rust rewrite, the default foundation of every distribution.

GhostLock turns a fifteen-year-old rtmutex use-after-free into root in five seconds

CVE-2026-43499, dubbed GhostLock, is a use-after-free in rtmutex priority-inheritance code that has shipped since kernel 2.6.39 and is reachable by any unprivileged local process. The fix landed in 7.1, but two months after the public PoC, blind spots like RHEL 9 kernel-rt remain: check your version and block PI futexes in the meantime.

← Back to the feed

Type at least two characters.

navigate open esc dismiss