TL;DR — last updated July 28, 2026, 12:00 UTC
Two CVE IDs now cover this vulnerability: CVE-2026-53362 (Frag Escape, the IPv6 path) and CVE-2026-53366 (Frag Gap, the IPv4 path). Both are CVSS 7.8 High. They are one accounting error in the kernel’s packet-append code, which hands an unprivileged local user an out-of-bounds kernel write, and a public proof-of-concept turns that into root on the host, including from inside an unprivileged container.
- Affected: CloudLinux 10 only. CL7, CL7h, CL8, CL9 and CloudLinux for Ubuntu 22.04 are not affected. → Affected versions
- Action: both fix paths are generally available. Take the AlmaLinux kernel update and reboot, or apply the KernelCare livepatch with no reboot. One fix closes both CVEs, so CloudLinux 10 servers patched since June 30 need no further action for the IPv4 companion.
- Mitigation: the interim mitigations are now only for hosts that cannot patch immediately. → Is there a mitigation?
- Fix status → Update instructions
- Stream 1 — AlmaLinux kernel (CL10): in the AlmaLinux 10 stable repository. kernel-6.12.0-211.28.2.el10_2 or newer.
- Stream 2 — KernelCare livepatch (CL10): in the main feed since June 30, 2026 (K20260630_04).
- Verify: uname -r against 6.12.0-211.28.2.el10_2 or newer, or kcarectl –patch-info. → How to verify you are patched
- Why it matters: on a shared host this is the difference between one hacked site and a compromised server. → Why this bug matters on a shared host
- How the bug works: the paged-allocation branch of the kernel’s packet-append path fails to account for carried-over fragment bytes. → Technical details of the bug
A public, working proof-of-concept named IPv6 Frag Escape (ipv6_frag_escape) turns an unprivileged local user, including one confined inside an unprivileged container, into root on the host. It exploits a bug in the Linux kernel’s packet-output path present in the 6.12 kernel line. On CloudLinux, only CloudLinux 10 is affected. CL7, CL7h, CL8, CL9 and CloudLinux for Ubuntu 22.04 are not.
We first published this advisory on July 1, 2026, when the vulnerability had no CVE assigned. Since then MITRE has assigned two IDs, an IPv4 companion has been identified, and both CloudLinux 10 fix paths have reached general availability. The IPv4 companion was already covered by the fix we shipped on June 30, so there is nothing extra to apply.
⚠ Not Dirty Frag, not Fragnesia
IPv6 Frag Escape is not Dirty Frag or Fragnesia, despite the similar name. It is a separate, unrelated bug in the kernel’s packet-output path (ip6_output / ip_output), not the XFRM/ESP path behind Dirty Frag and Fragnesia. The esp4 / esp6 / rxrpc module blacklist you may have applied for those (/etc/modprobe.d/dirtyfrag.conf) does not cover this vulnerability. Different subsystem, different fix.
On an affected CloudLinux 10 server, this is the difference between one hacked website and a compromised server. “Local” here does not mean an insider or a customer you trust. It means any process on the machine, including the PHP-FPM worker behind a compromised WordPress plugin or an outdated CMS. The attacker is whoever hacked one of the sites you host.
Prefer not to reboot for this?
The kernel fix for CloudLinux 10 arrives from AlmaLinux and requires a reboot. The KernelCare livepatch closes the same vulnerability on a running server with no reboot and no maintenance window, and it has been in the main feed since June 30. If reboots across your fleet are disruptive, this is the alternative we recommend. See Stream 2 for current status.
Affected CloudLinux versions
Both CVEs affect the Linux kernel from 6.0 onward. CloudLinux 10 is the only CloudLinux platform that ships an in-range kernel.
| Version | Affected | Status |
|---|---|---|
| CloudLinux 7 (CL7) Kernel 3.10 |
✅ No¹ | Nothing to apply |
| CloudLinux 7h (CL7h) Kernel 4.18 |
✅ No¹ | Nothing to apply |
| CloudLinux 8 (CL8) Kernel 4.18 |
✅ No¹ | Nothing to apply |
| CloudLinux 9 (CL9) Kernel 5.14 |
✅ No¹ | Nothing to apply |
| CloudLinux for Ubuntu 22.04 LTS Kernel 5.15 |
✅ No¹ ² | Nothing to apply |
| CloudLinux 10 (CL10) Kernel 6.12 |
❌ Yes | ✅ Kernel patch: available in stable ✅ Livepatch: available in the main feed |
¹ NVD lists both CVEs as affecting kernels from 6.0 up to the fixed stable builds. Every CloudLinux kernel other than CloudLinux 10’s sits below that floor: CL7 (3.10), CL7h and CL8 (4.18), CL9 (5.14), CloudLinux for Ubuntu 22.04 (5.15). None of them carry the MSG_SPLICE_PAGES UDP send path the public exploit uses. On those kernels the exploit’s send-side entry point returns -EINVAL, so the vulnerable arithmetic is never reached. CloudLinux 8 LTS and CloudLinux 9 LTS run the same 4.18 and 5.14 kernel lines and are likewise below the affected range.
² CloudLinux for Ubuntu 22.04 takes its kernel from Ubuntu (Canonical), not from a CloudLinux stream. The 5.15 GA kernel it ships is outside the affected range.
A KernelCare livepatch is available as a no-reboot alternative on CloudLinux 10.
Is there a mitigation?
Both fix paths are now generally available, so the mitigations below are no longer the recommended route. Use them only on a CloudLinux 10 host you cannot patch or livepatch immediately. They reduce exposure, but they do not replace the fix.
1. Enable init_on_alloc (the decisive mitigation; requires a reboot). EL10 kernels ship with allocator zero-on-allocation off, which is what makes the exploit’s page-reuse step reliable. Turning it on degrades the public technique to a crash rather than a root shell:
grubby --update-kernel=ALL --args="init_on_alloc=1"
reboot
init_on_alloc is usually a compile-time default, so it does not show on /proc/cmdline. Check the kernel config and the runtime view instead:
grep CONFIG_INIT_ON_ALLOC_DEFAULT_ON /boot/config-$(uname -r) # =y means on
cat /sys/module/page_alloc/parameters/init_on_alloc 2>/dev/null # 1 = on at runtime
Compatibility: init_on_alloc=1 carries a small allocator performance cost and requires a reboot to take effect. If you are rebooting anyway, install the patched kernel instead.
2. Disable unprivileged user namespaces (no reboot; removes the container-escape primitive). This blocks the container-to-host escape path that the public PoC relies on:
sudo sysctl -w user.max_user_namespaces=0
To make it persist across reboots:
echo 'user.max_user_namespaces = 0' | sudo tee /etc/sysctl.d/99-ipv6-frag-escape.conf
sudo sysctl --system
Compatibility: this breaks rootless Podman/Docker and unprivileged-user-namespace browser sandboxes. Apply it only on hosts where unprivileged user namespaces are not needed. It removes the container-escape primitive but leaves the underlying kernel bug reachable by a local process outside a container. Treat it as defense in depth while you deploy the livepatch or patched kernel.
Update instructions
Two delivery streams cover CloudLinux 10. Either one closes both CVEs.
Stream 1: AlmaLinux kernel (CL10)
Update: July 28, 2026, 12:00 UTC
The patched kernel is now in the AlmaLinux 10 stable repository, so a plain update pulls it:
- CloudLinux 10 / AlmaLinux 10: kernel-6.12.0-211.28.2.el10_2 or newer (the latest stable build as of July 22 was kernel-6.12.0-211.34.1.el10_2)
This kernel carries the fixes for both CVE-2026-53362 (IPv6) and CVE-2026-53366 (IPv4).
Status: June 30, 2026
The patched kernel is available in the AlmaLinux 10 testing repository:
- CloudLinux 10 / AlmaLinux 10: kernel-6.12.0-211.28.2.el10_2 or newer
Promotion to the production repositories is pending community verification. See the AlmaLinux advisory for upstream details.
CloudLinux 10 uses the AlmaLinux 10 kernel directly. Update the kernel and reboot:
dnf update 'kernel*'
reboot
uname -r
If you enabled the AlmaLinux testing repository earlier in this incident to get the kernel ahead of promotion, disable it again now that the build is in stable:
dnf config-manager --disable almalinux-testing
Stream 2: KernelCare livepatch (CL10)
Update: July 28, 2026, 12:00 UTC
The livepatch shipped on June 30 covers both CVE-2026-53362 (IPv6) and CVE-2026-53366 (IPv4). CloudLinux 10 servers that have already taken K20260630_04 are protected against both and need no further action.
Update: July 6, 2026, 12:15 UTC
The KernelCare livepatch for CloudLinux 10 (AlmaLinux 10, K20260630_04) is now on the main feed, live there since June 30, 12:00 UTC. KernelCare-subscribed CloudLinux 10 servers receive it automatically on the next kcarectl –update; the testing-feed step below is no longer required.
Status: June 30, 2026
KernelCare livepatches for the EL10 family are released to the testing feed:
- K20260630_04 — AlmaLinux 10 (the build that applies to CloudLinux 10)
Promotion to the main feed is pending validation. Customers who need the fix now can apply it from the testing feed.
KernelCare-subscribed servers receive the livepatch automatically on the next update cycle, or on demand:
kcarectl --update
Not using KernelCare yet? You can roll the fix out across your entire CloudLinux 10 fleet automatically, with no reboots. More information here.
How to verify you are patched
Stream 1 (kernel update).
After updating and rebooting:
uname -r
Any build at 6.12.0-211.28.2.el10_2 or newer carries both fixes.
Stream 2 (KernelCare).
Check for either CVE ID:
kcarectl --patch-info | grep -E 'CVE-2026-53362|CVE-2026-53366'
The livepatch was built on June 30, before either ID was assigned, so its metadata may not cite them. If the grep returns nothing, confirm by build time instead:
kcarectl --info | grep kpatch-build-time
Any build time on or after 2026-06-30 includes the fix.
⚠ Do not use kcarectl –info | grep CVE-… for verification. That form returns empty output even on correctly patched systems. Use kcarectl –patch-info for CVE-level status.
Why this bug matters on a shared host
On an unpatched CloudLinux 10 host the chain is short, and none of it needs special access:
- A web-tier compromise. An attacker exploits a vulnerable plugin or an outdated CMS, and now runs as an unprivileged process confined to a single site.
- Frag Escape or Frag Gap. From that restricted process, the attacker uses the kernel bug to become root. No prior root, no special capability, no admin action.
- Root on the host. They now run outside every tenant boundary and per-account limit. Every other tenant’s files, databases, credentials, and backups on that server are within reach, and in the worst case recovery means rebuilding the server.
On a patched host, or one running the KernelCare livepatch, step 2 fails: a web-tier compromise stays a web-tier compromise, one site to clean up rather than a whole server to rebuild. That is what the kernel update buys you.
Technical details of the bug
The bug is an accounting error in the kernel’s packet-append path. In __ip6_append_data() (net/ipv6/ip6_output.c), when the paged-allocation branch is taken, the kernel computes the allocation size without accounting for fraggap, the bytes carried over from the previous socket buffer. Those bytes are then copied into the new buffer’s linear area anyway. The linear area ends up undersized by fraggap bytes while the paged length is overstated by the same amount, so the copy runs past skb->end and corrupts the trailing skb_shared_info structure. An unprivileged process reaches this over a UDPv6 socket using MSG_MORE together with MSG_SPLICE_PAGES.
Two upstream commits explain why only recent kernels are exposed. The bad accounting arrived with 773ba4fe9104 (“ipv6: avoid partial copy for zc”). Before ce650a166335 (“udp6: Fix __ip6_append_data()‘s handling of MSG_SPLICE_PAGES”), the resulting negative copy length caused the kernel to return -EINVAL; that later commit allowed the MSG_SPLICE_PAGES case to proceed, which is what made the corruption triggerable.
The IPv4 companion. CVE-2026-53366 (Frag Gap) is the same arithmetic error in __ip_append_data() (net/ipv4/ip_output.c), where the carried-over fraggap bytes are copied into the new buffer’s linear area by skb_copy_and_csum_bits(). NVD’s entry documents the accounting error itself and does not describe a trigger sequence, and the public exploit chain targets the IPv6 path. Both are closed by the same correction: add fraggap to the allocation length and subtract it from the paged length.
From the overflow the public exploit builds a full chain. It corrupts a page-reference count into a use-after-free on a page the attacker still controls, reclaims that page as a kernel page table (a “Dirty-Pagetable” primitive), and from there gains arbitrary kernel read/write. That is enough to overwrite the calling process’s credentials to root, neutralize SELinux in memory, and hijack core_pattern to run a program as root in the host’s initial namespaces, which is how a process inside an unprivileged container ends up with an interactive root shell on the host.
The public PoC does exactly that on stock EL10 kernels. We reproduced it in-house on AlmaLinux 10.2 (6.12.0-211.7.3.el10_2): an unprivileged user obtained a genuine host root shell. Because CloudLinux 10 uses the same AlmaLinux 10 kernel and build configuration, it is affected on the same terms.
Both CVEs carry a CVSS 3.1 base score of 7.8 (High).
References
- NVD entry: CVE-2026-53362 (Frag Escape, IPv6)
- NVD entry: CVE-2026-53366 (Frag Gap, IPv4)
- Public PoC repository: sgkdev/ipv6_frag_escape
- Upstream fix (IPv6): commit 736b380e28d0
- AlmaLinux advisory: IPv6 Frag Escape
Comments