public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [syzbot] [hfs?] KMSAN: uninit-value in hfs_read_inode
@ 2024-11-22  4:48 syzbot
  2024-11-22 22:19 ` Leo Stone
  2024-11-23 19:49 ` [PATCH] hfs: Sanity check the root record Leo Stone
  0 siblings, 2 replies; 8+ messages in thread
From: syzbot @ 2024-11-22  4:48 UTC (permalink / raw)
  To: linux-fsdevel, linux-kernel, syzkaller-bugs

Hello,

syzbot found the following issue on:

HEAD commit:    f66d6acccbc0 Merge tag 'x86_urgent_for_v6.12' of git://git..
git tree:       upstream
console+strace: https://syzkaller.appspot.com/x/log.txt?x=1381b2e8580000
kernel config:  https://syzkaller.appspot.com/x/.config?x=570f86970553dcd2
dashboard link: https://syzkaller.appspot.com/bug?extid=2db3c7526ba68f4ea776
compiler:       Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1400bb5f980000
C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=162c8ac0580000

Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/83bb4f67b45d/disk-f66d6acc.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/cb0cedffb310/vmlinux-f66d6acc.xz
kernel image: https://storage.googleapis.com/syzbot-assets/3af8c8949657/bzImage-f66d6acc.xz
mounted in repro: https://storage.googleapis.com/syzbot-assets/bfaab1c46dcf/mount_0.gz

IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+2db3c7526ba68f4ea776@syzkaller.appspotmail.com

loop0: detected capacity change from 0 to 64
=====================================================
BUG: KMSAN: uninit-value in hfs_inode_read_fork fs/hfs/inode.c:287 [inline]
BUG: KMSAN: uninit-value in hfs_read_inode+0x10ae/0x1690 fs/hfs/inode.c:343
 hfs_inode_read_fork fs/hfs/inode.c:287 [inline]
 hfs_read_inode+0x10ae/0x1690 fs/hfs/inode.c:343
 inode_insert5+0x1dd/0x970 fs/inode.c:1281
 iget5_locked+0xfe/0x1d0 fs/inode.c:1338
 hfs_iget+0x121/0x240 fs/hfs/inode.c:403
 hfs_fill_super+0x2098/0x23c0 fs/hfs/super.c:431
 mount_bdev+0x39a/0x520 fs/super.c:1693
 hfs_mount+0x4d/0x60 fs/hfs/super.c:457
 legacy_get_tree+0x114/0x290 fs/fs_context.c:662
 vfs_get_tree+0xb1/0x5a0 fs/super.c:1814
 do_new_mount+0x71f/0x15e0 fs/namespace.c:3507
 path_mount+0x742/0x1f10 fs/namespace.c:3834
 do_mount fs/namespace.c:3847 [inline]
 __do_sys_mount fs/namespace.c:4057 [inline]
 __se_sys_mount+0x722/0x810 fs/namespace.c:4034
 __x64_sys_mount+0xe4/0x150 fs/namespace.c:4034
 x64_sys_call+0x255a/0x3ba0 arch/x86/include/generated/asm/syscalls_64.h:166
 do_syscall_x64 arch/x86/entry/common.c:52 [inline]
 do_syscall_64+0xcd/0x1e0 arch/x86/entry/common.c:83
 entry_SYSCALL_64_after_hwframe+0x77/0x7f

Local variable rec created at:
 hfs_fill_super+0x67/0x23c0 fs/hfs/super.c:383
 mount_bdev+0x39a/0x520 fs/super.c:1693

CPU: 1 UID: 0 PID: 5790 Comm: syz-executor415 Not tainted 6.12.0-rc7-syzkaller-00216-gf66d6acccbc0 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/30/2024
=====================================================


---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.

If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title

If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.

If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)

If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report

If you want to undo deduplication, reply with:
#syz undup

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [syzbot] [hfs?] KMSAN: uninit-value in hfs_read_inode
  2024-11-22  4:48 [syzbot] [hfs?] KMSAN: uninit-value in hfs_read_inode syzbot
@ 2024-11-22 22:19 ` Leo Stone
  2024-11-22 22:52   ` syzbot
  2024-11-23 19:49 ` [PATCH] hfs: Sanity check the root record Leo Stone
  1 sibling, 1 reply; 8+ messages in thread
From: Leo Stone @ 2024-11-22 22:19 UTC (permalink / raw)
  To: syzbot+2db3c7526ba68f4ea776, brauner, quic_jjohnson, jack, viro,
	sandeen
  Cc: Leo Stone, linux-fsdevel, linux-kernel, syzkaller-bugs

After the call to hfs_bnode_read on line 356 of fs/hfs/super.c, the
struct hfs_cat_rec, which is supposed to be for the root dir, has
type HFS_CDR_FIL. Only the first 70 bytes of that struct are then
initialized, because the entrylength passed into hfs_bnode_read is
70, corresponding to the size of struct hfs_cat_dir. This causes
uninitialized values to be used later on when the hfs_cat_rec
union is treated as a hfs_cat_file.

Add a check to make sure the retrieved record has the correct type
for the root directory (HFS_CDR_DIR).

#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master

---
 fs/hfs/super.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/fs/hfs/super.c b/fs/hfs/super.c
index 3bee9b5dba5e..02d78992eefd 100644
--- a/fs/hfs/super.c
+++ b/fs/hfs/super.c
@@ -354,6 +354,8 @@ static int hfs_fill_super(struct super_block *sb, struct fs_context *fc)
 			goto bail_hfs_find;
 		}
 		hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength);
+		if (rec.type != HFS_CDR_DIR)
+			res = -EIO;
 	}
 	if (res)
 		goto bail_hfs_find;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [syzbot] [hfs?] KMSAN: uninit-value in hfs_read_inode
  2024-11-22 22:19 ` Leo Stone
@ 2024-11-22 22:52   ` syzbot
  0 siblings, 0 replies; 8+ messages in thread
From: syzbot @ 2024-11-22 22:52 UTC (permalink / raw)
  To: brauner, jack, leocstone, linux-fsdevel, linux-kernel,
	quic_jjohnson, sandeen, syzkaller-bugs, viro

Hello,

syzbot has tested the proposed patch and the reproducer did not trigger any issue:

Reported-by: syzbot+2db3c7526ba68f4ea776@syzkaller.appspotmail.com
Tested-by: syzbot+2db3c7526ba68f4ea776@syzkaller.appspotmail.com

Tested on:

commit:         28eb75e1 Merge tag 'drm-next-2024-11-21' of https://gi..
git tree:       upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=1382175f980000
kernel config:  https://syzkaller.appspot.com/x/.config?x=ef9abe59471e0aee
dashboard link: https://syzkaller.appspot.com/bug?extid=2db3c7526ba68f4ea776
compiler:       Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
patch:          https://syzkaller.appspot.com/x/patch.diff?x=16088c90580000

Note: testing is done by a robot and is best-effort only.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH] hfs: Sanity check the root record
  2024-11-22  4:48 [syzbot] [hfs?] KMSAN: uninit-value in hfs_read_inode syzbot
  2024-11-22 22:19 ` Leo Stone
@ 2024-11-23 19:49 ` Leo Stone
  2024-11-26  9:33   ` Jan Kara
  1 sibling, 1 reply; 8+ messages in thread
From: Leo Stone @ 2024-11-23 19:49 UTC (permalink / raw)
  To: syzbot+2db3c7526ba68f4ea776, brauner, quic_jjohnson, jack, viro,
	sandeen
  Cc: Leo Stone, linux-fsdevel, linux-kernel, syzkaller-bugs, shuah,
	anupnewsmail, linux-kernel-mentees

In the syzbot reproducer, the hfs_cat_rec for the root dir has type
HFS_CDR_FIL after being read with hfs_bnode_read() in hfs_super_fill().
This indicates it should be used as an hfs_cat_file, which is 102 bytes.
Only the first 70 bytes of that struct are initialized, however,
because the entrylength passed into hfs_bnode_read() is still the length of
a directory record. This causes uninitialized values to be used later on,
when the hfs_cat_rec union is treated as the larger hfs_cat_file struct.

Add a check to make sure the retrieved record has the correct type
for the root directory (HFS_CDR_DIR).

Reported-by: syzbot+2db3c7526ba68f4ea776@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=2db3c7526ba68f4ea776
Tested-by: syzbot+2db3c7526ba68f4ea776@syzkaller.appspotmail.com
Signed-off-by: Leo Stone <leocstone@gmail.com>
---
 fs/hfs/super.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/fs/hfs/super.c b/fs/hfs/super.c
index 3bee9b5dba5e..02d78992eefd 100644
--- a/fs/hfs/super.c
+++ b/fs/hfs/super.c
@@ -354,6 +354,8 @@ static int hfs_fill_super(struct super_block *sb, struct fs_context *fc)
 			goto bail_hfs_find;
 		}
 		hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength);
+		if (rec.type != HFS_CDR_DIR)
+			res = -EIO;
 	}
 	if (res)
 		goto bail_hfs_find;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] hfs: Sanity check the root record
  2024-11-23 19:49 ` [PATCH] hfs: Sanity check the root record Leo Stone
@ 2024-11-26  9:33   ` Jan Kara
  2024-11-26 17:21     ` Leo Stone
  0 siblings, 1 reply; 8+ messages in thread
From: Jan Kara @ 2024-11-26  9:33 UTC (permalink / raw)
  To: Leo Stone
  Cc: syzbot+2db3c7526ba68f4ea776, brauner, quic_jjohnson, jack, viro,
	sandeen, linux-fsdevel, linux-kernel, syzkaller-bugs, shuah,
	anupnewsmail, linux-kernel-mentees

On Sat 23-11-24 11:49:47, Leo Stone wrote:
> In the syzbot reproducer, the hfs_cat_rec for the root dir has type
> HFS_CDR_FIL after being read with hfs_bnode_read() in hfs_super_fill().
> This indicates it should be used as an hfs_cat_file, which is 102 bytes.
> Only the first 70 bytes of that struct are initialized, however,
> because the entrylength passed into hfs_bnode_read() is still the length of
> a directory record. This causes uninitialized values to be used later on,
> when the hfs_cat_rec union is treated as the larger hfs_cat_file struct.
> 
> Add a check to make sure the retrieved record has the correct type
> for the root directory (HFS_CDR_DIR).

This certainly won't hurt but shouldn't we also add some stricter checks
for entry length so that we know we've loaded enough data to have full info
about the root dir?

								Honza

> 
> Reported-by: syzbot+2db3c7526ba68f4ea776@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=2db3c7526ba68f4ea776
> Tested-by: syzbot+2db3c7526ba68f4ea776@syzkaller.appspotmail.com
> Signed-off-by: Leo Stone <leocstone@gmail.com>
> ---
>  fs/hfs/super.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/fs/hfs/super.c b/fs/hfs/super.c
> index 3bee9b5dba5e..02d78992eefd 100644
> --- a/fs/hfs/super.c
> +++ b/fs/hfs/super.c
> @@ -354,6 +354,8 @@ static int hfs_fill_super(struct super_block *sb, struct fs_context *fc)
>  			goto bail_hfs_find;
>  		}
>  		hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength);
> +		if (rec.type != HFS_CDR_DIR)
> +			res = -EIO;
>  	}
>  	if (res)
>  		goto bail_hfs_find;
> -- 
> 2.43.0
> 
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] hfs: Sanity check the root record
  2024-11-26  9:33   ` Jan Kara
@ 2024-11-26 17:21     ` Leo Stone
  2024-11-26 21:52       ` Jan Kara
  0 siblings, 1 reply; 8+ messages in thread
From: Leo Stone @ 2024-11-26 17:21 UTC (permalink / raw)
  To: Jan Kara
  Cc: syzbot+2db3c7526ba68f4ea776, brauner, quic_jjohnson, viro,
	sandeen, linux-fsdevel, linux-kernel, syzkaller-bugs, shuah,
	anupnewsmail, linux-kernel-mentees

Hello,

On Tue, Nov 26, 2024 at 10:33:13AM +0100, Jan Kara wrote:
> 
> This certainly won't hurt but shouldn't we also add some stricter checks
> for entry length so that we know we've loaded enough data to have full info
> about the root dir?

Yes, that would be a good idea. Do we want to keep the existing checks
and just make sure we have at least enough to initialize the struct:

if (fd.entrylength > sizeof(rec) || fd.entrylength < 0 ||
    fd.entrylength < sizeof(rec.dir)) {
	res = -EIO;
	goto bail_hfs_find;
}

Or be even stricter and only accept the exact length:

if (fd.entrylength != sizeof(rec.dir)) {
	res = -EIO;
	goto bail_hfs_find;
}

Thanks for your feedback,
Leo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] hfs: Sanity check the root record
  2024-11-26 17:21     ` Leo Stone
@ 2024-11-26 21:52       ` Jan Kara
  2024-12-01  4:27         ` Leo Stone
  0 siblings, 1 reply; 8+ messages in thread
From: Jan Kara @ 2024-11-26 21:52 UTC (permalink / raw)
  To: Leo Stone
  Cc: Jan Kara, syzbot+2db3c7526ba68f4ea776, brauner, quic_jjohnson,
	viro, sandeen, linux-fsdevel, linux-kernel, syzkaller-bugs, shuah,
	anupnewsmail, linux-kernel-mentees

On Tue 26-11-24 09:21:50, Leo Stone wrote:
> Hello,
> 
> On Tue, Nov 26, 2024 at 10:33:13AM +0100, Jan Kara wrote:
> > 
> > This certainly won't hurt but shouldn't we also add some stricter checks
> > for entry length so that we know we've loaded enough data to have full info
> > about the root dir?
> 
> Yes, that would be a good idea. Do we want to keep the existing checks
> and just make sure we have at least enough to initialize the struct:
> 
> if (fd.entrylength > sizeof(rec) || fd.entrylength < 0 ||
>     fd.entrylength < sizeof(rec.dir)) {
> 	res = -EIO;
> 	goto bail_hfs_find;
> }
> 
> Or be even stricter and only accept the exact length:
> 
> if (fd.entrylength != sizeof(rec.dir)) {
> 	res = -EIO;
> 	goto bail_hfs_find;
> }

Yes, this strict check would make sense to me. I just don't know HFS good
enough whether this is a safe assumption to make so it would be good to
test with some HFS filesystem.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] hfs: Sanity check the root record
  2024-11-26 21:52       ` Jan Kara
@ 2024-12-01  4:27         ` Leo Stone
  0 siblings, 0 replies; 8+ messages in thread
From: Leo Stone @ 2024-12-01  4:27 UTC (permalink / raw)
  To: Jan Kara
  Cc: syzbot+2db3c7526ba68f4ea776, brauner, quic_jjohnson, viro,
	sandeen, linux-fsdevel, linux-kernel, syzkaller-bugs, shuah,
	anupnewsmail, linux-kernel-mentees

On Tue, Nov 26, 2024 at 10:52:54PM +0100, Jan Kara wrote:
> Yes, this strict check would make sense to me. I just don't know HFS good
> enough whether this is a safe assumption to make so it would be good to
> test with some HFS filesystem.

I tested with the System 7.5.3 install disks, as well as 2 disks I
formatted inside System 7 in an emulator. The root directory always had
entrylength of 70, and it looks like every directory has an entrylength
of 70.

I'll resend as a PATCH v2.

Thanks,
Leo

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-12-01  4:27 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-22  4:48 [syzbot] [hfs?] KMSAN: uninit-value in hfs_read_inode syzbot
2024-11-22 22:19 ` Leo Stone
2024-11-22 22:52   ` syzbot
2024-11-23 19:49 ` [PATCH] hfs: Sanity check the root record Leo Stone
2024-11-26  9:33   ` Jan Kara
2024-11-26 17:21     ` Leo Stone
2024-11-26 21:52       ` Jan Kara
2024-12-01  4:27         ` Leo Stone

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox