Commit 3c9ba27
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.
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
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent f1b55db commit 3c9ba27
1 file changed
+38
-20
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 | | |
| |||
238 | 256 | | |
239 | 257 | | |
240 | 258 | | |
241 | | - | |
| 259 | + | |
242 | 260 | | |
243 | 261 | | |
244 | 262 | | |
| |||
252 | 270 | | |
253 | 271 | | |
254 | 272 | | |
255 | | - | |
| 273 | + | |
256 | 274 | | |
257 | 275 | | |
258 | 276 | | |
| |||
323 | 341 | | |
324 | 342 | | |
325 | 343 | | |
326 | | - | |
| 344 | + | |
327 | 345 | | |
328 | 346 | | |
329 | 347 | | |
| |||
335 | 353 | | |
336 | 354 | | |
337 | 355 | | |
338 | | - | |
| 356 | + | |
339 | 357 | | |
340 | 358 | | |
341 | 359 | | |
| |||
357 | 375 | | |
358 | 376 | | |
359 | 377 | | |
360 | | - | |
| 378 | + | |
361 | 379 | | |
362 | 380 | | |
363 | 381 | | |
364 | 382 | | |
365 | 383 | | |
366 | | - | |
| 384 | + | |
367 | 385 | | |
368 | 386 | | |
369 | 387 | | |
| |||
375 | 393 | | |
376 | 394 | | |
377 | 395 | | |
378 | | - | |
| 396 | + | |
379 | 397 | | |
380 | 398 | | |
381 | 399 | | |
382 | 400 | | |
383 | 401 | | |
384 | 402 | | |
385 | | - | |
| 403 | + | |
386 | 404 | | |
387 | 405 | | |
388 | 406 | | |
| |||
395 | 413 | | |
396 | 414 | | |
397 | 415 | | |
398 | | - | |
| 416 | + | |
399 | 417 | | |
400 | 418 | | |
401 | 419 | | |
| |||
404 | 422 | | |
405 | 423 | | |
406 | 424 | | |
407 | | - | |
| 425 | + | |
408 | 426 | | |
409 | 427 | | |
410 | 428 | | |
| |||
418 | 436 | | |
419 | 437 | | |
420 | 438 | | |
421 | | - | |
| 439 | + | |
422 | 440 | | |
423 | 441 | | |
424 | 442 | | |
425 | 443 | | |
426 | 444 | | |
427 | 445 | | |
428 | | - | |
| 446 | + | |
429 | 447 | | |
430 | 448 | | |
431 | 449 | | |
| |||
455 | 473 | | |
456 | 474 | | |
457 | 475 | | |
458 | | - | |
| 476 | + | |
459 | 477 | | |
460 | 478 | | |
461 | 479 | | |
| |||
490 | 508 | | |
491 | 509 | | |
492 | 510 | | |
493 | | - | |
| 511 | + | |
494 | 512 | | |
495 | 513 | | |
496 | 514 | | |
| |||
852 | 870 | | |
853 | 871 | | |
854 | 872 | | |
855 | | - | |
| 873 | + | |
856 | 874 | | |
857 | 875 | | |
858 | 876 | | |
859 | 877 | | |
860 | 878 | | |
861 | 879 | | |
862 | 880 | | |
863 | | - | |
| 881 | + | |
864 | 882 | | |
865 | 883 | | |
866 | 884 | | |
| |||
875 | 893 | | |
876 | 894 | | |
877 | 895 | | |
878 | | - | |
| 896 | + | |
879 | 897 | | |
880 | 898 | | |
881 | 899 | | |
| |||
886 | 904 | | |
887 | 905 | | |
888 | 906 | | |
889 | | - | |
| 907 | + | |
890 | 908 | | |
891 | 909 | | |
892 | 910 | | |
| |||
0 commit comments