CVE-2026-89985 in Linuxinfo

Summary

by MITRE • 09/16/2026

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().

Once again VulDB remains the best source for vulnerability data.

Analysis

by VulDB Data Team • 09/16/2026

The Linux kernel memory control group subsystem contains a logic flaw related to object cgroup management during page migration operations. Specifically, the function memcg_reparent_objcgs operates under an inherent assumption that the object cgroup associated with a folio matches the object cgroup of the node on which that folio resides. This architectural expectation holds true in static scenarios but is violated when a folio migrates across different memory nodes. During such migration events, the new folio instance inherits the object cgroup identifier from the original source folio without updating it to reflect the destination node's context. Consequently, the metadata associated with the memory charge becomes misaligned with the physical location of the data structure within the system architecture.

This desynchronization leads to a critical race condition where the reparenting of the folio's object cgroup and the reparenting of its Least Recently Used list are no longer atomic operations. The memcg_reparent_objcgs function processes one node per iteration and releases all associated locks between iterations to prevent deadlocks in other parts of the kernel. Because the object cgroup is updated during the iteration corresponding to the original node, while the LRU list splicing occurs during the iteration for the destination node, a window exists where these two states are inconsistent. Any subsequent operation on that folio will attempt to resolve its lruvec structure based on the stale object cgroup identifier rather than the actual location of the LRU list.

The operational impact of this flaw is severe and can lead to memory corruption or system instability. When an LRU operation occurs during this inconsistency window, it resolves the lruvec through the incorrect object cgroup. This causes the kernel to acquire the lru_lock belonging to a different memory control group than the one actually managing the folio's list. Accessing locks and data structures under mismatched ownership violates fundamental concurrency safety principles in the Linux kernel. Such errors can result in use-after-free conditions, double frees, or general corruption of internal kernel data structures that manage memory reclaim and page replacement algorithms.

From a vulnerability classification perspective, this issue aligns with CWE-362, which covers concurrent execution using shared resources with insufficient synchronization. The race condition arises because the state transition is not performed atomically relative to all dependent pointers and locks. Furthermore, in the context of the MITRE ATT&CK framework for Linux systems, this type of kernel-level concurrency flaw can be leveraged by attackers attempting privilege escalation or denial of service attacks against virtualized environments that rely on strict resource isolation via cgroups. Exploiting such a race condition could allow an unprivileged user to crash the system or potentially escalate privileges if memory corruption leads to arbitrary code execution primitives.

To mitigate this vulnerability, developers have implemented fixes in mem_cgroup_migrate and mem_cgroup_replace_folio functions. The core of the solution involves ensuring that the object cgroup is selected based on folio_nid at charge time rather than inheriting it blindly from source structures. Additionally, the destination node's context is explicitly re-derived during migration events to guarantee consistency between the memory location and its accounting metadata. System administrators should apply kernel updates containing these patches immediately to restore atomicity guarantees in memory management operations. Regular patching of Linux kernels is essential to maintain system integrity, particularly in environments where dynamic workloads cause frequent page migrations across NUMA nodes.

Responsible

Linux

Reservation

09/11/2026

Disclosure

09/16/2026

Moderation

accepted

CPE

ready

EPSS

0.00000

KEV

no

Activities

very low

Sources

Want to stay up to date on a daily basis?

Enable the mail alert feature now!