Virtual machines are a bit like apartments in one big building. Each tenant gets their own space, and the walls are supposed to be solid, because the building’s plumbing and wiring are shared. The PwnEscape vulnerability is a reminder that the shared plumbing can have a leak. Researchers showed that a malicious guest could use the host’s own networking code to peek at, and in lab tests change, memory that belongs to the host.
If you run KVM servers, Proxmox, a hosting platform, or sandboxes for other people’s code, this one matters. If you only use cloud VMs, it is worth a quick question to your provider. Here is what is known, what is disputed, and a read-only checklist, including a small script and a safe toy model of the bug pattern.
⚡ TL;DR
- PwnEscape (CVE-2026-99999) is a flaw in the Linux kernel’s IPv4 networking code that lets a malicious VM guest influence the host. It is local, not an internet-facing attack.
- The bug sits in how the kernel handles checksum hints from virtio-net. It is reported to date back to Linux 2.6.27, about 18 years.
- A fix is in mainline and in stable kernels 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.57 and 7.2.11. Distribution status varies and changes daily.
- No in-the-wild exploitation was reported in the sources I read, but the researcher has lab demos and has forecast exploits. Patch the host, reboot, then verify the running kernel.
- Severity scores disagree: 8.8 from Red Hat, 9.3 on the CVE record. No official workaround was available at publication time.
What is the PwnEscape vulnerability?
The PwnEscape vulnerability (CVE-2026-99999) is a Linux kernel networking flaw that lets code inside a virtual machine influence its host. By sending packets with crafted checksum hints, a malicious guest could read host memory and, in lab tests, modify it. The fix is in the kernel, so the host must be patched and rebooted.
The name is a pun on “escape,” as in escaping the VM. pwn.ai, the security firm whose researcher found it, calls it a guest-to-host escape.
Who found it, and how?
According to pwn.ai, the researcher is Paulos Yibelo. He was looking at the problem during Vercel’s two-week hacking challenge for its sandbox product, announced on August 18, 2026 with a $1 million total prize pool. Vercel’s tally recorded one Critical finding, which the researchers identify as this one.
Timeline: from report to public fix

The pwn.ai write-up lays out the timeline below. Public coverage and distro advisories followed on October 15 and 16.
| Date (2026) | Event | Source |
|---|---|---|
| Aug 18 | Vercel announces a $1 million sandbox hacking challenge. | pwn.ai |
| Aug 20 | First bounded report submitted. | pwn.ai |
| Sep 4 | Root cause reported privately to the kernel security contact and networking maintainers, with candidate patches. | pwn.ai |
| Sep 7 | Kernel developer Michael S. Tsirkin reproduces the issue. | pwn.ai |
| Sep 19–22 | Patch proposals and revisions posted publicly on the netdev list. | pwn.ai |
| Oct 8 | Revised fix accepted into the networking tree (net.git). | pwn.ai, AlmaLinux, TuxCare |
| Oct 14 | Fix merged into mainline. | pwn.ai, AlmaLinux, TuxCare |
| Oct 15–16 | Public write-ups and first distro advisories. | The Hacker News, AlmaLinux, Proxmox |
How does PwnEscape work? A plain-English tour
Let me translate. A few terms first, because kernel security loves a big word.
- Virtio-net is the standard virtual network card that VMs use to talk to the host.
- Checksum offload means the sender can say “someone else will compute the checksum for this packet.” It saves CPU work. The sender includes a hint about where the checksum should go.
- TAP and vhost-net are the host-side plumbing that connects a VM’s virtual network card to the host’s network stack.
- Fragmenting means splitting a large packet into smaller ones so it fits on the network.
The bug in five steps

- A guest sends a packet with a checksum hint telling the host where to write the checksum.
- The host checks the hint, but, per TuxCare, only that it sits at least 20 bytes into the buffer. It does not confirm the spot is past the IP header.
- Later, when the host fragments the packet, a helper writes two bytes at that hinted spot, which can land inside the IP header.
- That write can change the header’s length field, so the packet now claims to be longer than it really is.
- The fragmenting code then copies bytes beyond the packet’s real end into outgoing data, which means host memory can leak out.
The check passed. The trouble came after it. Security people have a name for this pattern, validate-then-use, and it keeps showing up because it is easy to write and hard to spot. A check that checks out can still let you down.
Is it a KVM bug?
Not exactly. AlmaLinux says the flaw is in the host kernel’s IPv4 networking stack, not in KVM itself. CSO Online quotes the researcher saying it is not specific to KVM or any one hypervisor, and that he tested on KVM and Firecracker machines matching Vercel’s setup. KVM is simply where a malicious guest meets the networking code.
How long has it been there? AlmaLinux, TuxCare and CloudLinux all say about 18 years, dating to Linux 2.6.27 in 2008. The upstream fix describes itself as a defense-in-depth measure, and the author says broader checking of untrusted checksum data is still needed.
Who is affected by the PwnEscape vulnerability?
The short version: machines that let untrusted code reach the host’s virtual networking. The attacker needs to run code in a guest first. The Hacker News stresses it is a local vector and not something outsiders can exploit over the internet.
| Setup | Exposure | Source / note |
|---|---|---|
| Host running untrusted VMs with virtio-net over TAP or vhost-net | Exposed. This is the case the CVE record describes. | CloudLinux, VirtFusion, SmartScope |
| Unprivileged local users who can create TUN devices in a user namespace | Plausible from the code, unconfirmed. | CloudLinux (flags it as unconfirmed) |
| Processes with raw packet sockets using the virtio-net header option | Needs CAP_NET_RAW, which a user namespace can grant. | CloudLinux |
| macvtap or ipvtap device owners | Listed as exposed paths. | CloudLinux |
| Firecracker microVMs on a vulnerable host | The researcher tested these. | CSO Online |
| AWS-operated EC2, Lambda and Fargate | Reported as likely not exposed, per AWS’s bulletin. Self-managed KVM inside an EC2 instance still is. | SmartScope (relaying AWS; not checked directly) |
What about CPU type? One outlet describes it as an x86 issue, while VirtFusion advises assessing Intel, AMD and arm64 hosts.
How serious is it? Scores, proof and predictions
Three separate questions hide inside “how serious”: the score, the evidence, and the outlook.
The score: two numbers, one CVE
Red Hat’s CVE page lists Red Hat’s rating as Important with a CVSS 3.1 score of 8.8, while the CVE.org record shows Critical at 9.3. The vectors differ in one place: the privileges an attacker needs (Low for Red Hat, None for the CVE record).
The evidence: lab demos, with a disputed detail
- Shown in a lab: pwn.ai reports a bounded host-memory disclosure of 32 bytes per active case, selected host-kernel writes, and a bounded host-side execution chain on researcher-owned KVM test systems.
- Disputed: The Hacker News says the memory leak was demonstrated against Vercel’s production sandboxes. pwn.ai says it was not shown in any vendor’s production environment, and CSO Online reports Vercel saying the attacks ran on the researcher’s own machines matching its setup.
- Customer data: Vercel said no report showed access to customer files, secrets or application data, per The Hacker News.
- In the wild: No exploitation was reported in the sources mentioned, and The Hacker News says it is not in CISA’s known-exploited list. Red Hat’s page does mention a KEV label.
The outlook: a prediction, flagged as one
CSO Online reports that the researcher predicts exploits for weaker configurations within weeks and for default setups within a month. That is a forecast, not an observation, and full escape details are not yet public. pwn.ai says the host-control details are deferred to a planned second post.
What is the fix, and who has shipped it?
The upstream fix is mainline commit 6785011f8b16, written by Red Hat’s Michael S. Tsirkin according to The Hacker News. It rejects packets whose checksum start falls inside the IPv4 header, at five places in the networking code, and landed in mainline on October 14 (7.3-rc7 and later).
| Kernel branch | First fixed release |
|---|---|
| 5.10 | 5.10.272 |
| 5.15 | 5.15.223 |
| 6.1 | 6.1.190 |
| 6.6 | 6.6.159 |
| 6.12 | 6.12.113 |
| 6.18 | 6.18.57 |
| 7.2 | 7.2.11 |
Those are upstream numbers, as listed by The Hacker News, TuxCare and SmartScope. Distribution kernels use their own numbering and often backport fixes without changing the version, so never judge your status from uname -r alone.
Distribution status: a snapshot, not a promise

| Distribution | Reported status | Source and date |
|---|---|---|
| Debian 12 | Fixed in linux 6.1.190-1 or later | VirtFusion, SmartScope |
| Debian 13 | Fixed in linux 6.12.113-1 or later | VirtFusion, SmartScope |
| Proxmox VE | Fixed in proxmox-kernel-7.0.14-24-pve (advisory PSA-2026-00068-1) | Proxmox, Oct 16 |
| AlmaLinux 8, 9, 10 | Patched kernels in the testing repository, moving to production after verification | AlmaLinux, Oct 16 |
| Amazon Linux | Reported fixed; versions not given in the source | SmartScope, Oct 18 |
| Ubuntu 22.04, 24.04, 26.04 LTS | No fixed build listed | SmartScope, VirtFusion |
| RHEL | Affected; no fixed release named on Red Hat’s page | Red Hat’s CVE page |
How to check if your host is patched for PwnEscape
To check, first find out whether the machine hosts VMs, then confirm your vendor has a fixed kernel for it, patch the host, reboot, and verify the running kernel afterwards. Patching a guest does nothing for a vulnerable host.
- Do you host VMs at all? Look for the kernel modules and tools:
lsmod | grep -E "kvm|vhost_net|tun",ls /dev/kvm, and your VM list (virsh list --all, orqm liston Proxmox). These are read-only checks suggested by SmartScope. - Identify your OS and running kernel:
cat /etc/os-releaseanduname -r. - Read your vendor’s advisory for CVE-2026-99999. On RHEL-family systems, SmartScope suggests
dnf --refresh updateinfo info --all --cve=CVE-2026-99999. On Debian, VirtFusion suggests checking the package version withdpkg-query. - Check the local path if you host shell users: CloudLinux suggests running
unshare -Urnas an unprivileged user. If it fails, user namespaces are closed for that user. - Patch the host, not just the guests. Live-migrate or stop guests first if you cannot take downtime, update the kernel package, then reboot the host.
- Verify after the reboot: compare the running kernel to the advisory’s fixed version. Installing the package is not enough until you boot into it.
- Live patching? Ask your provider whether it covers this CVE on your exact kernel, as SmartScope advises.


Check it with code: a read-only helper and a safe toy model
Two small programs follow. Neither touches a real vulnerability or sends any traffic. The first helps you triage; the second explains the bug pattern with a harmless toy.
Python: kernel version and VM-hosting signs
This script (Python 3.12+, standard library only) prints your running kernel, compares it with the upstream first-fixed versions, and lists signs the machine may host VMs. It cannot prove you are patched, because of vendor backports. It changes nothing.
"""Read-only PwnEscape (CVE-2026-99999) exposure helper. Python 3.12+, standard library only.
It looks at your running kernel version and a few signs that this machine hosts VMs.
It changes nothing and sends nothing. IMPORTANT: a version number cannot prove you are
patched, because distributions backport fixes without changing the version. Treat the
output as a prompt to read your vendor's advisory, not as a verdict.
"""
import os
import platform
import re
# First upstream stable releases containing the fix (commit 6785011f8b16), as reported
# by The Hacker News and TuxCare. Mainline has it from 7.3-rc7.
FIRST_FIXED = {(5, 10): 272, (5, 15): 223, (6, 1): 190, (6, 6): 159,
(6, 12): 113, (6, 18): 57, (7, 2): 11}
VM_MODULES = ("kvm", "kvm_intel", "kvm_amd", "vhost_net", "tun", "macvtap")
def classify(release: str) -> str:
m = re.match(r"(\d+)\.(\d+)(?:\.(\d+))?(.*)", release)
if not m:
return "UNKNOWN: could not parse the kernel version. Check your vendor advisory."
major, minor, patch = int(m[1]), int(m[2]), int(m[3] or 0)
suffix = m[4]
note = ""
if re.search(r"\.el\d|ubuntu|\+deb|amzn|rt\d", release):
note = " This looks like a distribution kernel, so fixes may be backported without a version change."
branch = (major, minor)
if branch in FIRST_FIXED:
need = FIRST_FIXED[branch]
if patch >= need:
return f"AT OR ABOVE the first upstream fixed release ({major}.{minor}.{need}).{note}"
return (f"BELOW the first upstream fixed release ({major}.{minor}.{need}). "
f"A vendor backport may still cover you: check the advisory.{note}")
if branch == (7, 3):
rc = re.search(r"rc(\d+)", suffix)
if rc and int(rc[1]) < 7:
return f"BELOW 7.3-rc7, where mainline got the fix.{note}"
return f"7.3 final or rc7 and later should include the fix. Confirm with your vendor.{note}"
if branch > (7, 3):
return f"Newer than the branches listed; the fix should be included. Confirm with your vendor.{note}"
return (f"Branch {major}.{minor} is not in the reported fixed list. "
f"Rely on your vendor's advisory, or move to a fixed branch.{note}")
def vm_signs(read_modules, path_exists, read_userns):
"""Return human-readable signs that this host may run or expose VMs."""
loaded = {line.split()[0] for line in read_modules().splitlines() if line.strip()}
signs = [f"module loaded: {m}" for m in VM_MODULES if m in loaded]
if path_exists("/dev/kvm"):
signs.append("/dev/kvm exists")
limit = read_userns()
if limit is not None and limit != "0":
signs.append(f"user namespaces allowed (user.max_user_namespaces={limit}); "
"vendors discuss a local path through them")
return signs
def _read(path):
try:
with open(path) as fh:
return fh.read().strip()
except OSError:
return None
def main():
release = platform.release()
print(f"Running kernel: {release}")
print(classify(release))
signs = vm_signs(lambda: _read("/proc/modules") or "", os.path.exists,
lambda: _read("/proc/sys/user/max_user_namespaces"))
print("Signs this machine may host VMs:" if signs else "No VM-hosting signs found.")
for s in signs:
print(f" - {s}")
print("Next: read your vendor's advisory for CVE-2026-99999, patch the HOST kernel, reboot, "
"then re-run this and confirm the running version.")
if __name__ == "__main__":
main()
Rust: why a lower-bound check is not enough
This toy (Rust 1.97 stable, cargo run and cargo test, no dependencies) models the pattern in plain user-space code: a weak check accepts an offset, a later write changes a length field, and the program simulates how much a naive copy would over-read. It is not kernel code and does not attack anything.
// A toy model of "incomplete validation plus a later write". It is NOT kernel code and
// attacks nothing. It only shows why a lower-bound check is not enough.
// Tested with Rust 1.97 stable: `cargo run` and `cargo test`.
const HEADER_LEN: usize = 8; // toy header: bytes 0-1 flags, bytes 2-3 total length, rest padding
fn new_packet() -> Vec<u8> {
// 8-byte header + 4 payload bytes = 12 bytes, and the length field honestly says 12.
let mut p = vec![0u8; 12];
p[2..4].copy_from_slice(&12u16.to_be_bytes());
p
}
// Weak check: only a lower bound, like "at least 2 bytes in".
fn weak_ok(csum_start: usize) -> bool {
csum_start >= 2
}
// Strict check: the offset must be past the whole header.
fn strict_ok(csum_start: usize) -> bool {
csum_start >= HEADER_LEN
}
// Later stage: writes a 2-byte "checksum" where the sender said to.
fn deferred_write(p: &mut [u8], csum_start: usize) {
if csum_start + 2 <= p.len() {
p[csum_start] = 0xFF;
p[csum_start + 1] = 0xFF;
}
}
// Returns how many bytes a naive copy would read past the end of the packet (simulated).
fn simulated_overread(p: &[u8]) -> usize {
let claimed = u16::from_be_bytes([p[2], p[3]]) as usize;
claimed.saturating_sub(p.len())
}
fn run(name: &str, check: fn(usize) -> bool, csum_start: usize) -> usize {
let mut p = new_packet();
if !check(csum_start) {
println!("{name}: offset {csum_start} rejected");
return 0;
}
deferred_write(&mut p, csum_start);
let over = simulated_overread(&p);
let claimed = u16::from_be_bytes([p[2], p[3]]);
println!("{name}: offset {csum_start} accepted, length field now {claimed}, simulated over-read {over} bytes");
over
}
fn main() {
run("weak check ", weak_ok, 2);
run("strict check", strict_ok, 2);
run("strict check", strict_ok, 8);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn weak_check_lets_header_change() {
assert_eq!(run("weak", weak_ok, 2), 65535 - 12);
}
#[test]
fn strict_check_rejects_header_offsets() {
assert_eq!(run("strict", strict_ok, 2), 0);
}
#[test]
fn strict_check_allows_offsets_past_header() {
assert_eq!(run("strict", strict_ok, 8), 0);
}
}
Expected output: the weak check accepts offset 2 and the length field jumps to 65535 with a simulated over-read of 65523 bytes, the strict check rejects offset 2, and the strict check accepts offset 8 with no change. The three unit tests pass. The real kernel code is more involved, so use this only as an analogy.
Is there a workaround?
Officially, no. AlmaLinux says no workaround has been published by the researcher, upstream or Red Hat, and Red Hat’s page says none currently meets its criteria for ease of deployment, broad applicability and stability. The patched host kernel is the fix.
Some vendors describe partial measures, with caveats. I am listing them for awareness, not as recommendations:
- Turn off checksum offload for untrusted guests (in QEMU,
csum=off,guest_csum=off). CloudLinux and TuxCare describe it; it costs throughput, needs a guest restart, and CloudLinux says these measures are untested against this bug. TuxCare says Firecracker support is unverified. - Limit user namespaces with
user.max_user_namespaces=0to close the local path. That breaks rootless containers and some browser and Flatpak sandboxes. - Damage limiting, not a fix: The Hacker News reports that Vercel keeps host kernels updated, disables nested virtualization, and runs microVMs under Firecracker’s jailer.
- A caution: SmartScope advises against relying on unverified mitigations such as disabling checksum offload, and AWS is quoted saying no official temporary workaround exists.
Should you care? A quick verdict
| If you are… | How much to worry | Do this |
|---|---|---|
| A hosting provider, VPS host, Proxmox or private-cloud operator | High: act now | Get the fixed host kernel, migrate guests, reboot, verify. |
| Running a sandbox, CI or code-execution platform on KVM or Firecracker | High: act now | Same as above; treat every tenant as untrusted. |
| Running self-managed KVM inside a cloud VM | High | Patch that VM’s kernel and verify; the nested host is still exposed. |
| A cloud customer using provider-managed VMs | Medium: ask | Ask your provider about their status; you cannot patch their host. |
| Running a few trusted VMs on your own desktop | Lower | Take the update with your next routine kernel patch. |
Pros of where we are: a fix exists upstream, major distros are shipping or testing kernels, and the sources I read report no in-the-wild exploitation. Cons: the severity is contested, some big distros had no fixed build listed, and a researcher is forecasting exploits. Nothing here says you have been hit. It does say the window to patch quietly is not unlimited.
🔮 What’s next (analysis, not fact)
A few predictions, clearly mine. First, expect the distro table above to turn mostly green over the next days, with Ubuntu and RHEL the ones to watch. Second, expect the follow-up technical post from pwn.ai, which will raise pressure on anyone still unpatched. Third, expect more attention on “validate everything the guest says” in virtualization networking, since the patch’s own author calls it partial.
There is also a bigger story: the researcher credits AI-assisted tooling for finding the bug quickly. If that claim holds up in time, defenders will need to patch faster, because finding bugs may get cheaper for everyone. Time will tell. Watch three signals: Red Hat’s and Ubuntu’s fixed kernels, the second pwn.ai post, and any report of real-world exploitation.
❓ FAQ
What is the PwnEscape vulnerability?
PwnEscape (CVE-2026-99999) is a Linux kernel flaw in IPv4 checksum-offload handling for virtio network packets. A malicious guest VM could send crafted checksum hints so the host reads past a packet’s end and, in lab tests, writes to host memory. The fix is a host kernel update followed by a reboot.
Can PwnEscape be exploited over the internet?
Not directly. The attacker needs to run code inside a guest VM or, on some setups, as a local user with enough namespace or device access. The Hacker News stresses the vector is local. That still matters for anyone who hosts other people’s workloads, because tenants are the local attackers.
Does patching my guest operating system fix it?
No. The flaw lives in the host’s kernel networking code, so the host kernel needs the fix and a reboot. Guests should be migrated or shut down before the host restarts, and you should verify the running host kernel against your vendor’s advisory afterwards.
Is there a workaround if I cannot reboot yet?
No official one. Vendors describe partial steps like turning off checksum offload for untrusted guests or limiting user namespaces, but CloudLinux calls them untested against this bug and they carry costs. Livepatching may help if your provider confirms coverage for your exact kernel. The real fix is the patched kernel.
Is PwnEscape being exploited in the wild?
The sources report no in-the-wild exploitation, and The Hacker News says it is not in CISA’s known-exploited catalog. The researcher has shown lab exploitation and predicts exploits for weaker setups within weeks, which is a forecast.
Am I affected if I only use cloud VMs?
Probably not directly, because you cannot patch your provider’s hosts. AWS is reported to say its managed services are not likely exposed. Self-managed KVM inside a VM still is. Ask your provider about their status, and patch any hypervisor you run yourself.
✅ Key takeaways
- The PwnEscape vulnerability is a local, guest-to-host flaw in Linux networking, not a remote internet attack.
- Patch the host kernel and reboot, then verify the running kernel. Guest patches do not help.
- Version numbers can mislead because of backports. Read your vendor’s advisory.
- Severity is contested (8.8 versus 9.3), and no official workaround existed at publication time.
- No in-the-wild exploitation was reported, but a forecast of exploits makes now the time to act.
🗳️ Quick poll
What do you run VMs on? KVM or QEMU, Proxmox, VMware, only the cloud, or none of the above? Tell us in the comments.
