CVE-2023-53089
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
02/05/2025
Last modified:
05/05/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
ext4: fix task hung in ext4_xattr_delete_inode<br />
<br />
Syzbot reported a hung task problem:<br />
==================================================================<br />
INFO: task syz-executor232:5073 blocked for more than 143 seconds.<br />
Not tainted 6.2.0-rc2-syzkaller-00024-g512dee0c00ad #0<br />
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.<br />
task:syz-exec232 state:D stack:21024 pid:5073 ppid:5072 flags:0x00004004<br />
Call Trace:<br />
<br />
context_switch kernel/sched/core.c:5244 [inline]<br />
__schedule+0x995/0xe20 kernel/sched/core.c:6555<br />
schedule+0xcb/0x190 kernel/sched/core.c:6631<br />
__wait_on_freeing_inode fs/inode.c:2196 [inline]<br />
find_inode_fast+0x35a/0x4c0 fs/inode.c:950<br />
iget_locked+0xb1/0x830 fs/inode.c:1273<br />
__ext4_iget+0x22e/0x3ed0 fs/ext4/inode.c:4861<br />
ext4_xattr_inode_iget+0x68/0x4e0 fs/ext4/xattr.c:389<br />
ext4_xattr_inode_dec_ref_all+0x1a7/0xe50 fs/ext4/xattr.c:1148<br />
ext4_xattr_delete_inode+0xb04/0xcd0 fs/ext4/xattr.c:2880<br />
ext4_evict_inode+0xd7c/0x10b0 fs/ext4/inode.c:296<br />
evict+0x2a4/0x620 fs/inode.c:664<br />
ext4_orphan_cleanup+0xb60/0x1340 fs/ext4/orphan.c:474<br />
__ext4_fill_super fs/ext4/super.c:5516 [inline]<br />
ext4_fill_super+0x81cd/0x8700 fs/ext4/super.c:5644<br />
get_tree_bdev+0x400/0x620 fs/super.c:1282<br />
vfs_get_tree+0x88/0x270 fs/super.c:1489<br />
do_new_mount+0x289/0xad0 fs/namespace.c:3145<br />
do_mount fs/namespace.c:3488 [inline]<br />
__do_sys_mount fs/namespace.c:3697 [inline]<br />
__se_sys_mount+0x2d3/0x3c0 fs/namespace.c:3674<br />
do_syscall_x64 arch/x86/entry/common.c:50 [inline]<br />
do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80<br />
entry_SYSCALL_64_after_hwframe+0x63/0xcd<br />
RIP: 0033:0x7fa5406fd5ea<br />
RSP: 002b:00007ffc7232f968 EFLAGS: 00000202 ORIG_RAX: 00000000000000a5<br />
RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 00007fa5406fd5ea<br />
RDX: 0000000020000440 RSI: 0000000020000000 RDI: 00007ffc7232f970<br />
RBP: 00007ffc7232f970 R08: 00007ffc7232f9b0 R09: 0000000000000432<br />
R10: 0000000000804a03 R11: 0000000000000202 R12: 0000000000000004<br />
R13: 0000555556a7a2c0 R14: 00007ffc7232f9b0 R15: 0000000000000000<br />
<br />
==================================================================<br />
<br />
The problem is that the inode contains an xattr entry with ea_inum of 15<br />
when cleaning up an orphan inode . When evict inode , the reference<br />
counting of the corresponding EA inode is decreased. When EA inode is<br />
found by find_inode_fast() in __ext4_iget(), it is found that the EA inode<br />
holds the I_FREEING flag and waits for the EA inode to complete deletion.<br />
As a result, when inode is being deleted, we wait for inode to<br />
complete the deletion, resulting in an infinite loop and triggering Hung<br />
Task. To solve this problem, we only need to check whether the ino of EA<br />
inode and parent is the same before getting EA inode.
Impact
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/0f7bfd6f8164be32dbbdf36aa1e5d00485c53cd7
- https://git.kernel.org/stable/c/1aec41c98cce61d19ce89650895e51b9f3cdef13
- https://git.kernel.org/stable/c/2c96c52aeaa6fd9163cfacdd98778b4a0398ef18
- https://git.kernel.org/stable/c/64b72f5e7574020dea62ab733d88a54d903c42a1
- https://git.kernel.org/stable/c/73f7987fe1b82596f1a380e85cd0097ebaae7e01
- https://git.kernel.org/stable/c/94fd091576b12540924f6316ebc0678e84cb2800
- https://git.kernel.org/stable/c/a98160d8f3e6242ca9b7f443f26e7ef3a61ba684
- https://git.kernel.org/stable/c/efddc7e106fdf8d1f62d45e79de78f63b7c04fba