Zapscape (CVE-2026-64561)
Zapscape is a VM-to-host escape in the Linux kernel's KVM/x86 subsystem. A tenant who has root inside their own VM can, under the right conditions, gain root on the hypervisor and therefore over every other VM on that host. Because VirtFusion hypervisors run tenant workloads on KVM, any affected hypervisor should be patched and rebooted as a priority.
Summary
| Field | Detail |
|---|---|
| CVE | CVE-2026-64561 |
| Nickname | Zapscape (part of "The KVM Escape Trilogy", alongside ITScape and Januscape) |
| Component | Linux kernel, KVM/x86 shadow MMU |
| Class | Use-after-free (UAF) |
| Impact | VM-to-host escape, leading to arbitrary code execution as root on the host |
| Severity | Important. CVSS 3.1 base score 7.0 |
| Upstream fix | Commit 2abd5287f083 (merged mainline 2026-07-21) |
| Where it applies | Hypervisors running KVM VMs. This does not affect the VirtFusion control server. |
Am I affected?
The vulnerability lives in the host kernel on your hypervisors. It is not a VirtFusion application flaw and does not affect the control server. You are potentially exposed if all of the following are true:
- A hypervisor runs an unpatched Linux kernel that includes the vulnerable shadow-MMU code (introduced in the 5.9 era via commit
f95eec9bed76). - VMs are able to use nested virtualization (nested VMX/EPT on Intel, or nested SVM/NPT on AMD).
- The VM is controlled by an untrusted party with root inside the VM, which is the normal situation in a multi-tenant hosting environment.
On Intel hosts an extra condition applies: exploitation requires both 4-level and 5-level EPT page-walk support to be exposed to the L1 VM. AMD hosts have no such extra condition.
Technical details
The bug is a use-after-free in KVM's shadow MMU, on the recursive "zap" path used during shadow-page reclamation.
Two page-fault paths validate the shadow root before reclaiming shadow pages instead of after. When a single kvm_mmu_page is aliased as both a child of one nested page table and the pinned root of another, quota-driven reclamation can recursively prepare (and free) that page through its parent without the root_count protection applying. KVM then keeps building mappings beneath a root that reclamation has already invalidated, leaving dangling pointers that allow writes to freed memory. From there the public proof-of-concept chains a KASLR leak and a usermode-helper callback to run arbitrary code as root on the host.
The upstream fix (2abd5287f083) moves the stale-root check to after make_mmu_pages_available(), so KVM restarts the fault if the root became invalid during reclamation rather than continuing to use freed structures.
Patch status by distribution
VirtFusion is supported on Debian 12/13, Ubuntu 22.04/24.04, and RHEL-family 9/10 (AlmaLinux / Rocky). The table below tracks the fix for those distributions.
The state below reflects 2026-08-08. Distribution patch status changes daily as errata ship. Always confirm against the vendor's live security tracker (linked in References) before deciding a host is safe.
| Distribution | Status | Fixed kernel / advisory |
|---|---|---|
| Debian 13 (trixie) | Patched | linux 6.12.101-1 (DSA-6415-1) |
| Debian 12 (bookworm) | Not yet fixed | Patch in review; monitor the Debian tracker |
| Ubuntu 24.04 LTS (noble) | Not yet fixed | Patch prepared, in validation |
| Ubuntu 22.04 LTS (jammy) | Not yet fixed | Patch prepared, in validation |
| RHEL 9 / AlmaLinux 9 / Rocky 9 | Patched | kernel-5.14.0-687.30.1.el9_8 or newer (shipped 2026-07-22; AlmaLinux via ALSA-2026:19225) |
| RHEL 10 / AlmaLinux 10 / Rocky 10 | Rolling out | Fix in preparation for el10; verify against your vendor's errata |
Debian
- Debian 13 (trixie): Fixed in
linux6.12.101-1 (DSA-6415-1). Update and reboot. - Debian 12 (bookworm): No fixed kernel published yet at the time of writing. Apply the interim mitigations and watch the tracker, then install the security update as soon as it lands.
Ubuntu
- Ubuntu 24.04 LTS (noble) and 22.04 LTS (jammy): No fixed
linuxpackage released yet at the time of writing; patches were prepared and in validation. This covers the cloud and derivative kernels too (linux-kvm,linux-aws,linux-azure,linux-gcp,linux-oracle, FIPS variants, and so on). Apply the interim mitigations and update once the USN is published.
RHEL family (AlmaLinux / Rocky)
- 9 (el9): Fixed. Install
kernel-5.14.0-687.30.1.el9_8or newer and reboot. AlmaLinux ships this as ALSA-2026:19225; Rocky publishes the equivalent RLSA. RHEL 8 was also fixed (kernel-4.18.0-553.147.1.el8_10or newer) if you run any el8 hosts. - 10 (el10): The el10 kernel fix was still rolling out at the time of writing. Check the AlmaLinux / Rocky errata for your exact point release and install the fixed kernel when available. Apply the interim mitigations in the meantime.
Remediation
The fix is a host kernel update followed by a reboot on every hypervisor. A kernel update does not take effect until the host is running the new kernel, so the reboot is required.
- Debian/Ubuntu
- RHEL / AlmaLinux / Rocky
apt-get update -y && apt-get install --only-upgrade linux-image-amd64 -y
# Reboot into the new kernel once VMs are migrated/stopped:
reboot
dnf makecache -y && dnf update kernel -y
# Reboot into the new kernel once VMs are migrated/stopped:
reboot
After rebooting, confirm the host is running a fixed kernel:
uname -r
Compare the output against the fixed version in the table above.
Mitigations if you cannot patch yet
If a fixed kernel is not yet available for a host, reduce exposure until you can update.
Disable nested virtualization on hypervisors that do not need it. This removes the primary exploitation path. VirtFusion uses the stock distribution libvirt/KVM, and on current kernels the nested module parameter defaults to enabled for both kvm_intel and kvm_amd, so hosts are exposed by default.
The nested parameter cannot be changed while kvm_intel / kvm_amd is loaded, and the module cannot be unloaded while any VM is running. The reliable sequence is therefore to set the value in the modprobe.d config, then reboot the host so the module reloads with nested=0.
Nested can be enabled two ways: by an active options ... nested=1 line in a modprobe.d file, or, when nothing sets it, by the kernel module's own default (which is nested=1 on current kernels). Handle whichever applies. When you do set it in a file, correct the value at its source rather than adding a second override file: modprobe reads every .conf file in the modprobe.d directories in lexicographic filename order and the last value for a repeated parameter wins, and a plain name like kvm.conf sorts after any numeric-prefixed file, so a separate override is easily outranked.
First, find any active (uncommented) line that sets nested. Commented example lines, such as those AlmaLinux ships in /etc/modprobe.d/kvm.conf, do not count:
grep -RHn '^[^#]*nested' /etc/modprobe.d/ /run/modprobe.d/ /usr/lib/modprobe.d/ /lib/modprobe.d/ 2>/dev/null
If an active line sets nested=1 (some VirtFusion hosts ship /etc/modprobe.d/kvm.conf this way), change its value to 0:
sed -i 's/nested=1/nested=0/' /etc/modprobe.d/kvm.conf
If the command returns nothing, nested is on by the kernel default and no file is setting it. Add an active line that disables it, matching your host's CPU vendor:
- Intel
- AMD
echo "options kvm_intel nested=0" >> /etc/modprobe.d/kvm.conf
echo "options kvm_amd nested=0" >> /etc/modprobe.d/kvm.conf
The change only takes effect once the module reloads, which means a reboot:
reboot
After the host is back up, confirm nested virtualization is off. This sysfs value is the effective setting regardless of what produced it, so it is the definitive check. 0 means disabled:
- Intel
- AMD
cat /sys/module/kvm_intel/parameters/nested
cat /sys/module/kvm_amd/parameters/nested
If it still reads 1 after a reboot, the value is being forced on the kernel boot command line, which the modprobe.d config cannot override. Remove any kvm_intel.nested=1 / kvm_amd.nested=1 from your bootloader config (/etc/default/grub), regenerate the config, and reboot.
Disabling nested virtualization requires a host reboot, which is also what applies a kernel update. If a fixed kernel has already shipped for your distribution, it is simpler to patch and reboot once (see Remediation) instead. Turning off nested is intended for hosts where no fixed kernel is available yet. It lowers the likelihood of exploitation but does not remove the vulnerability.