CVE-2025-39881: kernfs: Fix UAF in polling when open file is released
In the Linux kernel, the following vulnerability has been resolved:
kernfs: Fix UAF in polling when open file is released
A use-after-free (UAF) vulnerability was identified in the PSI (Pressure
Stall Information) monitoring mechanism:
BUG: KASAN: slab-use-after-free in psi_trigger_poll+0x3c/0x140
Read of size 8 at addr ffff3de3d50bd308 by task systemd/1
psi_trigger_poll+0x3c/0x140
cgroup_pressure_poll+0x70/0xa0
cgroup_file_poll+0x8c/0x100
kernfs_fop_poll+0x11c/0x1c0
ep_item_poll.isra.0+0x188/0x2c0
Allocated by task 1:
cgroup_file_open+0x88/0x388
kernfs_fop_open+0x73c/0xaf0
do_dentry_open+0x5fc/0x1200
vfs_open+0xa0/0x3f0
do_open+0x7e8/0xd08
path_openat+0x2fc/0x6b0
do_filp_open+0x174/0x368
Freed by task 8462:
cgroup_file_release+0x130/0x1f8
kernfs_drain_open_files+0x17c/0x440
kernfs_drain+0x2dc/0x360
kernfs_show+0x1b8/0x288
cgroup_file_show+0x150/0x268
cgroup_pressure_write+0x1dc/0x340
cgroup_file_write+0x274/0x548
Reproduction Steps:
1. Open test/cpu.pressure and establish epoll monitoring
2. Disable monitoring: echo 0 > test/cgroup.pressure
3. Re-enable monitoring: echo 1 > test/cgroup.pressure
The race condition occurs because:
1. When cgroup.pressure is disabled (echo 0 > cgroup.pressure), it:
- Releases PSI triggers via cgroup_file_release()
- Frees of->priv through kernfs_drain_open_files()
2. While epoll still holds reference to the file and continues polling
3. Re-enabling (echo 1 > cgroup.pressure) accesses freed of->priv
epolling disable/enable cgroup.pressure
fd=open(cpu.pressure)
while(1)
...
epoll_wait
kernfs_fop_poll
kernfs_get_active = true echo 0 > cgroup.pressure
... cgroup_file_show
kernfs_show
// inactive kn
kernfs_drain_open_files
cft->release(of);
kfree(ctx);
...
kernfs_get_active = false
echo 1 > cgroup.pressure
kernfs_show
kernfs_activate_one(kn);
kernfs_fop_poll
kernfs_get_active = true
cgroup_file_poll
psi_trigger_poll
// UAF
...
end: close(fd)
To address this issue, introduce kernfs_get_active_of() for kernfs open
files to obtain active references. This function will fail if the open file
has been released. Replace kernfs_get_active() with kernfs_get_active_of()
to prevent further operations on released file descriptors.
Security readout for executives and security teams
Plain-English summary
CVE-2025-39881 is a Linux kernel use-after-free in cgroup Pressure Stall Information monitoring. A local, low-privileged user could trigger a race involving polling and pressure-monitor reconfiguration. The supplied CVSS score is 7.8, reflecting potential compromise of confidentiality, integrity, and availability, although the sources do not document proven real-world impact.
Executive priority
Patch promptly on shared Linux infrastructure and systems running untrusted workloads. Lower urgency is reasonable for isolated, single-purpose hosts without untrusted local access, but confirm exposure rather than relying solely on network controls. No active exploitation is established by the supplied evidence.
Technical view
An epoll reference can continue polling a cgroup pressure file after cgroup_file_release() frees its private context. Disabling and re-enabling cgroup.pressure can then make psi_trigger_poll() access freed memory. The fix introduces kernfs_get_active_of(), which refuses an active reference when the open file has already been released.
Likely exposure
Exposure is limited to affected Linux kernels with cgroups and PSI monitoring available, where an attacker already has local low-privileged access and sufficient cgroup pressure-file access. It is not described as remotely exploitable. The supplied affected-version data is ambiguous, so distribution-specific kernel status and backports must be checked.
Exploitation context
The supplied CVSS vector indicates local access, low complexity, low privileges, and no user interaction. The record is not in KEV, and the supplied sources provide no evidence of active exploitation or a public weaponized exploit. Reproduction and a kernel crash trace establish the underlying race, but not reliable privilege escalation.
Researcher notes
The vulnerable lifetime transition spans kernfs open-file draining, cgroup_file_release(), epoll-held file references, and later PSI polling. The fix changes reference acquisition from the kernfs node to the open-file-aware kernfs_get_active_of(). Exact vulnerable ranges and backport coverage cannot be reliably derived from the supplied version list alone.
Mitigation direction
Upgrade to a vendor-supported kernel containing the kernfs_get_active_of() fix.
Check Linux distribution advisories because vendors may backport fixes without changing upstream version numbers.
Restrict untrusted local access and unnecessary cgroup pressure-control permissions until patched.
Prioritize multi-user, shared-hosting, and container platforms where untrusted workloads can reach relevant cgroup files.
Validation and detection
Inventory running kernel versions across hosts and container worker nodes.
Confirm vendor advisories identify each installed kernel package as fixed or unaffected.
Verify the kernel source or vendor changelog includes the referenced kernfs active-open-file fix.
Review whether untrusted users or workloads can access PSI and cgroup pressure controls.
Monitor kernel logs for KASAN reports, use-after-free faults, or crashes involving psi_trigger_poll.
Generated from the cited source records. This long-tail analysis has not been individually reviewed by a named human.
Potential ATT&CK relevance
Conservative CVE-to-ATT&CK context
These mappings and lookup hints may be relevant to the vulnerability behavior, CWE, affected product, or exposure path. Glexia-inferred context is not an official MITRE, ATT&CK, CWE, or CVE Program mapping.
ATT&CK lookup starting points
Use these exact CWE pages and searches to review the Glexia ATT&CK library from this CVE's weakness and description context.
cve · low confidence lookup
CVE-2025-39881 mapping review
Open the CVE-to-ATT&CK bridge for reviewed, inferred, or future official mappings tied to this CVE.
These fields come from the CVE record and ADP containers, not from Glexia's Take. They preserve time-varying source decisions such as CISA SSVC, KEV status, CVSS metrics, and provider references.
1CVSS vectors
3Timeline events
1ADP providers
7Source links
CVSS vector scores
1 official score
We collect every scored CVSS vector available in the official CNA and ADP containers. When more than one version is present, the table keeps the source vectors side by side instead of collapsing them into the highest score.