CVE-2025-39821

In the Linux kernel, the following vulnerability has been resolved: perf: Avoid undefined behavior from stopping/starting inactive events Calling pmu->start()/stop() on perf events in PERF_EVENT_STATE_OFF can leave event->hw.idx at -1. When PMU drivers later attempt to use this negative index as a shift exponent in bitwise operations, it leads to UBSAN shift-out-of-bounds reports. The issue is a logical flaw in how event groups handle throttling when some members are intentionally disabled. Based on the analysis and the reproducer provided by Mark Rutland (this issue on both arm64 and x86-64). The scenario unfolds as follows: 1. A group leader event is configured with a very aggressive sampling period (e.g., sample_period = 1). This causes frequent interrupts and triggers the throttling mechanism. 2. A child event in the same group is created in a disabled state (.disabled = 1). This event remains in PERF_EVENT_STATE_OFF. Since it hasn't been scheduled onto the PMU, its event->hw.idx remains initialized at -1. 3. When throttling occurs, perf_event_throttle_group() and later perf_event_unthrottle_group() iterate through all siblings, including the disabled child event. 4. perf_event_throttle()/unthrottle() are called on this inactive child event, which then call event->pmu->start()/stop(). 5. The PMU driver receives the event with hw.idx == -1 and attempts to use it as a shift exponent. e.g., in macros like PMCNTENSET(idx), leading to the UBSAN report. The throttling mechanism attempts to start/stop events that are not actively scheduled on the hardware. Move the state check into perf_event_throttle()/perf_event_unthrottle() so that inactive events are skipped entirely. This ensures only active events with a valid hw.idx are processed, preventing undefined behavior and silencing UBSAN warnings. The corrected check ensures true before proceeding with PMU operations. The problem can be reproduced with the syzkaller reproducer:
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc2:*:*:*:*:*:*

History

19 Oct 2026, 21:10

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: perf: Evitar comportamiento indefinido al detener/iniciar eventos inactivos Llamar a pmu->start()/stop() en eventos perf en PERF_EVENT_STATE_OFF puede dejar event->hw.idx en -1. Cuando los controladores de PMU intentan más tarde usar este índice negativo como un exponente de desplazamiento en operaciones bit a bit, esto lleva a informes de UBSAN de desplazamiento fuera de límites. El problema es un fallo lógico en cómo los grupos de eventos manejan la limitación cuando algunos miembros están deshabilitados intencionalmente. Basado en el análisis y el reproductor proporcionado por Mark Rutland (este problema tanto en arm64 como en x86-64). El escenario se desarrolla de la siguiente manera: 1. Un evento líder de grupo se configura con un período de muestreo muy agresivo (por ejemplo, sample_period = 1). Esto causa interrupciones frecuentes y activa el mecanismo de limitación. 2. Se crea un evento hijo en el mismo grupo en un estado deshabilitado (.disabled = 1). Este evento permanece en PERF_EVENT_STATE_OFF. Dado que no ha sido programado en la PMU, su event->hw.idx permanece inicializado en -1. 3. Cuando ocurre la limitación, perf_event_throttle_group() y más tarde perf_event_unthrottle_group() iteran a través de todos los hermanos, incluyendo el evento hijo deshabilitado. 4. Se llama a perf_event_throttle()/unthrottle() en este evento hijo inactivo, que luego llaman a event->pmu->start()/stop(). 5. El controlador de PMU recibe el evento con hw.idx == -1 e intenta usarlo como un exponente de desplazamiento. Por ejemplo, en macros como PMCNTENSET(idx), lo que lleva al informe de UBSAN. El mecanismo de limitación intenta iniciar/detener eventos que no están programados activamente en el hardware. Mover la verificación de estado a perf_event_throttle()/perf_event_unthrottle() para que los eventos inactivos se omitan por completo. Esto asegura que solo los eventos activos con un hw.idx válido sean procesados, previniendo comportamiento indefinido y silenciando las advertencias de UBSAN. La verificación corregida asegura verdadero antes de proceder con las operaciones de PMU. El problema puede ser reproducido con el reproductor de syzkaller:

Information

Published : 2025-09-16 13:15

Updated : 2026-10-19 21:10


NVD link : CVE-2025-39821

Mitre link : CVE-2025-39821

CVE.ORG link : CVE-2025-39821


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-787

Out-of-bounds Write