CVE-2026-99178 in Linuxinformazioni

Riassunto

di VulDB • 28/10/2026

Nel kernel Linux è stata risolta la seguente vulnerabilità:

x86/kvm: Non consumare i flag async #PF in caso di un #PF del kernel nel contesto NMI

Un evento "page not present" (pagina non presente) asincrono #PF arriva tramite il vettore #PF, e la sua causa è memorizzata nei flags apf_reason per-CPU fino a quando __kvm_handle_async_pf() li legge e cancella. Se un NMI arriva dopo che l'evento è stato iniettato e prima che il gestore del #PF legga i flag, e se anche il gestore dell'NMI genera un #PF, tale fault leggerà e cancellerà i flags appartenenti al #PF interrotto. Successivamente rileverà che le interrupt sono disabilitate nel contesto NMI in cui ha agito, causando un panic:

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>

L'ultima riga RIP mostra l'NMI che atterra sulla prima istruzione dell'entry del #PF. perf con le catene di chiamate utente genera un tale fault: il NMI di campionamento attraversa lo stack utente con __get_user(), che va in fault quando un puntatore al frame salvato non è un indirizzo utente valido o l'esplorazione supera la cima dello stack. La stessa finestra temporale esiste quando KVM, eseguito come hypervisor L1 con DELIVERY_AS_PF_VMEXIT, legge i flag direttamente dopo una VM-exit #PF.

Il codice di entry dell'NMI salva e ripristina CR2 per questa nidificazione, ma non la ragione asincrona del #PF. Andy Lutomirski ha descritto la race condition, usando perf come esempio, quando la consegna degli async #PF è stata riprogettata nel 2020 [1]. Salvare e cancellare i flag attraverso l'NMI, accanto a CR2, era stato discusso in quella sede ma non integrato.

Da tale riprogettazione, Linux ha smesso di impostare KVM_ASYNC_PF_SEND_ALWAYS; pertanto, l'host consegna "page not present" solo per fault in modalità utente e un fault in modalità kernel nel contesto NMI (inclusi #MC e #DB in modalità kernel) non può essere un async page fault. In tal caso, si restituisce senza toccare i flag, affinché il gestore interrotto li trovi integri.

Testato su v7.3-rc5 in una guest a 4 vCPU con 2 GiB di memoria ripristinata da uno snapshot la cui memoria è servita on demand tramite userfaultfd, così che la sua lettura generi async #PF, mentre ogni thread campiona i cicli hardware con catene di chiamate utente e punta il proprio frame pointer su una pagina non mappata. Senza questa patch la guest andava in panic come sopra nel 3 dei 3 run. Con essa, la guest è sopravvissuta al 3 dei 3 run della durata di 60 secondi, e l'host ha contato da 148.441 a 153.334 eventi kvm_async_pf_not_present nei primi 20 secondi di ciascuno. Su 6.18.50 i risultati sono stati gli stessi: la guest andava in panic senza la patch ed è sopravvissuta con essa.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Responsabile

Linux

Prenotare

25/09/2026

Divulgazione

28/10/2026

Moderazione

accettato

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Might our Artificial Intelligence support you?

Check our Alexa App!