{
  "threat_severity" : "Moderate",
  "public_date" : "2026-10-28T10:35:31Z",
  "bugzilla" : {
    "description" : "kernel: kernel: Denial of Service via race condition in KVM asynchronous page fault handling",
    "id" : "2562721",
    "url" : "https://bugzilla.redhat.com/show_bug.cgi?id=2562721"
  },
  "cvss3" : {
    "cvss3_base_score" : "4.7",
    "cvss3_scoring_vector" : "CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H",
    "status" : "draft"
  },
  "cwe" : "CWE-364",
  "details" : [ "In the Linux kernel, the following vulnerability has been resolved:\nx86/kvm: Don't consume async #PF flags on a kernel #PF in NMI context\nAn async #PF \"page not present\" event arrives through the #PF vector,\nand its reason sits in the per-CPU apf_reason.flags until\n__kvm_handle_async_pf() reads and clears it. If an NMI arrives after\nthe event is injected and before the #PF handler reads the flags, and\nthe NMI handler itself takes a #PF, that fault reads and clears the\nflags belonging to the #PF it interrupted. It then finds interrupts\ndisabled in the NMI context it interrupted, and panics:\nKernel panic - not syncing: Host injected async #PF in interrupt\ndisabled region\nCall Trace:\n<NMI>\npanic+0x52/0x60\n__kvm_handle_async_pf+0xb0/0xb0\nexc_page_fault+0x71/0xb0\nasm_exc_page_fault+0x27/0x30\nRIP: 0010:__get_user_nocheck_8+0x6/0x20\nperf_callchain_user+0x147/0x1a0\nget_perf_callchain+0x12d/0x1c0\n...\nperf_event_nmi_handler+0x26/0x50\nexc_nmi+0xe8/0x110\nRIP: 0010:asm_exc_page_fault+0x0/0x30\n</NMI>\nThe last RIP line shows the NMI landing on the first instruction of\nthe #PF entry. perf with user call chains takes such a fault: the\nsampling NMI walks the user stack with __get_user(), which faults when\na saved frame pointer is not a valid user address or the walk runs off\nthe top of the stack. The same window exists when KVM, running as an\nL1 hypervisor with DELIVERY_AS_PF_VMEXIT, reads the flags itself after\na #PF VM-exit.\nThe NMI entry code saves and restores CR2 for this nesting, but not the\nasync #PF reason. Andy Lutomirski described the race, with perf as the\nexample, when async #PF delivery was reworked in 2020 [1]. Saving and\nclearing the flags across the NMI, next to CR2, was discussed there but\nnot merged.\nSince that rework, Linux has stopped setting KVM_ASYNC_PF_SEND_ALWAYS,\nso the host delivers \"page not present\" only for user mode faults and\na kernel-mode fault in NMI context (including kernel-mode #MC and #DB)\ncannot be an async page fault.  In that case, return without touching\nthe flags so that the interrupted handler finds them intact.\nTested on v7.3-rc5 in a 4-vCPU, 2 GiB guest restored from a snapshot\nwhose memory is served on demand through userfaultfd, so that reading\nit back takes async #PFs, while every thread samples hardware cycles\nwith user call chains and points its frame pointer at an unmapped page.\nWithout this patch the guest panicked as above in 3 of 3 runs. With it,\nthe guest survived 3 of 3 runs of 60 seconds, and the host counted\n148,441 to 153,334 kvm_async_pf_not_present events in the first 20\nseconds of each. On 6.18.50 the results were the same: the guest\npanicked without the patch and survived with it.", "A flaw was found in the Linux kernel's KVM (Kernel-based Virtual Machine) subsystem. When an asynchronous page fault is interrupted by a Non-Maskable Interrupt (NMI) that also encounters a page fault, the kernel improperly clears the pending fault status flags belonging to the interrupted handler. A local user can trigger this condition, causing the guest kernel to panic and resulting in a Denial of Service (DoS)." ],
  "package_state" : [ {
    "product_name" : "Red Hat Enterprise Linux 10",
    "fix_state" : "Not affected",
    "package_name" : "kernel",
    "cpe" : "cpe:/o:redhat:enterprise_linux:10"
  }, {
    "product_name" : "Red Hat Enterprise Linux 6",
    "fix_state" : "Not affected",
    "package_name" : "kernel",
    "cpe" : "cpe:/o:redhat:enterprise_linux:6"
  }, {
    "product_name" : "Red Hat Enterprise Linux 7",
    "fix_state" : "Not affected",
    "package_name" : "kernel",
    "cpe" : "cpe:/o:redhat:enterprise_linux:7"
  }, {
    "product_name" : "Red Hat Enterprise Linux 7",
    "fix_state" : "Not affected",
    "package_name" : "kernel-rt",
    "cpe" : "cpe:/o:redhat:enterprise_linux:7"
  }, {
    "product_name" : "Red Hat Enterprise Linux 8",
    "fix_state" : "Not affected",
    "package_name" : "kernel",
    "cpe" : "cpe:/o:redhat:enterprise_linux:8"
  }, {
    "product_name" : "Red Hat Enterprise Linux 8",
    "fix_state" : "Not affected",
    "package_name" : "kernel-rt",
    "cpe" : "cpe:/o:redhat:enterprise_linux:8"
  }, {
    "product_name" : "Red Hat Enterprise Linux 9",
    "fix_state" : "Not affected",
    "package_name" : "kernel",
    "cpe" : "cpe:/o:redhat:enterprise_linux:9"
  }, {
    "product_name" : "Red Hat Enterprise Linux 9",
    "fix_state" : "Not affected",
    "package_name" : "kernel-rt",
    "cpe" : "cpe:/o:redhat:enterprise_linux:9"
  }, {
    "product_name" : "Red Hat OpenShift Container Platform 4",
    "fix_state" : "Not affected",
    "package_name" : "openshift/ose-rhel-coreos-8",
    "cpe" : "cpe:/a:redhat:openshift:4"
  }, {
    "product_name" : "Red Hat OpenShift Container Platform 4",
    "fix_state" : "Not affected",
    "package_name" : "openshift/ose-rhel-coreos-9",
    "cpe" : "cpe:/a:redhat:openshift:4"
  } ],
  "references" : [ "https://www.cve.org/CVERecord?id=CVE-2026-99178\nhttps://nvd.nist.gov/vuln/detail/CVE-2026-99178\nhttps://git.kernel.org/pub/scm/linux/security/vulns.git/plain/cve/published/2026/CVE-2026-99178.mbox" ],
  "name" : "CVE-2026-99178",
  "csaw" : false
}