Commit b14472d
committed
kernfs: Fix UAF in polling when open file is released
commit 3c9ba27 upstream.
JIRA: https://issues.redhat.com/browse/RHEL-122088
Conflicts: Dropped llseek bits, as commit 0fedefd (kernfs: sysfs:
support custom llseek method for sysfs entries) is not part of RHEL-9
CVE: CVE-2025-39881
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.
Fixes: 34f26a1 ("sched/psi: Per-cgroup PSI accounting disable/re-enable interface")
Cc: stable <stable@kernel.org>
Reported-by: Zhang Zhaotian <zhangzhaotian@huawei.com>
Signed-off-by: Chen Ridong <chenridong@huawei.com>
Acked-by: Tejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20250822070715.1565236-2-chenridong@huaweicloud.com
[ Drop llseek bits ]
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 854baafc00c433cccbe0ab4231b77aeb9b637b77)
Signed-off-by: Pavel Reichl <preichl@redhat.com>1 parent 7576bc3 commit b14472d
1 file changed
+36
-18
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
73 | 91 | | |
74 | 92 | | |
75 | 93 | | |
| |||
139 | 157 | | |
140 | 158 | | |
141 | 159 | | |
142 | | - | |
| 160 | + | |
143 | 161 | | |
144 | 162 | | |
145 | 163 | | |
| |||
152 | 170 | | |
153 | 171 | | |
154 | 172 | | |
155 | | - | |
| 173 | + | |
156 | 174 | | |
157 | 175 | | |
158 | 176 | | |
| |||
243 | 261 | | |
244 | 262 | | |
245 | 263 | | |
246 | | - | |
| 264 | + | |
247 | 265 | | |
248 | 266 | | |
249 | 267 | | |
| |||
257 | 275 | | |
258 | 276 | | |
259 | 277 | | |
260 | | - | |
| 278 | + | |
261 | 279 | | |
262 | 280 | | |
263 | 281 | | |
| |||
328 | 346 | | |
329 | 347 | | |
330 | 348 | | |
331 | | - | |
| 349 | + | |
332 | 350 | | |
333 | 351 | | |
334 | 352 | | |
| |||
340 | 358 | | |
341 | 359 | | |
342 | 360 | | |
343 | | - | |
| 361 | + | |
344 | 362 | | |
345 | 363 | | |
346 | 364 | | |
| |||
362 | 380 | | |
363 | 381 | | |
364 | 382 | | |
365 | | - | |
| 383 | + | |
366 | 384 | | |
367 | 385 | | |
368 | 386 | | |
369 | 387 | | |
370 | 388 | | |
371 | | - | |
| 389 | + | |
372 | 390 | | |
373 | 391 | | |
374 | 392 | | |
| |||
380 | 398 | | |
381 | 399 | | |
382 | 400 | | |
383 | | - | |
| 401 | + | |
384 | 402 | | |
385 | 403 | | |
386 | 404 | | |
387 | 405 | | |
388 | 406 | | |
389 | 407 | | |
390 | | - | |
| 408 | + | |
391 | 409 | | |
392 | 410 | | |
393 | 411 | | |
| |||
400 | 418 | | |
401 | 419 | | |
402 | 420 | | |
403 | | - | |
| 421 | + | |
404 | 422 | | |
405 | 423 | | |
406 | 424 | | |
| |||
409 | 427 | | |
410 | 428 | | |
411 | 429 | | |
412 | | - | |
| 430 | + | |
413 | 431 | | |
414 | 432 | | |
415 | 433 | | |
| |||
423 | 441 | | |
424 | 442 | | |
425 | 443 | | |
426 | | - | |
| 444 | + | |
427 | 445 | | |
428 | 446 | | |
429 | 447 | | |
430 | 448 | | |
431 | 449 | | |
432 | 450 | | |
433 | | - | |
| 451 | + | |
434 | 452 | | |
435 | 453 | | |
436 | 454 | | |
| |||
460 | 478 | | |
461 | 479 | | |
462 | 480 | | |
463 | | - | |
| 481 | + | |
464 | 482 | | |
465 | 483 | | |
466 | 484 | | |
| |||
493 | 511 | | |
494 | 512 | | |
495 | 513 | | |
496 | | - | |
| 514 | + | |
497 | 515 | | |
498 | 516 | | |
499 | 517 | | |
| |||
847 | 865 | | |
848 | 866 | | |
849 | 867 | | |
850 | | - | |
| 868 | + | |
851 | 869 | | |
852 | 870 | | |
853 | 871 | | |
854 | 872 | | |
855 | 873 | | |
856 | 874 | | |
857 | 875 | | |
858 | | - | |
| 876 | + | |
859 | 877 | | |
860 | 878 | | |
861 | 879 | | |
| |||
0 commit comments