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 psitriggerpoll+0x3c/0x140 Read of size 8 at addr ffff3de3d50bd308 by task systemd/1
psitriggerpoll+0x3c/0x140 cgrouppressurepoll+0x70/0xa0 cgroupfilepoll+0x8c/0x100 kernfsfoppoll+0x11c/0x1c0 epitempoll.isra.0+0x188/0x2c0
Allocated by task 1: cgroupfileopen+0x88/0x388 kernfsfopopen+0x73c/0xaf0 dodentryopen+0x5fc/0x1200 vfsopen+0xa0/0x3f0 doopen+0x7e8/0xd08 pathopenat+0x2fc/0x6b0 dofilpopen+0x174/0x368
Freed by task 8462: cgroupfilerelease+0x130/0x1f8 kernfsdrainopenfiles+0x17c/0x440 kernfsdrain+0x2dc/0x360 kernfsshow+0x1b8/0x288 cgroupfileshow+0x150/0x268 cgrouppressurewrite+0x1dc/0x340 cgroupfilewrite+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 cgroupfilerelease() - Frees of->priv through kernfsdrainopenfiles() 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) ... epollwait kernfsfoppoll kernfsgetactive = true echo 0 > cgroup.pressure ... cgroupfileshow kernfsshow // inactive kn kernfsdrainopenfiles cft->release(of); kfree(ctx); ... kernfsgetactive = false echo 1 > cgroup.pressure kernfsshow kernfsactivateone(kn); kernfsfoppoll kernfsgetactive = true cgroupfilepoll psitriggerpoll // UAF ... end: close(fd)
To address this issue, introduce kernfsgetactiveof() for kernfs open files to obtain active references. This function will fail if the open file has been released. Replace kernfsgetactive() with kernfsgetactiveof() to prevent further operations on released file descriptors.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
To reproduce/confirm the issue and as immediate mitigation, disable PSI pressure monitoring by writing '0' to test/cgroup.pressure (e.g., 'echo 0 > test/cgroup.pressure' / 'echo 0 > cgroup.pressure').
cgroup.pressure (test/cpu.pressure and test/cgroup.pressure) monitoring = disabled (echo 0 > test/cgroup.pressure / echo 0 > cgroup.pressure)
Event History
Frequently Asked Questions
What is the severity of CVE-2025-39881?
CVE-2025-39881 has been classified as a medium severity vulnerability due to the potential impact on system stability.
How do I fix CVE-2025-39881?
To fix CVE-2025-39881, users should update their Linux kernel to the latest stable version where the vulnerability has been patched.
What software is affected by CVE-2025-39881?
CVE-2025-39881 affects the Linux kernel, specifically its PSI (Pressure Stall Information) monitoring mechanism.
What type of vulnerability is CVE-2025-39881?
CVE-2025-39881 is a use-after-free (UAF) vulnerability, which may lead to unexpected behavior in the kernel.
Can CVE-2025-39881 be exploited remotely?
While CVE-2025-39881 primarily impacts local system stability, it may also have implications if an attacker can execute code on the affected system.