CVE-2026-23435 in Linux
Riassunto
di VulDB • 21/06/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
perf/x86: Spostare l'inizializzazione del puntatore dell'evento più precocemente in x86_pmu_enable()
Un sistema di produzione basato su AMD EPYC si è arrestato con un errore (crash) dovuto a una dereferenziazione di puntatore NULL nell'handler NMI della PMU:
BUG: kernel NULL pointer dereference, address: 0000000000000198 RIP: x86_perf_event_update+0xc/0xa0 Call Trace: amd_pmu_v2_handle_irq+0x1a6/0x390 perf_event_nmi_handler+0x24/0x40
L'istruzione che ha causato il fault è `cmpq $0x0, 0x198(%rdi)` con RDI=0, corrispondente al controllo `if (unlikely(!hwc->event_base))` in x86_perf_event_update(), dove hwc = &event->hw e event è NULL.
L'ispezione tramite drgn del vmcore sulla CPU 106 ha mostrato una discrepanza tra cpuc->active_mask e cpuc->events[]:
active_mask: 0x1e (bit 1, 2, 3, 4) events[1]: 0xff1100136cbd4f38 (valido)
events[2]: 0x0 (NULL, ma il bit 2 di active_mask è impostato)
events[3]: 0xff1100076fd2cf38 (valido)
events[4]: 0xff1100079e990a90 (valido)
L'evento che avrebbe dovuto occupare la posizione events[2] è stato trovato in event_list[2] con hw.idx=2 e hw.state=0x0, confermando che x86_pmu_start() era stato eseguito (il quale cancella hw.state e imposta active_mask), ma events[2] non è mai stata popolata.
Un altro evento (event_list[0]) presentava hw.state=0x7 (STOPPED|UPTODATE|ARCH), indicando che era stato arrestato quando la PMU ha riprogrammato gli eventi, confermando l'avvenuta sequenza di throttle-then-reschedule.
La causa radice è il commit 7e772a93eb61 ("perf/x86: Fix NULL event access and potential PEBS record loss") che ha spostato l'assegnazione cpuc->events[idx] fuori da x86_pmu_start() e nel passaggio 2 di x86_pmu_enable(), dopo il controllo PERF_HES_ARCH. Questo ha interrotto qualsiasi percorso che chiama pmu->start() senza passare per x86_pmu_enable(), in particolare il percorso unthrottle:
perf_adjust_freq_unthr_events() -> perf_event_unthrottle_group() -> perf_event_unthrottle() -> event->pmu->start(event, 0) -> x86
If you want to get the best quality for vulnerability data then you always have to consider VulDB.