CVE-2026-23198 Overview
A use-after-free vulnerability has been identified in the Linux kernel's KVM (Kernel-based Virtual Machine) subsystem related to irqfd routing type handling during deassignment operations. When deassigning a KVM_IRQFD, the kernel incorrectly clobbers the irqfd's copy of the IRQ routing entry, which breaks kvm_arch_irq_bypass_del_producer() functionality on x86 and arm64 architectures that explicitly look for KVM_IRQ_ROUTING_MSI.
Critical Impact
This vulnerability can result in NULL pointer dereferences, use-after-free conditions, and list corruption, potentially causing system crashes or allowing attackers to exploit memory corruption for privilege escalation in virtualized environments.
Affected Products
- Linux Kernel (KVM subsystem) - multiple versions
- Systems running x86 architecture with AMD AVIC (Advanced Virtual Interrupt Controller)
- Systems running arm64 architecture with KVM virtualization
Discovery Timeline
- 2026-02-14 - CVE CVE-2026-23198 published to NVD
- 2026-02-18 - Last updated in NVD database
Technical Details for CVE-2026-23198
Vulnerability Analysis
The vulnerability exists in the KVM irqfd (interrupt file descriptor) handling mechanism. When an irqfd is deassigned, the kernel incorrectly clobbers the routing entry type without properly notifying architecture-specific code. This creates a race condition where concurrent routing updates can lead to stale routing information being used, and more critically, causes use-after-free conditions when the irqfd structure memory is reallocated and zeroed.
The issue is particularly problematic on AMD systems using AVIC (Advanced Virtual Interrupt Controller), where KVM tracks IRQs being posted to a vCPU in a list whose lifetime is tied to the irqfd. When the routing type is clobbered, KVM incorrectly keeps the IRQ in bypass mode, leading to the irqfd structure being accessed after it has been freed and potentially reallocated.
Root Cause
The root cause is improper synchronization and state management in the irqfd deassignment process. When deassigning an irqfd, the code clobbers the routing entry type before the architecture-specific cleanup code (kvm_arch_irq_bypass_del_producer()) has completed. This function explicitly checks for KVM_IRQ_ROUTING_MSI type, and clobbering the type causes the cleanup to be skipped.
Additionally, once the irqfd is deleted from the list (which happens before the eventfd is detached), it no longer receives updates via kvm_irq_routing_update(). If the irqfd is in bypass mode, IRQs continue to be posted using old routing information, leading to stale data access.
Attack Vector
The vulnerability can be triggered through the following mechanism:
- An attacker with access to KVM virtualization APIs creates an irqfd with MSI routing
- The irqfd enters bypass mode for direct interrupt injection
- During irqfd deassignment, a concurrent routing update or specific timing causes the routing type to be clobbered
- The kvm_arch_irq_bypass_del_producer() function fails to properly clean up because it cannot find the expected KVM_IRQ_ROUTING_MSI type
- This results in either:
- A NULL pointer dereference in amd_iommu_update_ga() when irqfd->irq_bypass_data is accessed after being zeroed
- List corruption on subsequent irqfd assignments when AVIC is inhibited
The vulnerability manifests as kernel crashes with stack traces showing NULL pointer dereferences in amd_iommu_update_ga() or list corruption bugs in __list_add_valid_or_report(). Technical details can be found in the kernel patch commits.
Detection Methods for CVE-2026-23198
Indicators of Compromise
- Kernel panic messages containing BUG: kernel NULL pointer dereference with address 0000000000000018
- Stack traces showing amd_iommu_update_ga, avic_update_iommu_vcpu_affinity, or __avic_vcpu_load in the call chain
- List corruption warnings: list_add corruption. next->prev should be prev followed by invalid opcode errors
- KASAN (Kernel Address Sanitizer) reports indicating use-after-free in KVM irqfd structures
Detection Strategies
- Monitor kernel logs (dmesg, /var/log/kern.log) for NULL pointer dereference errors related to KVM/AVIC components
- Enable KASAN in development/testing environments to detect use-after-free conditions early
- Monitor for unexpected VM crashes or host system instability when performing irqfd operations
- Check for kernel oops messages referencing kvm_amd, kvm, or irqbypass modules
Monitoring Recommendations
- Implement centralized logging for all hypervisor hosts running KVM with AMD AVIC enabled
- Set up alerts for kernel panic events on virtualization infrastructure
- Monitor vCPU load/run operations for anomalous failure patterns
- Track irqfd assignment and deassignment operations through kernel tracing when investigating suspected exploitation
How to Mitigate CVE-2026-23198
Immediate Actions Required
- Apply the kernel patches referenced in the security advisory to all affected systems
- Consider disabling AMD AVIC (avic=0 kernel parameter) as a temporary workaround on AMD systems until patching is complete
- Restrict access to KVM virtualization APIs to trusted users and processes only
- Update to a patched kernel version as soon as available for your distribution
Patch Information
The Linux kernel maintainers have released patches that resolve this vulnerability by verifying that the irqfd is still active before consuming routing information, rather than clobbering the entry type. Multiple patch commits are available:
- Kernel Patch Commit 2284bc1
- Kernel Patch Commit 4385b2f
- Kernel Patch Commit 6d14ba1
- Kernel Patch Commit 959a063
- Kernel Patch Commit b4d37cd
- Kernel Patch Commit b61f9b2
- Kernel Patch Commit ff48c93
Workarounds
- Disable AMD AVIC by adding avic=0 to kernel boot parameters on AMD systems running KVM
- Limit KVM usage to trusted workloads until patching is complete
- Implement additional access controls on /dev/kvm to restrict which users can perform virtualization operations
- Consider migrating critical VMs to patched hosts in environments with mixed kernel versions
# Temporary workaround: Disable AMD AVIC
# Add to kernel boot parameters (e.g., in /etc/default/grub)
GRUB_CMDLINE_LINUX="avic=0"
# Update GRUB configuration
sudo update-grub
# Reboot to apply changes
sudo reboot
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

