kernel_samsung_a53x/fs/jfs
Edward Adam Davis 6122749c1d jfs: Fix uaf in dbFreeBits
[ Upstream commit d6c1b3599b2feb5c7291f5ac3a36e5fa7cedb234 ]

[syzbot reported]
==================================================================
BUG: KASAN: slab-use-after-free in __mutex_lock_common kernel/locking/mutex.c:587 [inline]
BUG: KASAN: slab-use-after-free in __mutex_lock+0xfe/0xd70 kernel/locking/mutex.c:752
Read of size 8 at addr ffff8880229254b0 by task syz-executor357/5216

CPU: 0 UID: 0 PID: 5216 Comm: syz-executor357 Not tainted 6.11.0-rc3-syzkaller-00156-gd7a5aa4b3c00 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 06/27/2024
Call Trace:
 <TASK>
 __dump_stack lib/dump_stack.c:93 [inline]
 dump_stack_lvl+0x241/0x360 lib/dump_stack.c:119
 print_address_description mm/kasan/report.c:377 [inline]
 print_report+0x169/0x550 mm/kasan/report.c:488
 kasan_report+0x143/0x180 mm/kasan/report.c:601
 __mutex_lock_common kernel/locking/mutex.c:587 [inline]
 __mutex_lock+0xfe/0xd70 kernel/locking/mutex.c:752
 dbFreeBits+0x7ea/0xd90 fs/jfs/jfs_dmap.c:2390
 dbFreeDmap fs/jfs/jfs_dmap.c:2089 [inline]
 dbFree+0x35b/0x680 fs/jfs/jfs_dmap.c:409
 dbDiscardAG+0x8a9/0xa20 fs/jfs/jfs_dmap.c:1650
 jfs_ioc_trim+0x433/0x670 fs/jfs/jfs_discard.c:100
 jfs_ioctl+0x2d0/0x3e0 fs/jfs/ioctl.c:131
 vfs_ioctl fs/ioctl.c:51 [inline]
 __do_sys_ioctl fs/ioctl.c:907 [inline]
 __se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893
 do_syscall_x64 arch/x86/entry/common.c:52 [inline]
 do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83

Freed by task 5218:
 kasan_save_stack mm/kasan/common.c:47 [inline]
 kasan_save_track+0x3f/0x80 mm/kasan/common.c:68
 kasan_save_free_info+0x40/0x50 mm/kasan/generic.c:579
 poison_slab_object+0xe0/0x150 mm/kasan/common.c:240
 __kasan_slab_free+0x37/0x60 mm/kasan/common.c:256
 kasan_slab_free include/linux/kasan.h:184 [inline]
 slab_free_hook mm/slub.c:2252 [inline]
 slab_free mm/slub.c:4473 [inline]
 kfree+0x149/0x360 mm/slub.c:4594
 dbUnmount+0x11d/0x190 fs/jfs/jfs_dmap.c:278
 jfs_mount_rw+0x4ac/0x6a0 fs/jfs/jfs_mount.c:247
 jfs_remount+0x3d1/0x6b0 fs/jfs/super.c:454
 reconfigure_super+0x445/0x880 fs/super.c:1083
 vfs_cmd_reconfigure fs/fsopen.c:263 [inline]
 vfs_fsconfig_locked fs/fsopen.c:292 [inline]
 __do_sys_fsconfig fs/fsopen.c:473 [inline]
 __se_sys_fsconfig+0xb6e/0xf80 fs/fsopen.c:345
 do_syscall_x64 arch/x86/entry/common.c:52 [inline]
 do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
 entry_SYSCALL_64_after_hwframe+0x77/0x7f

[Analysis]
There are two paths (dbUnmount and jfs_ioc_trim) that generate race
condition when accessing bmap, which leads to the occurrence of uaf.

Use the lock s_umount to synchronize them, in order to avoid uaf caused
by race condition.

Reported-and-tested-by: syzbot+3c010e21296f33a5dc16@syzkaller.appspotmail.com
Signed-off-by: Edward Adam Davis <eadavis@qq.com>
Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-23 23:21:40 +01:00
..
acl.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
file.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
inode.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ioctl.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_acl.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_btree.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_debug.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_debug.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_dinode.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_discard.c jfs: Fix uaf in dbFreeBits 2024-11-23 23:21:40 +01:00
jfs_discard.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_dmap.c jfs: UBSAN: shift-out-of-bounds in dbFindBits 2024-11-23 23:21:40 +01:00
jfs_dmap.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_dtree.c jfs: fix slab-out-of-bounds Read in dtSearch 2024-11-18 12:13:09 +01:00
jfs_dtree.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_extent.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_extent.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_filsys.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_imap.c jfs: fix out-of-bounds in dbNextAG() and diAlloc() 2024-11-23 23:21:21 +01:00
jfs_imap.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_incore.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_inode.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_inode.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_lock.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_logmgr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_logmgr.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_metapage.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_metapage.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_mount.c jfs: fix uaf in jfs_evict_inode 2024-11-18 12:13:09 +01:00
jfs_superblock.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_txnmgr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_txnmgr.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_types.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_umount.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_unicode.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_unicode.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_uniupr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_xattr.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_xtree.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jfs_xtree.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kconfig Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
namei.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
resize.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
super.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
symlink.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
xattr.c jfs: don't walk off the end of ealist 2024-11-19 14:19:51 +01:00