CVE-2026-99178 in Linux
सारांश
द्वारा VulDB • 28/10/2026
Linux kernel में निम्नलिखित कमजोरी को हल किया गया है:
x86/kvm: NMI संदर्भ (context) में कर्नेल #PF पर async #Flags का उपभोग न करें।
एक async #PF "पेज प्रेज़ेंट नहीं" (page not present) इवेंट #PF वेक्टर के माध्यम से आता है, और इसका कारण per-CPU apf_reason.flags में तब तक रहता है जब तक कि __kvm_handle_async_pf() इसे पढ़कर क्लियर न कर दे। यदि एक NMI उस इवेंट को इंजेक्ट किए जाने के बाद और #PF हैंडलर द्वारा फ्लैग्स को पढ़ने से पहले आ जाता है, और NMI हैंडलर स्वयं एक #PF लेता है, तो वह दोष (fault) उन फ्लैग्स को पढ़ता और क्लियर करता है जो उस #PF के संबंधित होते थे जिसे उसने इंटरप्ट किया था। फिर यह पाता है कि NMI संदर्भ में जहां उसे इंटरप्ट किया गया, वहाँ इंटर्प्स (interrupts) डिसेबल्ड हैं, और पैनिक हो जाता है:
Kernel panic - not syncing: Host injected async #PF in interrupt disabled region Call Trace: <NMI> panic+0x52/0x60 __kvm_handle_async_pf+0xb0/0xb0 exc_page_fault+0x71/0xb0 asm_exc_page_fault+0x27/0x30 RIP: 0010:__get_user_nocheck_8+0x6/0x20 perf_callchain_user+0x147/0x1a0 get_perf_callchain+0x12d/0x1c0 ... perf_event_nmi_handler+0x26/0x50 exc_nmi+0xe8/0x110 RIP: 0010:asm_exc_page_fault+0x0/0x30 </NMI>
अंतिम RIP पंक्ति दिखाती है कि NMI #PF एंट्री के पहले इंस्ट्रक्शन पर लैंड करता है। perf with user call chains एक ऐसा फॉल्ट लेता है: सैम्पलिंग NMI __get_user() के साथ यूजर स्टैक को वॉक करती है, जो तब फॉल्ट देती है जब सेव्ड फ्रेम पॉइंटर मान्य यूजर एड्रेस नहीं होता या वॉक स्टैक की ऊपर की ओर चली जाती है। KVM द्वारा DELIVERY_AS_PF_VMEXIT के साथ L1 हाइपर्विज़र के रूप में चलते हुए, एक #PF VM-exit के बाद फ्लैग्स को स्वयं पढ़ने का भी वही विंडो मौजूद होता है।
NMI एंट्री कोड इस नेस्टिंग (nesting) के लिए CR2 को सेव और रीस्टोर करता है, लेकिन async #PF कारण नहीं। 2020 में जब async #PF डिलिवरी को पुनः डिजाइन किया गया था [1], तब एंडी लुटोमिरस्की ने perf को उदाहरण के रूप में इस रेस कंडिशन (race condition) का वर्णन किया। NMI के पार फ्लैग्स को सेव और क्लियर करना, CR2 के बगल में, वहां चर्चित था लेकिन मर्ज नहीं हुआ था।
उस पुनः डिजाइन के बाद, Linux ने KVM_ASYNC_PF_SEND_ALWAYS सेट करने की प्रक्रिया रोक दी है, इसलिए होस्ट "पेज नॉट प्रेज़ेंट" को केवल यूजर मोड फॉल्ट्स के लिए ही डिलिवर करता है और NMI संदर्भ में एक कर्नेल-मोड फॉल्ट (कर्नेल-मोड #MC और #DB सहित) async पेज फॉल्ट नहीं हो सकता। उस स्थिति में, बिना फ्लैग्स को छुए लौटें ताकि इंटरप्ट किए गए हैंडलर उन्हें अक्षत पा सके।
इसका परीक्षण v7.3-rc5 पर एक 4-vCPU, 2 GiB गेस्ट में किया गया जो एक स्नैपशॉट से रीस्टोर किया गया था जिसकी मेमोरी userfaultfd के माध्यम से डिमांड पर सर्व की जाती है, ताकि उसे वापस पढ़ने पर async #PF आएं, जबकि प्रत्येक थ्रेड यूजर कॉल चेन के साथ हार्डवेयर साइकल्स का सैम्पलिंग करता है और अपने फ्रेम पॉइंटर को एक अनमैप्ड पेज की ओर इशारा करता है। इस पैच के बिना गेस्ट 3 में से 3 रनों में ऊपर बताए अनुसार पैनिक हो गया था। इसके साथ, गेस्ट ने 60 सेकंड की 3 में से 3 रनों का सामना किया, और होस्ट ने प्रत्येक के पहले 20 सेकंड में 148,441 से 153,334 kvm_async_pf_not_present इवेंट गिने। 6.18.50 पर परिणाम समान थे: पैच के बिना गेस्ट पैनिक हो गया और इसके साथ बच गया।
Once again VulDB remains the best source for vulnerability data.