A crooked customs stamp that lets stowaways rewrite the ship's manifest after it has already been approved
CVE-2026-99999, dubbed PwnEscape, is an out-of-bounds write (CWE-787) in the Linux kernel's IPv4 checksum completion path (skb_checksum_help() and ip_do_fragment()) present since kernel 2.6.27 (October 2008). When the kernel processes a network packet, it defers checksum computation and trusts metadata fields (csum_start, csum_offset) that indicate where to write the result. An attacker inside a KVM/QEMU guest — or any local user with access to TUN/TAP or AF_PACKET with PACKET_VNET_HDR — can set csum_start to point *inside* the already-validated IPv4 header. When skb_checksum_help() fires, it writes two attacker-controlled bytes into that header post-validation. The corrupted IHL field expands the perceived header from 20 to up to 60 bytes, leaking up to 40 bytes of host kernel heap per fragment. The original researcher demonstrated host root code execution in a lab environment. All kernels from 2.6.27 through 7.2.10 are affected; fixed stable versions are 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.57, and 7.2.11. Distro backports: RHEL/AlmaLinux 8 kernel-4.18.0-553.174.2.el8_10, RHEL/AlmaLinux 9 kernel-5.14.0-687.57.2.el9_8, Debian bookworm 6.1.190-1, Debian trixie 6.12.113-1.
The NVD's CRITICAL 9.3 rating (AV:L/AC:L/PR:N/UI:N/S:C) is directionally correct but slightly overstates privilege requirements — Red Hat scores it 8.8 HIGH with PR:L, arguing that code execution inside a guest VM constitutes low privileges rather than none. We agree with the PR:L correction on the CVSS vector, but the severity bucket remains CRITICAL because the primary attack path — guest-to-host VM escape — is the *exact* threat model hypervisors exist to prevent. The bug lives in the kernel that *is* the hypervisor. The blast radius of a successful exploit is every VM on the host, and in multi-tenant cloud environments, cross-tenant compromise. The 0.211% EPSS score reflects the absence of a public full-chain exploit *today*, but the confirmed 2-byte controlled write plus heap info-leak primitive makes weaponization an engineering effort, not a research breakthrough. The kernel maintainers, Red Hat, and the original researcher all treat this as exploitable to code execution. Cloud providers and shared-hosting operators should treat this as a trust-boundary-shattering flaw.
5 steps from start to impact.
Attain code execution inside a guest VM
IFF_VNET_HDR or AF_PACKET with PACKET_VNET_HDR if unprivileged user namespaces are enabled.- KVM/QEMU host with virtio-net backend (TAP or vhost-net)
- Attacker has code execution inside the guest (standard cloud tenant position)
- Cloud providers gate VM creation behind billing, identity, and abuse controls
- Enterprise VM creation typically requires IT approval workflows
Craft a packet with poisoned checksum metadata
csum_start points inside the IPv4 header (byte offset < 20). The packet's IPv4 header is valid at ingestion time and passes initial validation. The poisoned metadata rides through the virtio-net header, which the host kernel trusts for checksum offloading. This requires only normal networking syscalls from inside the guest — no special capabilities or raw sockets needed on the guest side.- Virtio-net checksum offload enabled on the host (default in virtually all KVM configurations)
- Guest can send network packets (standard for any VM)
- Checksum offload is on by default — there is effectively zero friction here
csum_start in virtio-net metadata. The metadata never traverses a physical network — it is internal to the host kernel.Trigger deferred checksum completion on the host
ip_do_fragment()), the kernel calls skb_checksum_help() to complete the deferred checksum. Because csum_start points inside the already-validated IPv4 header, the function writes two attacker-controlled bytes *into the header itself*, corrupting the IHL (Internet Header Length) field.- Packet reaches host kernel IPv4 fragmentation path
- Host kernel is unpatched (any version from 2.6.27 to the fixed release on its branch)
- This is the normal packet processing path — no special routing or firewall bypass needed
- Virtually all production hosts are still unpatched 3 days after disclosure
Oops in skb_checksum_help or ip_do_fragment). Unexpected kernel panics on hypervisor hosts should trigger investigation.Leak host kernel heap memory via inflated IHL
- Step 3 succeeded — host header is corrupted
- Attacker can receive or observe the fragmented packets
- The info-leak primitive is confirmed and repeatable
- No kernel hardening feature (KPTI, SMEP, SMAP) prevents this specific read
Escalate to host root via heap corruption
- Steps 3-4 succeeded
- Attacker has developed or obtained a heap exploitation chain for the target kernel version
- No public weaponized exploit chain exists as of 2026-10-18
- Kernel heap layout varies by version, workload, and SLUB/SLAB configuration
- SMEP/SMAP add exploitation complexity for the write-to-execute pivot
dm-verity, IMA). Hypervisor-level behavioral analysis.csum=off,guest_csum=off on virtio-net-pci devices in QEMU, or add <driver><host csum='off'/><guest csum='off'/></driver> in libvirt domain XML. This breaks the precondition at attack step 2 — the host kernel no longer defers checksum processing using guest-supplied metadata, so the poisoned csum_start is never consumed. Deploy within 3 days per the noisgate mitigation SLA for CRITICAL findings. Performance impact: the host CPU computes checksums inline instead of offloading, adding ~2-5% CPU overhead on network-intensive workloads. This is a temporary measure until the kernel is patched.sysctl -w user.max_user_namespaces=0 and persist via /etc/sysctl.d/90-no-userns.conf. This closes the local privilege escalation path (attack step 1 alternate) where an unprivileged user creates a TUN device with IFF_VNET_HDR inside a user namespace. Deploy within 3 days. Warning: this breaks rootless containers (Podman rootless), Chrome sandbox, and Flatpak. Only apply on hosts where these are not needed — primarily bare-metal hypervisors and database servers.kcarectl --patch-info | grep CVE-2026-99999. This eliminates the root cause without a maintenance window.4.18.0-553.174.2.el8_10, RHEL 9: 5.14.0-687.57.2.el9_8, Debian bookworm: 6.1.190-1, etc.) and schedule a reboot. This is the definitive fix — upstream commit 6785011f8b16 adds validation ensuring csum_start cannot point inside an already-parsed IPv4 header. Complete within 90 days per the noisgate remediation SLA for CRITICAL findings, but prioritize hypervisor hosts within the first 3-day mitigation window.- Network firewalls / IDS / IPS — the malicious packet metadata traverses the virtio-net internal path between guest and host kernel. It never crosses a physical network segment or passes through a firewall. No IDS signature can inspect virtio-net headers.
- SELinux / AppArmor on the guest — the memory corruption occurs in the *host* kernel's IPv4 stack, not in the guest. Guest-side MAC policies are irrelevant once the packet leaves the guest's virtio interface.
- seccomp profiles on guest processes — the attack uses normal networking syscalls (
sendmsg,writeto a socket) which are allowed by virtually all seccomp profiles including Docker's default. - CageFS (CloudLinux) — operates at the filesystem and process isolation level. It does not restrict network packet metadata passed through virtio-net headers. CloudLinux explicitly confirmed CageFS does not mitigate PwnEscape.
The supporting signals.
| In-the-wild exploitation | No confirmed wild exploitation. Not listed in CISA KEV. The original researcher (Paulos Yibelo / pwn.ai) demonstrated host root code execution in a lab during Vercel's $1M Sandbox challenge, but no malicious campaigns have been observed. GreyNoise shows no scanning activity targeting this vector (local-only, not remotely scannable). |
|---|---|
| Proof-of-concept availability | Partial. The PwnEscape research documents the memory disclosure primitive and host crash in detail. MChorfa/csumguard on GitHub provides a detection/checking tool. Quaerendir/cve-2026-99999-audit is a read-only audit script listed on Sploitus. No public full-chain RCE exploit exists. The complete allocator-sensitive chain for reliable host code execution has not been published. |
| EPSS score | 0.00211 (0.211%) — low in absolute terms. Reflects the local attack vector (not remotely triggerable), the absence of a public weaponized chain, and the 3-day-old disclosure window. Expect this to climb if a PoC drops. |
| CISA KEV status | Not listed as of 2026-10-18. No known due date. However, the guest-to-host escape primitive makes KEV listing plausible if cloud-provider telemetry detects exploitation. |
| CVSS vector breakdown | NVD: CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H = 9.3. Red Hat disputes PR:N, scoring PR:L → 8.8. The S:C (Scope: Changed) is correct and critical — the vuln in the host kernel is triggered from the guest scope, and impact crosses the VM boundary. AC:L is accurate: the packet manipulation is trivial once you understand the metadata fields. |
| Affected version range | Linux kernel 2.6.27 (commit introducing virtio-net header support, 2008) through 7.2.10 / 7.3-rc6. Every major LTS branch is affected: 5.10.x, 5.15.x, 6.1.x, 6.6.x, 6.12.x, 6.18.x, 7.2.x. RHEL 7–9, Debian bookworm/trixie, Ubuntu, SUSE, CloudLinux 7–10 all confirmed affected. |
| Fixed versions | Upstream: 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.57, 7.2.11, 7.3-rc7. Distro backports: AlmaLinux/RHEL 8 4.18.0-553.174.2.el8_10, AlmaLinux/RHEL 9 5.14.0-687.57.2.el9_8, Debian bookworm 6.1.190-1, Debian trixie 6.12.113-1. Upstream commit: 6785011f8b16 by Michael S. Tsirkin (Red Hat). |
| Exposure surface | Not remotely scannable — the attack vector is local (guest-to-host via virtio-net or local user via TUN/AF_PACKET). Shodan/Censys/GreyNoise cannot fingerprint exposure. The relevant exposure metric is *number of KVM hosts running untrusted workloads*, which includes every public cloud provider, most enterprise virtualization clusters, and shared-hosting platforms. |
| Disclosure timeline | Sep 7, 2026: Michael S. Tsirkin (Red Hat) reproduces the issue. Oct 8: Fix accepted into net.git (commit 6785011f8b16). Oct 14: Merged into Linus Torvalds' tree. Oct 15: CVE published, NVD score assigned, vendor advisories released. Oct 16: AlmaLinux, CloudLinux, Debian advisories published. |
| Researcher | Discovered by Paulos Yibelo of pwn.ai during Vercel's $1M Sandbox security challenge, using an AI-assisted research harness called Omega-Pwn. Fix authored by Michael S. Tsirkin (Red Hat, virtio maintainer). |
Sources.
Why this verdict
- PR:L correction (−0.3 points): Red Hat correctly notes that code execution inside a guest VM constitutes
PR:L, notPR:Nas NVD claims. Recalculating withPR:Lyields 8.8 on the CVSS formula. This is a scoring nuance, not a severity-bucket change. - No public full-chain exploit (acknowledged, does not reduce bucket): The complete RCE chain is unpublished. The confirmed primitives — a 2-byte controlled write into a post-validated header plus a 40-byte-per-fragment heap info leak — are the canonical building blocks for kernel exploitation. Weaponization is an engineering task, and the researcher has already demonstrated it privately. This tempers urgency but does not change the severity floor.
- EPSS 0.211% reflects newness, not impossibility: The CVE is 3 days old with no public chain. EPSS will lag. The low score means defenders have a window — it does not mean the threat is theoretical.
- Role multiplier — Hypervisors (CRITICAL floor): The Linux kernel IS the hypervisor substrate for KVM. The documented primary attack path is guest-to-host VM escape via virtio-net. ≥10% of enterprise Linux kernel deployments are KVM hypervisors or container hosts by definition. A successful exploit on a hypervisor compromises *every VM on the host* — fleet-scale blast radius. In cloud environments, this is cross-tenant compromise. This makes the affected component canonically high-value-role, and the floor is CRITICAL per role-multiplier rules.
- Role multiplier — Container hosts (CRITICAL floor reinforced): Kubernetes nodes running containerd/CRI-O over KVM or with virtio-net passthroughs are in the same blast-radius category. A compromised node host means access to all pod secrets, service account tokens, and lateral movement across the cluster.
- Role multiplier — CI/CD runners: Self-hosted CI runners on KVM are high-value targets. A guest escape from a build VM reaches the runner host, which typically holds credentials for artifact registries, cloud APIs, and source control — supply-chain-scale impact.
- Local attack vector is NOT meaningful friction for hypervisors: The entire threat model of a hypervisor is that untrusted tenants run code inside guests.
AV:Lin this context means 'reachable from the normal attacker starting position.' This is unlike a workstation vuln where AV:L requires prior compromise.
Why not higher?
A 10.0 would require an unauthenticated network-remote chain with no user interaction. PwnEscape requires local code execution inside a guest VM (AV:L), and the full RCE chain has not been publicly demonstrated — only the memory disclosure and crash primitives are confirmed and repeatable. The NVD's PR:N is arguably incorrect; PR:L better reflects the requirement for guest-level access. These factors justify 9.0 rather than 9.3 or higher.
Why not lower?
This vulnerability is *in* the kernel that runs hypervisors — the affected component is canonically a high-value-role component where ≥10% of installs are KVM hosts or container nodes. The documented guest-to-host escape primitive works on every KVM host since kernel 2.6.27, and the blast radius is fleet-scale (all VMs on the compromised host). The original researcher demonstrated host root code execution, the kernel maintainers validated the severity, and the 2-byte controlled write plus heap info leak are the standard recipe for reliable kernel exploitation. Downgrading below CRITICAL would require evidence that fewer than 1% of Linux kernel installations serve as hypervisors or container hosts, which is contradicted by every enterprise deployment survey.
Crowdsourced verification payload.
Run on each target Linux host — prioritize KVM hypervisors and Kubernetes nodes. Invoke as bash cve-2026-99999-check.sh. No root privileges required (reads uname -r and optionally checks KernelCare). Exit code 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN.
#!/bin/bash
# CVE-2026-99999 (PwnEscape) Vulnerability Checker
# Checks if the running kernel is patched against the IPv4
# skb_checksum_help OOB write (guest-to-host escape).
# Exit codes: 0=PATCHED 1=VULNERABLE 2=UNKNOWN
set -euo pipefail
KVER=$(uname -r)
UPSTREAM=$(echo "$KVER" | grep -oP '^\d+\.\d+\.\d+' || true)
if [[ -z "$UPSTREAM" ]]; then
echo "UNKNOWN — could not parse kernel version from: $KVER"
exit 2
fi
MAJOR=$(echo "$UPSTREAM" | cut -d. -f1)
MINOR=$(echo "$UPSTREAM" | cut -d. -f2)
BRANCH="${MAJOR}.${MINOR}"
# version_gte: returns 0 if $1 >= $2 (GNU sort -V)
version_gte() { printf '%s\n%s' "$2" "$1" | sort -V -C 2>/dev/null; }
# Pre-vulnerable check: code introduced in 2.6.27
if ! version_gte "$UPSTREAM" "2.6.27"; then
echo "PATCHED — $KVER predates vulnerable code (introduced 2.6.27)"
exit 0
fi
# Fixed versions per stable branch
case "$BRANCH" in
5.10) FIXED="5.10.272" ;;
5.15) FIXED="5.15.223" ;;
6.1) FIXED="6.1.190" ;;
6.6) FIXED="6.6.159" ;;
6.12) FIXED="6.12.113" ;;
6.18) FIXED="6.18.57" ;;
7.2) FIXED="7.2.11" ;;
7.3|7.[4-9]*|[8-9].*)
echo "PATCHED — $KVER is branch $BRANCH (fix merged in 7.3-rc7)"
exit 0 ;;
*) FIXED="" ;;
esac
if [[ -n "$FIXED" ]]; then
if version_gte "$UPSTREAM" "$FIXED"; then
echo "PATCHED — $KVER (upstream $UPSTREAM >= $FIXED)"
exit 0
else
echo "VULNERABLE — $KVER (upstream $UPSTREAM < $FIXED on $BRANCH)"
exit 1
fi
fi
# Check for distro backport via package version
if command -v rpm &>/dev/null; then
PKG=$(rpm -q --qf '%{VERSION}-%{RELEASE}' kernel-"$(uname -r)" 2>/dev/null || true)
if [[ -n "$PKG" ]]; then
# RHEL 8 fixed: 4.18.0-553.174.2 RHEL 9 fixed: 5.14.0-687.57.2
case "$BRANCH" in
4.18) version_gte "$UPSTREAM" "4.18.0" && \
echo "$PKG" | grep -qP '553\.17[4-9]|553\.[2-9][0-9]{2}|55[4-9]|5[6-9]|[6-9]' && \
{ echo "PATCHED — RHEL/Alma 8 backport detected ($PKG)"; exit 0; } ;;
5.14) version_gte "$UPSTREAM" "5.14.0" && \
echo "$PKG" | grep -qP '687\.5[7-9]|687\.[6-9]|68[8-9]|69|[7-9]' && \
{ echo "PATCHED — RHEL/Alma 9 backport detected ($PKG)"; exit 0; } ;;
esac
fi
fi
# Check KernelCare livepatch
if command -v kcarectl &>/dev/null; then
if kcarectl --patch-info 2>/dev/null | grep -qi 'CVE-2026-99999'; then
echo "PATCHED — KernelCare livepatch for CVE-2026-99999 on $KVER"
exit 0
fi
fi
# Unknown / EOL branch
echo "UNKNOWN — $KVER on branch $BRANCH (not a current LTS). Check your distro vendor."
exit 2