In the Linux kernel, the following vulnerability has been resolved:
f2fs: flush inode if atomic file is aborted
Let's flush the inode being aborted atomic operation to avoid stale dirty inode during eviction in this call stack:
f2fsmarkinodedirtysync+0x22/0x40 [f2fs] f2fsabortatomicwrite+0xc4/0xf0 [f2fs] f2fsevictinode+0x3f/0x690 [f2fs] ? sugovstart+0x140/0x140 evict+0xc3/0x1c0 evictinodes+0x17b/0x210 genericshutdownsuper+0x32/0x120 killblocksuper+0x21/0x50 deactivatelockedsuper+0x31/0x90 cleanupmnt+0x100/0x160 taskworkrun+0x59/0x90 doexit+0x33b/0xa50 dogroup_exit+0x2d/0x80 _x64sysexitgroup+0x14/0x20 dosyscall64+0x3b/0x90 entrySYSCALL64afterhwframe+0x63/0xcd
This triggers f2fsbugon() in f2fsevictinode: f2fsbugon(sbi, isinodeflagset(inode, FIDIRTY_INODE));
This fixes the syzbot report:
loop0: detected capacity change from 0 to 131072 F2FS-fs (loop0): invalid crc value F2FS-fs (loop0): Found natbits in checkpoint F2FS-fs (loop0): Mounted with checkpoint version = 48b305e4 ------------[ cut here ]------------ kernel BUG at fs/f2fs/inode.c:869! invalid opcode: 0000 [#1] PREEMPT SMP KASAN CPU: 0 PID: 5014 Comm: syz-executor220 Not tainted 6.4.0-syzkaller-11479-g6cd06ab12d1a #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023 RIP: 0010:f2fsevictinode+0x172d/0x1e00 fs/f2fs/inode.c:869 Code: ff df 48 c1 ea 03 80 3c 02 00 0f 85 6a 06 00 00 8b 75 40 ba 01 00 00 00 4c 89 e7 e8 6d ce 06 00 e9 aa fc ff ff e8 63 22 e2 fd <0f> 0b e8 5c 22 e2 fd 48 c7 c0 a8 3a 18 8d 48 ba 00 00 00 00 00 fc RSP: 0018:ffffc90003a6fa00 EFLAGS: 00010293 RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000 RDX: ffff8880273b8000 RSI: ffffffff83a2bd0d RDI: 0000000000000007 RBP: ffff888077db91b0 R08: 0000000000000007 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000001 R12: ffff888029a3c000 R13: ffff888077db9660 R14: ffff888029a3c0b8 R15: ffff888077db9c50 FS: 0000000000000000(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f1909bb9000 CR3: 00000000276a9000 CR4: 0000000000350ef0 Call Trace: <TASK> evict+0x2ed/0x6b0 fs/inode.c:665 disposelist+0x117/0x1e0 fs/inode.c:698 evictinodes+0x345/0x440 fs/inode.c:748 genericshutdownsuper+0xaf/0x480 fs/super.c:478 killblocksuper+0x64/0xb0 fs/super.c:1417 killf2fssuper+0x2af/0x3c0 fs/f2fs/super.c:4704 deactivatelockedsuper+0x98/0x160 fs/super.c:330 deactivatesuper+0xb1/0xd0 fs/super.c:361 cleanupmnt+0x2ae/0x3d0 fs/namespace.c:1254 taskworkrun+0x16f/0x270 kernel/taskwork.c:179 exittaskwork include/linux/taskwork.h:38 [inline] doexit+0xa9a/0x29a0 kernel/exit.c:874 dogroupexit+0xd4/0x2a0 kernel/exit.c:1024 __dosysexit_group kernel/exit.c:1035 [inline] __sesysexit_group kernel/exit.c:1033 [inline] __x64sysexitgroup+0x3e/0x50 kernel/exit.c:1033 dosyscallx64 arch/x86/entry/common.c:50 [inline] dosyscall64+0x39/0xb0 arch/x86/entry/common.c:80 entrySYSCALL64afterhwframe+0x63/0xcd RIP: 0033:0x7f309be71a09 Code: Unable to access opcode bytes at 0x7f309be719df. RSP: 002b:00007fff171df518 EFLAGS: 00000246 ORIGRAX: 00000000000000e7 RAX: ffffffffffffffda RBX: 00007f309bef7330 RCX: 00007f309be71a09 RDX: 000000000000003c RSI: 00000000000000e7 RDI: 0000000000000001 RBP: 0000000000000001 R08: ffffffffffffffc0 R09: 00007f309bef1e40 R10: 0000000000010600 R11: 0000000000000246 R12: 00007f309bef7330 R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000001 </TASK> Modules linked in: ---[ end trace 0000000000000000 ]--- RIP: 0010:f2fsevictinode+0x172d/0x1e00 fs/f2fs/inode.c:869 Code: ff df 48 c1 ea 03 80 3c 02 00 0f 85 6a 06 00 00 8b 75 40 ba 01 00 00 00 4c 89 e7 e8 6d ce 06 00 e9 aa fc ff ff e8 63 22 e2 fd <0f> 0b e8 5c 22 e2 fd 48 c7 c0 a8 3a 18 8d 48 ba 00 00 00 00 00 fc RSP: 0018:ffffc90003a6fa00 EFLAGS: 00010293 RAX: 0000000000000000 RBX: 0000000000 ---truncated---
{
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2023/53xxx/CVE-2023-53829.json",
"cna_assigner": "Linux"
}