ZeroHour

CVE-2026-89985

mass

Linux kernel memcg folio-migration race locks wrong memcg lru_lock

CVSS 3.1
7.8 high
EPSS
Published
()
Modified
AI analysis

The Linux kernel's memory cgroup (memcg) subsystem contains a race condition: the object-cgroup reparenting routine (memcg_reparent_objcgs) assumes a folio's objcg always belongs to the folio's NUMA node, but folio migration across nodes breaks that assumption, leaving objcg reparenting and LRU-list reparenting non-atomic. During the race window, an LRU operation on a migrated folio resolves its lock through the objcg and takes the lru_lock of the wrong memcg rather than the lock of the list the folio actually sits on, corrupting lock/list consistency. An attacker is a local user (per the CVSS local, low-privilege vector) able to induce charge/migration/reclaim activity on a system where cross-node folio migration occurs, potentially gaining kernel memory disclosure or corruption and, per the C:H/I:H/A:H scoring, privilege escalation or denial of service. Affected systems are Linux hosts with memory cgroups enabled, most plausibly multi-NUMA machines such as servers and cloud instances running untrusted local workloads. No public proof-of-concept, CISA KEV listing, or in-the-wild exploitation is known.

What to do: Apply a kernel update containing the fix once it reaches the stable branches you track (kernel.org stable trees and your distro's patched kernel packages), and prioritize multi-NUMA hosts that host untrusted local users or multi-tenant workloads. Until patched, restrict local shell access on multi-tenant NUMA servers and confirm exposure by checking NUMA topology (e.g., number of NUMA nodes reported by the platform) and whether memory cgroups are in use; verify the fix is present by confirming the memcg objcg is re-derived on migration in mem_cgroup_migrate()/mem_cgroup_replace_folio().

Affected
Linux kernel (memcg/objcg reparenting and folio migration code)
Estimated exposure
mass≫1,000,000 Linux systems plausibly carry the vulnerable code (kernel ubiquitous on servers, cloud instances and Android; memcg enabled by default in systemd… — Linux runs on hundreds of millions of servers, cloud instances and mobile devices and memory cgroups are enabled by default in systemd-based distributions and cloud fleets, but the cross-node folio-migration trigger only arises on…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

In the Linux kernel, the following vulnerability has been resolved: memcg: keep folio's objcg same as its node memcg_reparent_objcgs() has an inherent assumption that a folio's objcg is the objcg of the folio's node. Folio migration across nodes breaks that assumption: the new folio simply inherits the old folio's objcg while living on a different node. Once the assumption is broken, the reparenting of the folio's objcg and the reparenting of the folio's LRU list are no longer atomic. memcg_reparent_objcgs() handles one node per iteration and drops all the locks in between, so the objcg gets reparented in the iteration for the objcg's node while the LRU list gets spliced in the iteration for the folio's node. Any LRU operation on that folio in between resolves its lruvec through the objcg, and thus takes the lru_lock of the wrong memcg, not the lru_lock of the list the folio is actually on. Fix this by selecting the objcg by folio_nid() at charge time, and by re-deriving it for the destination node in mem_cgroup_migrate() and mem_cgroup_replace_folio().

Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

In the news

No ingested article mentions this CVE yet.