CVE-2025-37964

x86/mm: Eliminate window where TLB flushes may be inadvertently skipped

MEDIUM
5.5
CVSS Score
Published: May 20, 2025 at 04:01 PM UTC
Updated: October 15, 2026 at 02:17 AM UTC
5 products affected across 3 vendorsLinux KernelDebian LinuxSIMATIC S7-1500 CPU 1518-4 Pn /dp MFP Firmware

Using Linux by Linux?

Get instant alerts when new vulnerabilities affect Linux - before attackers find them.

Real-time alertsTrack your software stackFree plan available
Severity
MEDIUM5.5
Exploit prediction
EPSS 0.2%

Description

In the Linux kernel, the following vulnerability has been resolved: x86/mm: Eliminate window where TLB flushes may be inadvertently skipped tl;dr: There is a window in the mm switching code where the new CR3 is set and the CPU should be getting TLB flushes for the new mm. But should_flush_tlb() has a bug and suppresses the flush. Fix it by widening the window where should_flush_tlb() sends an IPI. Long Version: === History === There were a few things leading up to this. First, updating mm_cpumask() was observed to be too expensive, so it was made lazier. But being lazy caused too many unnecessary IPIs to CPUs due to the now-lazy mm_cpumask(). So code was added to cull mm_cpumask() periodically[2]. But that culling was a bit too aggressive and skipped sending TLB flushes to CPUs that need them. So here we are again. === Problem === The too-aggressive code in should_flush_tlb() strikes in this window: // Turn on IPIs for this CPU/mm combination, but only // if should_flush_tlb() agrees: cpumask_set_cpu(cpu, mm_cpumask(next)); next_tlb_gen = atomic64_read(&next->context.tlb_gen); choose_new_asid(next, next_tlb_gen, &new_asid, &need_flush); load_new_mm_cr3(need_flush); // ^ After 'need_flush' is set to false, IPIs *MUST* // be sent to this CPU and not be ignored. this_cpu_write(cpu_tlbstate.loaded_mm, next); // ^ Not until this point does should_flush_tlb() // become true! should_flush_tlb() will suppress TLB flushes between load_new_mm_cr3() and writing to 'loaded_mm', which is a window where they should not be suppressed. Whoops. === Solution === Thankfully, the fuzzy "just about to write CR3" window is already marked with loaded_mm==LOADED_MM_SWITCHING. Simply checking for that state in should_flush_tlb() is sufficient to ensure that the CPU is targeted with an IPI. This will cause more TLB flush IPIs. But the window is relatively small and I do not expect this to cause any kind of measurable performance impact. Update the comment where LOADED_MM_SWITCHING is written since it grew yet another user. Peter Z also raised a concern that should_flush_tlb() might not observe 'loaded_mm' and 'is_lazy' in the same order that switch_mm_irqs_off() writes them. Add a barrier to ensure that they are observed in the order they are written.

Affected

Our own answer: ranges merged, affected separated from platform-only, with confidence and review flags.

5.15.179 ≤ v < 5.15.1836.1.129 ≤ v < 6.1.1396.12.16 ≤ v < 6.12.296.13.4 ≤ v < 6.14.76.6.79 ≤ v < 6.6.913dbe889a1b829b4c07e0836ff853fe649e51ce4f5.15.1796.1.1296.12.166.13.46.156.15 rc16.15 rc26.15 rc36.15 rc46.15 rc56.6.796db2526c1d694c91c6e05e2f186c085e9460f202848b5815177582de0e1d0118725378e0fbadca20a04fe3bfc71e28009e20357b79df1e8ef7c9d600b47002ed65ade940839b7f439ff4a194e7d5ec28d1347977661342cb09a304a17701eb2d4aa21dec
Vendor states this is fixed in 02ad4ce144bd27f71f583f667fdf3b3ba0753477 (fixed)
Vendor states this is fixed in 12f703811af043d32b1c8a30001b2fa04d5cd0ac (fixed)
Vendor states this is fixed in 399ec9ca8fc4999e676ff89a90184ec40031cf59 (fixed)
Vendor states this is fixed in d41072906abec8bb8e01ed16afefbaa558908c89 (fixed)
Vendor states this is fixed in d87392094f96e162fa5fa5a8640d70cc0952806f (fixed)
Vendor states this is fixed in fea4e317f9e7e1f449ce90dedc27a2d2a95bee5a (fixed)
Vendor states this is fixed in 5.15.183 (unaffected)
Vendor states this is fixed in 6.1.139 (unaffected)
Vendor states this is fixed in 6.12.29 (unaffected)
Vendor states this is fixed in 6.14 (unaffected)
Vendor states this is fixed in 6.14.7 (unaffected)
Vendor states this is fixed in 6.15 (unaffected)
Vendor states this is fixed in 6.6.91 (unaffected)

References (9)

Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/02ad4ce144bd27f71f583f667fdf3b3ba0753477
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/12f703811af043d32b1c8a30001b2fa04d5cd0ac
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/399ec9ca8fc4999e676ff89a90184ec40031cf59
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/d41072906abec8bb8e01ed16afefbaa558908c89
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/d87392094f96e162fa5fa5a8640d70cc0952806f
Patch
Source: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
https://git.kernel.org/stable/c/fea4e317f9e7e1f449ce90dedc27a2d2a95bee5a
Third Party Advisory
Source: af854a3a-2127-422b-91ae-364da2661108
https://lists.debian.org/debian-lts-announce/2025/08/msg00010.html
Source: 0b142b55-0307-4c5a-b3c9-f314f3fb7c5e
https://cert-portal.siemens.com/productcert/html/ssa-019113.html

CVSS

Attack Vector
LOCAL
Complexity
LOW
Privileges
LOW
User Interaction
NONE
Scope
UNCHANGED
Confidentiality
NONE
Integrity
NONE
Availability
HIGH
Vector?

Quick Info

StatusMODIFIED
CWE
NVD-CWE-noinfo

Get alerted

Stop reading CVE feeds looking for your own stack

Track the products you run and VulnTracker tells you when a new CVE affects them — with what is known about fixing it, and nothing about the rest.

Free plan, no card