{"id":"CVE-2026-99178","kind":"vulnerability","aliases":["CVE-2026-99178"],"related":[],"title":"Linux KVM guest kernel can panic from async page fault during NMI","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nx86/kvm: Don't consume async #PF flags on a kernel #PF in NMI context\n\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:\n\n  Kernel panic - not syncing: Host injected async #PF in interrupt\ndisabled region\n  Call Trace:\n   <NMI>\n   panic+0x52/0x60\n   __kvm_handle_async_pf+0xb0/0xb0\n   exc_page_fault+0x71/0xb0\n   asm_exc_page_fault+0x27/0x30\n  RIP: 0010:__get_user_nocheck_8+0x6/0x20\n   perf_callchain_user+0x147/0x1a0\n   get_perf_callchain+0x12d/0x1c0\n   ...\n   perf_event_nmi_handler+0x26/0x50\n   exc_nmi+0xe8/0x110\n  RIP: 0010:asm_exc_page_fault+0x0/0x30\n   </NMI>\n\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.\n\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.\n\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.\n\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.","summary":"A race in the x86 KVM async page fault handling lets an NMI that takes a kernel page fault clear the flags of the interrupted fault, causing a kernel panic. The sources describe a denial of service by crash, not code execution.","severity":"unknown","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["hypervisor","infrastructure","kvm","linux-kernel","self-hosted","x86"],"not_affected_if":["no-kvm","non-x86"],"how_to_check":"- `uname -r` on KVM guests and hypervisors, compare against the fixed kernel version in the upstream commit, which the sources do not name\n- Check whether the guest runs with async page fault enabled (`KVM_FEATURE_ASYNC_PF` on the host) and whether perf samples with user call chains are in use (`perf record -g`)","fix":"- Update the Linux kernel to a release that includes the upstream fix for CVE-2026-99178 (the sources do not name the fixed version)\n- Reboot affected guests and hypervisors after the kernel update","status":"open","published_at":"2026-10-28T11:17:38+00:00","first_seen_at":"2026-10-28T11:32:36+00:00","triaged_at":"2026-10-28T11:35:28+00:00","updated_at":"2026-10-28T11:35:28+00:00","category":"infrastructure","confidence":0.6,"triage":{"at":"2026-10-28T11:35:28Z","model":"claude-haiku-5-5","output":{"fix":"- Update the Linux kernel to a release that includes the upstream fix for CVE-2026-99178 (the sources do not name the fixed version)\n- Reboot affected guests and hypervisors after the kernel update","reach":"local","title":"Linux KVM guest kernel can panic from async page fault during NMI","impact":"medium","summary":"A race in the x86 KVM async page fault handling lets an NMI that takes a kernel page fault clear the flags of the interrupted fault, causing a kernel panic. The sources describe a denial of service by crash, not code execution.","category":"infrastructure","nicknames":[],"who_cares":["linux-kernel","kvm","x86","self-hosted","hypervisor"],"confidence":0.6,"needs_auth":"no","worst_case":"kernel panic crashes the guest or host","analyst_note":"Fixed kernel versions and the upstream commit are not in the sources; check the NVD entry and kernel.org stable advisories for the patched release numbers.","how_to_check":"- `uname -r` on KVM guests and hypervisors, compare against the fixed kernel version in the upstream commit, which the sources do not name\n- Check whether the guest runs with async page fault enabled (`KVM_FEATURE_ASYNC_PF` on the host) and whether perf samples with user call chains are in use (`perf record -g`)","needs_analyst":true,"not_affected_if":["non-x86","no-kvm"],"who_is_affected":"Systems running the Linux kernel on x86 with KVM guests that use async page faults, particularly where memory is served on demand (for example restored snapshots via userfaultfd) and where perf samples user stacks. Per the description, an L1 hypervisor using DELIVERY_AS_PF_VMEXIT is also in the window. Bare-metal hosts without KVM guests and non-x86 systems are not described as affected.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.000773,"input_tokens":4336,"output_tokens":679,"severity_before":"unknown"},"analyst_status":null,"analyst_note":null,"search":"'+0':192C,198C,203C,209C,217C,222C,227C,233C,237C,245C '-2026':14A,17A '-99178':15A,18A '0010':212C,240C '1':366C '148':524C '153':527C '2':453C '20':538C '2020':365C '3':504C,506C,513C,515C '334':528C '4':451C '441':525C '6.18.50':543C '60':518C '8':216C 'across':372C 'address':294C 'alway':395C 'andi':348C 'apf_reason.flags':116C 'arriv':102C,129C 'asm':205C,241C 'async':8A,35B,85C,96C,120C,183C,196C,345C,359C,392C,427C,474C,530C 'back':472C 'belong':158C 'call':189C,266C,484C 'callchain':220C,226C 'cannot':424C 'case':432C 'caus':55B 'chain':267C,485C 'clear':48B,124C,155C,369C 'code':69B,334C 'consum':84C 'context':94C,172C,416C 'count':523C 'cpu':115C 'cr2':338C,377C 'crash':67B 'cve':13A,16A 'cycl':481C 'db':423C 'deliv':399C 'deliveri':317C,361C 'demand':465C 'denial':63B 'describ':61B,350C 'disabl':168C,187C 'discuss':379C 'entri':262C,333C 'event':101C,132C,230C,534C 'everi':477C 'exampl':357C 'exc':200C,206C,235C,242C 'execut':70B 'exist':308C 'exit':330C 'fault':10A,37B,47B,54B,152C,202C,208C,244C,271C,283C,407C,413C,429C 'find':166C,443C 'first':257C,537C 'flag':50B,87C,142C,157C,323C,371C,437C 'follow':76C 'frame':287C,489C 'get':213C,224C,280C 'gib':454C 'guest':3A,455C,499C,511C,550C 'handl':38B,119C,195C 'handler':139C,146C,232C,442C 'hardwar':480C 'host':27B,181C,398C,522C 'hypervisor':19B,315C 'includ':417C 'infrastructur':20B 'inject':134C,182C 'instruct':258C 'intact':445C 'interrupt':53B,163C,167C,174C,186C,441C 'kernel':4A,24B,45B,57B,74C,90C,177C,411C,419C 'kernel-mod':410C,418C 'kvm':2A,21B,34B,118C,194C,310C,391C,529C 'l1':314C 'land':254C 'last':248C 'let':39B 'line':250C 'linux':1A,23B,73C,387C 'linux-kernel':22B 'lutomirski':349C 'mc':421C 'memori':461C 'merg':383C 'mode':406C,412C,420C 'nest':341C 'next':375C 'nmi':12A,41B,93C,128C,145C,171C,231C,236C,253C,274C,332C,374C,415C 'nocheck':215C 'page':9A,36B,46B,98C,201C,207C,243C,400C,428C,494C 'panic':6A,58B,176C,178C,191C 'panick':500C,551C 'patch':497C,554C 'per':114C 'per-cpu':113C 'perf':219C,225C,229C,263C,354C 'pf':86C,91C,97C,105C,121C,138C,150C,161C,184C,197C,261C,319C,327C,346C,360C,393C,531C 'pfs':475C 'point':487C 'pointer':288C,490C 'present':100C,402C,533C 'race':30B,352C 'read':122C,140C,153C,321C,470C 'reason':109C,347C 'region':188C 'resolv':80C 'restor':337C,456C 'result':545C 'return':433C 'rework':363C,386C 'rip':211C,239C,249C 'run':298C,311C,507C,516C 'sampl':273C,479C 'save':286C,335C,367C 'second':519C,539C 'self':26B 'self-host':25B 'send':394C 'serv':463C 'servic':65B 'set':390C 'show':251C 'sinc':384C 'sit':110C 'snapshot':459C 'sourc':60B 'stack':278C,304C 'stop':389C 'surviv':512C,556C 'sync':180C 'take':43B,148C,268C,473C 'test':446C 'thread':478C 'top':301C 'touch':435C 'trace':190C 'unmap':493C 'user':214C,221C,265C,277C,281C,293C,405C,483C 'userfaultfd':467C 'v7.3-rc5':448C 'valid':292C 'vcpu':452C 'vector':106C 'vm':329C 'vm-exit':328C 'vmexit':320C 'vulner':77C 'walk':275C,297C 'whose':460C 'window':307C 'without':434C,495C,552C 'x0/0x30':246C 'x12d/0x1c0':228C 'x147/0x1a0':223C 'x26/0x50':234C 'x27/0x30':210C 'x52/0x60':193C 'x6/0x20':218C 'x71/0xb0':204C 'x86':28B,33B 'x86/kvm':81C 'xb0/0xb0':199C 'xe8/0x110':238C","nicknames":[],"mitigations":[],"who_affected":"Systems running the Linux kernel on x86 with KVM guests that use async page faults, particularly where memory is served on demand (for example restored snapshots via userfaultfd) and where perf samples user stacks. Per the description, an L1 hypervisor using DELIVERY_AS_PF_VMEXIT is also in the window. Bare-metal hosts without KVM guests and non-x86 systems are not described as affected.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-28T11:17:38+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-99178","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-99178","severity":null,"published_at":"2026-10-28T11:17:38+00:00","modified_at":"2026-10-28T11:17:38+00:00","first_seen_at":"2026-10-28T11:32:36+00:00","fetched_at":"2026-10-28T11:32:36+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}