CVE-2026-89513
High · 8.8CVSS
8.8
EPSS
0.2%
Published
Sep 11, 2026
CISA due date
—
Cloudanix analysis
A bug in Linux virtualization on RISC-V chips can let a virtual machine smash the host computer’s memory and crash or take over that machine.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Low
- Impact
- Full Compromise
- Component
- OS kernel
- Class
- Buffer Overflow
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
A guest-controlled integer overflow in RISC-V KVM's SBI PMU EVENT_GET_INFO path multiplies num_events by sizeof(*einfo) into a 32-bit size. On RV64 a large num_events wraps the product (e.g. to 16 bytes), so KVM allocates a tiny slab object then iterates the original count, producing kernel slab out-of-bounds reads and writes in the hypervisor (changed scope from guest to host).
Why it matters to the business
A malicious or compromised RISC-V virtual machine—including a nested guest—can crash the host or corrupt hypervisor memory, taking down or exposing every workload on that machine. Impact is host-wide confidentiality, integrity, and availability, but the issue is RISC-V KVM-specific, not in CISA KEV, has no known exploits (maturity None), and a very low, flat EPSS (~0.00165 over 30 days). Treat as urgent on RISC-V virtualization hosts; elsewhere the practical mass-exploitation risk remains limited 32 days after publication.
How an attack unfolds
An attacker who already runs code in a RISC-V KVM guest (or nested guest) issues an SBI PMU EVENT_GET_INFO ecall with a crafted num_events so the 32-bit size computation overflows and KVM allocates far less memory than the following loop uses. Out-of-bounds reads and writes then hit adjacent kernel slab objects in kvm_riscv_vcpu_pmu_event_info. Heap corruption can panic the host or be turned into guest-to-host privilege escalation; no named threat actors or ransomware campaigns are associated with this flaw.
How to fix it
Install a Linux kernel build that includes the RISC-V KVM PMU EVENT_GET_INFO fix: shared-memory size stored in size_t with multiplication-overflow rejection, allocation via kvcalloc() with GFP_KERNEL_ACCOUNT and __GFP_NOWARN, and an unsigned long loop index matching num_events. Use your distro or vendor kernel package; no per-product fixed versions were supplied with this record. Reboot onto the patched kernel. Until then, do not run untrusted or nested guests on RISC-V KVM hosts and restrict guest access to SBI PMU where operations allow.
How to confirm the fix worked
Confirm the running kernel changelog or package notes the RISC-V KVM PMU event-info array size overflow fix, and that kvm_riscv_vcpu_pmu_event_info no longer stores num_events * sizeof(*einfo) in a 32-bit integer. After install, reboot and verify uname -r matches the patched build. On source trees, check for size_t sizing, overflow rejection, kvcalloc, GFP_KERNEL_ACCOUNT, and an unsigned long loop index. Do not probe live hosts with oversized num_events.
Typical attack path
- Obtain code execution in a RISC-V KVM guest or nested guest that can issue SBI ecalls
- Call SBI PMU EVENT_GET_INFO with a guest-controlled num_events that overflows the 32-bit size calculation
- Cause KVM to allocate an undersized event-info buffer then loop over the original num_events
- Trigger slab out-of-bounds reads/writes in the host KVM PMU handler
- Corrupt neighboring kernel heap to deny service on the host or escalate from guest to hypervisor
How to detect it
This is a host-kernel memory-corruption bug; evidence of attempted or successful use appears in host kernel logs, kdump/vmcore, and KASAN/KUP reports—not in guest userland. Search dmesg, journalctl -k, /var/log/kern.log, and crash dumps for slab-out-of-bounds or Oops in kvm_riscv_vcpu_pmu_event_info, reached via kvm_sbi_ext_pmu_handler and kvm_riscv_vcpu_sbi_ecall during kvm_arch_vcpu_ioctl_run. Correlate with RISC-V KVM vCPU threads and nested-guest activity. Allocation traces showing __kmalloc followed immediately by that PMU handler with a tiny (e.g. 16-byte) object are consistent with the overflow. No public exploit tooling or named actor TTPs are documented; absence of these logs does not prove the host was never targeted.
- BUG: KASAN: slab-out-of-bounds in kvm_riscv_vcpu_pmu_event_info
- kvm_riscv_vcpu_pmu_event_info
- kvm_sbi_ext_pmu_handler
- kvm_riscv_vcpu_sbi_ecall
- kvm_riscv_vcpu_exit
- kvm_arch_vcpu_ioctl_run
- KASAN: slab-out-of-bounds
What your security team should do
- Inventory RISC-V hosts running KVM and patch/reboot them first; this CVE does not apply to non-RISC-V kernels
- Block or tightly control untrusted and nested guests on unpatched RISC-V KVM until the fix is live
- Disable or limit guest SBI PMU if the workload does not require it
- Hunt kernel logs and crash dumps for KASAN/OOPS in the KVM PMU SBI path (see detection_guidance)
- Track distro kernel advisories for the exact package version; EPSS is low and KEV is false, but host-escape class bugs should still be closed on affected virtualization nodes
The record
In the Linux kernel, the following vulnerability has been resolved: RISC-V: KVM: Fix PMU event info array size overflow SBI PMU EVENT_GET_INFO stores guest-controlled num_events * sizeof(*einfo) in a 32-bit integer. On RV64, num_events = 0x10000001 makes 0x100000010 truncate to 16. KVM then allocates one entry but loops over the original num_events, causing out-of-bounds reads and writes. A nested guest triggered: BUG: KASAN: slab-out-of-bounds in kvm_riscv_vcpu_pmu_event_info+0xa4/0x142 Read of size 4 at addr ff600000074d46b0 by task init/1 Call Trace: [<ffffffff8006471c>] kvm_riscv_vcpu_pmu_event_info+0xa4/0x142 [<ffffffff800690c0>] kvm_sbi_ext_pmu_handler+0xca/0x268 [<ffffffff8006779e>] kvm_riscv_vcpu_sbi_ecall+0xec/0x1e6 [<ffffffff8006008c>] kvm_riscv_vcpu_exit+0x48c/0x540 [<ffffffff8005ea0a>] kvm_arch_vcpu_ioctl_run+0x37e/0xc80 Allocated by task 1: __kmalloc_noprof+0x19e/0x4b0 kvm_riscv_vcpu_pmu_event_info+0x72/0x142 kvm_sbi_ext_pmu_handler+0xca/0x268 kvm_riscv_vcpu_sbi_ecall+0xec/0x1e6 kvm_riscv_vcpu_exit+0x48c/0x540 kvm_arch_vcpu_ioctl_run+0x37e/0xc80 The buggy address is located 0 bytes to the right of allocated 16-byte region [ff600000074d46a0, ff600000074d46b0) Store the shared-memory size in size_t and reject multiplication overflow. Allocate the guest-driven array with GFP_KERNEL_ACCOUNT so it is charged to kmemcg, and use __GFP_NOWARN to suppress allocation failure warnings. Use kvcalloc() to allow vmalloc fallback and an unsigned long loop index to match num_events.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|