CVE-2026-23435

In the Linux kernel, the following vulnerability has been resolved: perf/x86: Move event pointer setup earlier in x86_pmu_enable() A production AMD EPYC system crashed with a NULL pointer dereference in the PMU NMI handler: BUG: kernel NULL pointer dereference, address: 0000000000000198 RIP: x86_perf_event_update+0xc/0xa0 Call Trace: <NMI> amd_pmu_v2_handle_irq+0x1a6/0x390 perf_event_nmi_handler+0x24/0x40 The faulting instruction is `cmpq $0x0, 0x198(%rdi)` with RDI=0, corresponding to the `if (unlikely(!hwc->event_base))` check in x86_perf_event_update() where hwc = &event->hw and event is NULL. drgn inspection of the vmcore on CPU 106 showed a mismatch between cpuc->active_mask and cpuc->events[]: active_mask: 0x1e (bits 1, 2, 3, 4) events[1]: 0xff1100136cbd4f38 (valid) events[2]: 0x0 (NULL, but active_mask bit 2 set) events[3]: 0xff1100076fd2cf38 (valid) events[4]: 0xff1100079e990a90 (valid) The event that should occupy events[2] was found in event_list[2] with hw.idx=2 and hw.state=0x0, confirming x86_pmu_start() had run (which clears hw.state and sets active_mask) but events[2] was never populated. Another event (event_list[0]) had hw.state=0x7 (STOPPED|UPTODATE|ARCH), showing it was stopped when the PMU rescheduled events, confirming the throttle-then-reschedule sequence occurred. The root cause is commit 7e772a93eb61 ("perf/x86: Fix NULL event access and potential PEBS record loss") which moved the cpuc->events[idx] assignment out of x86_pmu_start() and into step 2 of x86_pmu_enable(), after the PERF_HES_ARCH check. This broke any path that calls pmu->start() without going through x86_pmu_enable() -- specifically the unthrottle path: perf_adjust_freq_unthr_events() -> perf_event_unthrottle_group() -> perf_event_unthrottle() -> event->pmu->start(event, 0) -> x86_pmu_start() // sets active_mask but not events[] The race sequence is: 1. A group of perf events overflows, triggering group throttle via perf_event_throttle_group(). All events are stopped: active_mask bits cleared, events[] preserved (x86_pmu_stop no longer clears events[] after commit 7e772a93eb61). 2. While still throttled (PERF_HES_STOPPED), x86_pmu_enable() runs due to other scheduling activity. Stopped events that need to move counters get PERF_HES_ARCH set and events[old_idx] cleared. In step 2 of x86_pmu_enable(), PERF_HES_ARCH causes these events to be skipped -- events[new_idx] is never set. 3. The timer tick unthrottles the group via pmu->start(). Since commit 7e772a93eb61 removed the events[] assignment from x86_pmu_start(), active_mask[new_idx] is set but events[new_idx] remains NULL. 4. A PMC overflow NMI fires. The handler iterates active counters, finds active_mask[2] set, reads events[2] which is NULL, and crashes dereferencing it. Move the cpuc->events[hwc->idx] assignment in x86_pmu_enable() to before the PERF_HES_ARCH check, so that events[] is populated even for events that are not immediately started. This ensures the unthrottle path via pmu->start() always finds a valid event pointer.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc7:*:*:*:*:*:*

History

21 Jul 2026, 19:10

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: perf/x86: Mover la configuración del puntero de evento antes en x86_pmu_enable() Un sistema AMD EPYC de producción falló con una desreferencia de puntero NULL en el gestor NMI de la PMU: BUG: desreferencia de puntero NULL del kernel, dirección: 0000000000000198 RIP: x86_perf_event_update+0xc/0xa0 Traza de Llamada: [NMI] amd_pmu_v2_handle_irq+0x1a6/0x390 perf_event_nmi_handler+0x24/0x40 La instrucción que causó el fallo es 'cmpq $0x0, 0x198(%rdi)' con RDI=0, correspondiente a la comprobación 'if (unlikely(!hwc- event_base))' en x86_perf_event_update() donde hwc = &event- hw y event es NULL. La inspección con drgn del vmcore en la CPU 106 mostró una discrepancia entre cpuc- active_mask y cpuc- events[]: active_mask: 0x1e (bits 1, 2, 3, 4) events[1]: 0xff1100136cbd4f38 (válido) events[2]: 0x0 (NULL, pero el bit 2 de active_mask está activado) events[3]: 0xff1100076fd2cf38 (válido) events[4]: 0xff1100079e990a90 (válido) El evento que debería ocupar events[2] se encontró en event_list[2] con hw.idx=2 y hw.state=0x0, confirmando que x86_pmu_start() se había ejecutado (lo que borra hw.state y establece active_mask) pero events[2] nunca fue poblado. Otro evento (event_list[0]) tenía hw.state=0x7 (STOPPED|UPTODATE|ARCH), mostrando que se detuvo cuando la PMU reprogramó los eventos, confirmando que la secuencia de estrangulamiento y luego reprogramación ocurrió. La causa raíz es el commit 7e772a93eb61 ( perf/x86: Solucionar acceso a evento NULL y posible pérdida de registro PEBS ) que movió la asignación de cpuc- events[idx] fuera de x86_pmu_start() y al paso 2 de x86_pmu_enable(), después de la comprobación PERF_HES_ARCH. Esto rompió cualquier ruta que llama a pmu- start() sin pasar por x86_pmu_enable() -- específicamente la ruta de desestrangulamiento: perf_adjust_freq_unthr_events() - perf_event_unthrottle_group() - perf_event_unthrottle() - event- pmu- start(event, 0) - x86_pmu_start() // establece active_mask pero no events[] La secuencia de la condición de carrera es: 1. Un grupo de eventos perf desborda, lo que activa el estrangulamiento del grupo a través de perf_event_throttle_group(). Todos los eventos se detienen: los bits de active_mask se borran, events[] se preserva (x86_pmu_stop ya no borra events[] después del commit 7e772a93eb61). 2. Mientras aún está estrangulado (PERF_HES_STOPPED), x86_pmu_enable() se ejecuta debido a otra actividad de planificación. Los eventos detenidos que necesitan mover contadores obtienen PERF_HES_ARCH establecido y events[old_idx] borrado. En el paso 2 de x86_pmu_enable(), PERF_HES_ARCH hace que estos eventos se omitan -- events[new_idx] nunca se establece. 3. El tick del temporizador desestrángula el grupo a través de pmu- start(). Dado que el commit 7e772a93eb61 eliminó la asignación de events[] de x86_pmu_start(), active_mask[new_idx] se establece pero events[new_idx] permanece NULL. 4. Se dispara una NMI de desbordamiento de PMC. El gestor itera los contadores activos, encuentra active_mask[2] establecido, lee events[2] que es NULL, y falla al desreferenciarlo. Mover la asignación de cpuc- events[hwc- idx] en x86_pmu_enable() a antes de la comprobación PERF_HES_ARCH, para que events[] se pueble incluso para eventos que no se inician inmediatamente. Esto asegura que la ruta de desestrangulamiento a través de pmu- start() siempre encuentre un puntero de evento válido.

23 Apr 2026, 20:59

Type Values Removed Values Added
First Time Linux
Linux linux Kernel
CWE CWE-476
References () https://git.kernel.org/stable/c/886fa869153917d902784098922defa20c3a2fe5 - () https://git.kernel.org/stable/c/886fa869153917d902784098922defa20c3a2fe5 - Patch
References () https://git.kernel.org/stable/c/8d5fae6011260de209aaf231120e8146b14bc8e0 - () https://git.kernel.org/stable/c/8d5fae6011260de209aaf231120e8146b14bc8e0 - Patch
References () https://git.kernel.org/stable/c/c1dd1e2b722d3f1f2e4977dad8d1be78fdfb30cb - () https://git.kernel.org/stable/c/c1dd1e2b722d3f1f2e4977dad8d1be78fdfb30cb - Patch
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 5.5
CPE cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc7:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.19:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:*

03 Apr 2026, 16:16

Type Values Removed Values Added
New CVE

Information

Published : 2026-04-03 16:16

Updated : 2026-07-21 19:10


NVD link : CVE-2026-23435

Mitre link : CVE-2026-23435

CVE.ORG link : CVE-2026-23435


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-476

NULL Pointer Dereference