Description
In the Linux kernel, the following vulnerability has been resolved: perf/x86/intel: Prevent drain_pebs() reentry The PEBS buffer is shared by all events on a CPU, so drain_pebs() must not be reentered. If so, one instance may observe stale buffer state and potentially access out-of-bound memory. Most invocations happen in NMI context, which naturally prevents reentry. However, drain_pebs() is also reachable from process context via intel_pmu_drain_pebs_buffer(). In those paths, the PMU is often already disabled, but not guaranteed. For example, __intel_pmu_pebs_disable() only disables the target counter, so other active counters can still raise a PMI and interrupt an in-flight drain_pebs(). Here is an example, __perf_addr_filters_adjust() perf_event_stop() __perf_event_stop() x86_pmu_stop() (event->pmu->stop) intel_pmu_disable_event() intel_pmu_pebs_disable() __intel_pmu_pebs_disable() intel_pmu_drain_large_pebs() intel_pmu_drain_pebs_buffer() Introduce __intel_pmu_quiesce() and __intel_pmu_resume() helpers and use them in intel_pmu_drain_large_pebs() to disable the full PMU around the intel_pmu_drain_pebs_buffer() call, preventing reentry. Also add a warning in intel_pmu_drain_pebs_buffer() when the full PMU is not disabled.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
b752ea0c28e3f7f0aaaad6abf84f735eebc37a60 to < 9882068ed242fcd4743f53027e8c790e88dcafffaffectedb752ea0c28e3f7f0aaaad6abf84f735eebc37a60 to < 999e482fdf89400cc1ae937680fc05096b4c915baffectedb752ea0c28e3f7f0aaaad6abf84f735eebc37a60 to < a5fe19dd8b3ed5fad6e5e0f0c58c7245043ee4afaffectedb752ea0c28e3f7f0aaaad6abf84f735eebc37a60 to < c55599c0ec2aa020e41a0599c3044c56d8a2e7d9affectedb752ea0c28e3f7f0aaaad6abf84f735eebc37a60 to < a56c03a397e2cd0c4cf8da96dcd6214f7d0e7d8caffecteda9165207b2b07415eeb01b3ac8bb84976ec96984affected6.3.7 to < 6.4affected
Linux Linux
Default version status: affected
6.4affected0 to < 6.4unaffected6.6.160 to ≤ 6.6.*unaffected6.12.114 to ≤ 6.12.*unaffected6.18.53 to ≤ 6.18.*unaffected7.2.7 to ≤ 7.2.*unaffected7.3 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/9882068ed242fcd4743f53027e8c790e88dcafff ↗
- https://git.kernel.org/stable/c/999e482fdf89400cc1ae937680fc05096b4c915b ↗
- https://git.kernel.org/stable/c/a5fe19dd8b3ed5fad6e5e0f0c58c7245043ee4af ↗
- https://git.kernel.org/stable/c/c55599c0ec2aa020e41a0599c3044c56d8a2e7d9 ↗
- https://git.kernel.org/stable/c/a56c03a397e2cd0c4cf8da96dcd6214f7d0e7d8c ↗