A guest VM hands the bouncer a fake ID card that's two inches wide, and the bouncer reads past the edge into the next patron's wallet
CVE-2026-53360 is a guest-triggered heap out-of-bounds read/write in the Linux kernel's KVM SEV-SNP Page State Change (PSC) handler (arch/x86/kvm/svm/sev.c). When a GHCB v2+ guest points its scratch area outside the GHCB, setup_vmgexit_scratch() allocates a host-side buffer sized by guest-controlled exit_info_2. The entry-count validation then checks against the protocol constant 253 (VMGEXIT_PSC_MAX_COUNT) instead of the actual buffer capacity. A guest requesting a 24-byte allocation gets a kmalloc-cg-32 slab but can walk up to index 252, reading and writing adjacent slab objects on the host heap. Introduced in commit 9b54e248d264 (~v6.10, May 2024). Fixed in commit db3f219 (May 2026), backported to 6.1.177, 6.6.144, 6.12.95, 6.18.38, 7.0.14, and 7.1.3. Only the SEV-SNP host path is affected; plain SEV or SEV-ES guests cannot trigger it.
The vendor score of 8.8 HIGH with Scope:Changed (AV:L/AC:L/PR:L/UI:N/S:C) is directionally correct — this is a genuine VM escape primitive. The S:C flag properly reflects guest-to-host boundary crossing, and AC:L is fair because the public PoC is straightforward (73 KASAN violations on a single run against an AMD EPYC 7443P). However, the 8.8 slightly overstates the real-world blast radius because the vulnerable code path is only exercised on hosts actively running SEV-SNP guests, which is a minority of KVM deployments — primarily cloud confidential-computing tiers and regulated on-prem enclaves. noisgate downgrades to 8.0 but floors at HIGH because KVM is a hypervisor component and the chain ends in host compromise.
4 steps from start to impact.
Attacker obtains code execution inside an SEV-SNP guest
- Code execution inside an SEV-SNP guest VM
- Host kernel compiled with CONFIG_KVM_AMD_SEV
- AMD EPYC processor with SEV-SNP support
- SEV-SNP adoption is limited to confidential-computing tiers — most KVM hosts never launch an SNP guest
- Attacker must already be inside the guest, not on the network
snp_begin_psc. Without KASAN, no reliable host-side detection exists pre-patch.Craft a PSC request with a tiny out-of-GHCB scratch area
set_memory_decrypted(), and hand-builds a GHCB PSC request pointing the scratch area outside the GHCB with a very small exit_info_2 length (e.g. 24 bytes). The host calls setup_vmgexit_scratch() which kmallocs a 32-byte slab object. The public PoC at 0xCyberstan/CVE-2026-53360-POC demonstrates this step.- Ability to issue raw VMGEXIT from guest kernel context
- Requires guest kernel-level access or a loadable module — userland alone is insufficient
Walk the entry array past the buffer boundary
hdr->end_entry against VMGEXIT_PSC_MAX_COUNT (253) but not against the actual 2-entry capacity of the 32-byte buffer. The host kernel iterates up to index 252, reading and writing adjacent kmalloc-cg-32 slab objects. Each iteration processes an 8-byte entry, giving the attacker a read oracle (host reads adjacent memory), a constrained write (small values into low 12 bits), and a failure oracle (invalid entries reveal object boundaries).- Vulnerable kernel version (6.10 through pre-fix)
- Heap layout is non-deterministic; reliable exploitation requires heap grooming, which adds complexity and time
slab-out-of-bounds in snp_begin_psc+0x126/0x890 targeting kmalloc-cg-32.Achieve host kernel code execution or data corruption
- Successful heap grooming
- Knowledge of host kernel symbol layout (KASLR bypass or info leak from step 3)
- Full weaponization requires chaining multiple primitives — no public end-to-end exploit exists yet
- KASLR adds an additional barrier that must be independently defeated
mem_encrypt=off kernel parameter or by not loading the ccp module. This eliminates the vulnerable code path entirely. Deploy within 30 days per noisgate mitigation SLA for HIGH.CONFIG_KASAN=y on SEV-SNP hosts to get immediate detection of OOB access in snp_begin_psc. This is a detection control, not prevention, but gives you visibility if exploitation is attempted. Performance overhead of ~2-3x makes this viable only on non-production or canary hosts.modules_disabled=1 or signed-module enforcement. This raises the bar from 'unprivileged guest code' to 'guest kernel exploit + module bypass'. Deploy within 30 days.- Network firewalls / WAF / IDS — This is a local guest-to-host vector via CPU instructions (VMGEXIT), not a network protocol. No network-layer control can intercept it.
- SELinux / AppArmor on the host — The OOB access occurs inside the kernel's KVM subsystem at ring 0. Mandatory access controls operate at a higher abstraction layer and cannot constrain intra-kernel memory access.
- Standard EDR on the host — Most EDR agents do not monitor KVM VMGEXIT handling or slab allocator corruption patterns. They may detect post-exploitation activity but not the initial OOB access.
The supporting signals.
| In-the-wild exploitation | No evidence. Not listed in CISA KEV. No GreyNoise or threat-intel reporting of active campaigns as of 2026-08-12. |
|---|---|
| Proof of concept | Public. 0xCyberstan/CVE-2026-53360-POC — demonstrates read oracle, constrained write, and failure oracle primitives. Generated 73 KASAN violations on AMD EPYC 7443P. Not a full exploit chain. |
| EPSS | 0.00183 (low, bottom quintile). Reflects the narrow attack surface — requires guest-level access on SEV-SNP hosts. |
| KEV status | Not listed as of 2026-08-12. |
| CVSS vector | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H (8.8 HIGH). The S:C (Scope Changed) is the key flag — confirms guest-to-host boundary crossing. AV:L reflects that the attacker must be inside the guest VM. |
| Affected versions | Linux kernel 6.10 through pre-fix (introduced in commit 9b54e248d264, May 2024). Only hosts with CONFIG_KVM_AMD_SEV compiled in AND running SEV-SNP guests are reachable. |
| Fixed versions | 6.1.177, 6.6.144, 6.12.95 (LTS), 6.18.38, 7.0.14, 7.1.3 (stable), 7.2-rc1 (mainline). Commit db3f219. |
| Exposure / scanning data | No Shodan/Censys/GreyNoise relevance — this is a local guest-to-host vector, not network-scannable. Population is bounded by AMD EPYC SEV-SNP deployments (Azure CVM, GCP Confidential VMs, select on-prem). |
| Disclosed | 2026-07-04 via Linux stable kernel release. |
| Reporter | Fix attributed to upstream KVM/SEV maintainers. PoC by 0xCyberstan (GitHub). |
Sources.
- 0xCyberstan PoC — CVE-2026-53360
- TechVeda — Linux Kernel CVEs to Patch (27 Jun – 4 Jul 2026)
- LWN — Seven stable kernels for Saturday
- TechVeda — Linux Kernel CVEs (18–25 Jul 2026)
- CISA Known Exploited Vulnerabilities Catalog
- LKML — KVM SEV scratch area patch context
- Red Hat Security Advisory RHSA-2026:34911
Why this verdict
- Hypervisor escape primitive: The OOB read/write crosses the guest-host boundary, giving the attacker influence over host kernel memory from inside a VM. Scope:Changed is correctly applied.
- Public PoC with strong primitives: 0xCyberstan's PoC demonstrates read oracle, constrained write, and failure oracle — three building blocks for a full chain. 73 KASAN violations on a single run confirms reliability.
- Role multiplier: KVM is a hypervisor. On confidential-computing hosts (Azure CVM, GCP Confidential VMs, on-prem EPYC enclaves), the blast radius of host compromise is all co-resident VMs plus management plane — fleet-scale impact. This floors the verdict at HIGH.
- Narrow reachable population: Only KVM hosts with
CONFIG_KVM_AMD_SEVcompiled in AND actively running SEV-SNP guests are vulnerable. This is a single-digit percentage of all Linux KVM deployments, primarily concentrated in cloud CVM tiers and regulated on-prem confidential-computing enclaves. This provides the 0.8-point downward adjustment from 8.8. - No weaponized exploit chain yet: The PoC demonstrates primitives but not end-to-end code execution. Heap grooming + KASLR bypass are required for full weaponization, adding meaningful attacker effort.
Why not higher?
Upgrading to CRITICAL would require either active in-the-wild exploitation or a broader reachable population. The vulnerable code path is gated behind SEV-SNP guest execution, which is a minority of KVM deployments — most KVM hosts never launch an SNP guest and are entirely unreachable. The PoC demonstrates primitives, not a turnkey exploit, and KASLR adds a second barrier.
Why not lower?
Downgrading below HIGH would violate the hypervisor-role floor. This is a VM escape bug in KVM — the chain demonstrably ends in host kernel memory corruption from an unprivileged guest position. A public PoC with reliable primitives exists. For any organization running SEV-SNP workloads, the blast radius is fleet-scale. The low EPSS reflects attack-surface narrowness, not low impact.
Crowdsourced verification payload.
Run this script on each candidate KVM host (not inside the guest). Requires root to read kernel config. Invoke as: sudo bash check_cve_2026_53360.sh. No arguments needed.
#!/usr/bin/env bash
# CVE-2026-53360 checker — KVM SEV-SNP PSC heap OOB
# Run on KVM HOST as root. Outputs VULNERABLE / PATCHED / UNKNOWN.
set -euo pipefail
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
# 1. Check if SEV-SNP is even compiled / enabled
SEV_ENABLED=0
if [ -f /sys/module/kvm_amd/parameters/sev_snp ]; then
SNP_PARAM=$(cat /sys/module/kvm_amd/parameters/sev_snp 2>/dev/null || echo 'N')
if [ "$SNP_PARAM" = "Y" ] || [ "$SNP_PARAM" = "1" ]; then
SEV_ENABLED=1
fi
fi
if [ "$SEV_ENABLED" -eq 0 ]; then
echo -e "${GREEN}NOT AFFECTED${NC} — SEV-SNP is not enabled on this host."
echo "PATCHED"
exit 0
fi
# 2. Get running kernel version
KVER=$(uname -r)
echo "Kernel: $KVER"
echo "SEV-SNP: enabled"
# 3. Check against known-fixed versions
# Fixed in: 6.1.177, 6.6.144, 6.12.95, 6.18.38, 7.0.14, 7.1.3
version_gte() {
printf '%s\n%s' "$2" "$1" | sort -V -C
}
# Extract base version (strip distro suffixes for comparison)
BASE_VER=$(echo "$KVER" | grep -oP '^[0-9]+\.[0-9]+\.[0-9]+')
MAJOR_MINOR=$(echo "$BASE_VER" | grep -oP '^[0-9]+\.[0-9]+')
case "$MAJOR_MINOR" in
6.1) FIX="6.1.177" ;;
6.6) FIX="6.6.144" ;;
6.12) FIX="6.12.95" ;;
6.18) FIX="6.18.38" ;;
7.0) FIX="7.0.14" ;;
7.1) FIX="7.1.3" ;;
7.2|7.3|7.4|7.5|8.*) FIX="0.0.0" ;; # post-fix mainline
*) echo -e "${YELLOW}UNKNOWN${NC} — kernel $KVER not in checked branches."
echo "UNKNOWN"
exit 2 ;;
esac
if [ "$FIX" = "0.0.0" ] || version_gte "$BASE_VER" "$FIX"; then
echo -e "${GREEN}PATCHED${NC} — $KVER >= $FIX"
echo "PATCHED"
exit 0
else
echo -e "${RED}VULNERABLE${NC} — $KVER < $FIX (fixed in $FIX)"
echo "VULNERABLE"
exit 1
fi