From: Kees Cook <kees@kernel.org>
To: Mateusz Guzik <mjguzik@gmail.com>
Cc: syzbot <syzbot+48a99e426f29859818c0@syzkaller.appspotmail.com>,
Theodore Ts'o <tytso@mit.edu>,
akpm@linux-foundation.org, brauner@kernel.org,
gustavoars@kernel.org, linux-hardening@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
syzkaller-bugs@googlegroups.com
Subject: Re: [syzbot] [hardening?] [mm?] BUG: bad usercopy in vfs_readlink
Date: Tue, 4 Feb 2025 07:30:08 -0800 [thread overview]
Message-ID: <202502040717.FCEFDB7E0@keescook> (raw)
In-Reply-To: <CAGudoHHCXHA=7e8M=6jMVqbh8=keRBBF8yHvDm9PnyeN6Bb7Xw@mail.gmail.com>
On Tue, Feb 04, 2025 at 12:38:30PM +0100, Mateusz Guzik wrote:
> On Tue, Feb 4, 2025 at 10:46 AM syzbot
> <syzbot+48a99e426f29859818c0@syzkaller.appspotmail.com> wrote:
> >
> > Hello,
> >
> > syzbot found the following issue on:
> >
> > HEAD commit: 69b8923f5003 Merge tag 'for-linus-6.14-ofs4' of git://git...
> > git tree: upstream
> > console+strace: https://syzkaller.appspot.com/x/log.txt?x=1258aeb0580000
> > kernel config: https://syzkaller.appspot.com/x/.config?x=57ab43c279fa614d
> > dashboard link: https://syzkaller.appspot.com/bug?extid=48a99e426f29859818c0
> > 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=15825724580000
> > C reproducer: https://syzkaller.appspot.com/x/repro.c?x=1658aeb0580000
> >
> > Downloadable assets:
> > disk image: https://storage.googleapis.com/syzbot-assets/ea84ac864e92/disk-69b8923f.raw.xz
> > vmlinux: https://storage.googleapis.com/syzbot-assets/6a465997b4e0/vmlinux-69b8923f.xz
> > kernel image: https://storage.googleapis.com/syzbot-assets/d72b67b2bd15/bzImage-69b8923f.xz
> > mounted in repro: https://storage.googleapis.com/syzbot-assets/7c2919610764/mount_0.gz
> >
> > The issue was bisected to:
> >
> > commit bae80473f7b0b25772619e7692019b1549d4a82c
> > Author: Mateusz Guzik <mjguzik@gmail.com>
> > Date: Wed Nov 20 11:20:35 2024 +0000
> >
> > ext4: use inode_set_cached_link()
> >
>
> This looks like a case of a deliberately corrupted image.
>
> I added back a debug printk I used when writing the patch before. For
> correct cases it reports:
>
> [ 19.574861] __ext4_iget: inode ff18d9bec05977c8 [/etc/environment]
> i_size 16 strlen 16
> [ 19.585987] __ext4_iget: inode ff18d9bed6f25c68
> [/etc/alternatives/awk] i_size 21 strlen 21
> [ 19.590419] __ext4_iget: inode ff18d9bed6f24108 [/usr/bin/gawk]
> i_size 13 strlen 13
> [ 19.592199] __ext4_iget: inode ff18d9bed6abeea8
> [libassuan.so.0.8.5] i_size 18 strlen 18
> [ 19.593804] __ext4_iget: inode ff18d9bed6f29368
> [libsigsegv.so.2.0.7] i_size 19 strlen 19
>
> etc.
>
> However, the bogus case is:
> [ 52.161476] __ext4_iget: inode ff18d9bed1cc2a38
> [/tmp/syz-imagegen43743633/file0/file0] i_size 131109
> strlen 37
>
> That is i_size is out of sync with strlen.
>
> Prior to my patch this happened to work because the copying was in
> fact issuing strlen to find the size every time.
>
> Given this code in fs/ext4/inode.c:
> 5008 } else if (ext4_inode_is_fast_symlink(inode)) {
> 5009 inode->i_op = &ext4_fast_symlink_inode_operations;
> 5010 nd_terminate_link(ei->i_data, inode->i_size,
> 5011 sizeof(ei->i_data) - 1);
>
> To me this looks like a pre-existing bug in ext4 which just happened
This gets clamped to i_data size, though, so I don't see a bug. Is there
still a code path where i_size is getting used? It looks like the buffer
overflow was introduced with bae80473f7b0 ("ext4: use inode_set_cached_link()"),
more details below...
> to get exposed with:
>
> 5012 inode_set_cached_link(inode, (char *)ei->i_data,
> 5013 inode->i_size);
The sanity checker said:
> usercopy: Kernel memory exposure attempt detected from SLUB object 'ext4_inode_cache' (offset 0, size 176)!
The cache was created to make only the i_data field visible:
ext4_inode_cachep = kmem_cache_create_usercopy("ext4_inode_cache",
sizeof(struct ext4_inode_info), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT,
offsetof(struct ext4_inode_info, i_data),
sizeof_field(struct ext4_inode_info, i_data),
init_once);
which is 15 bytes, at offset 0:
struct ext4_inode_info {
__le32 i_data[15]; /* unconverted */
__u32 i_dtime;
So, yes, this seems like a buffer overflow caught by usercopy, where the
bug was as described above. I don't think there was an existing flaw in
ext4, though?
> However, if the strlen thing is indeed the source of truth, the
> inode_set_cached_link call can be trivially patched to use it instead
> of i_size.
Agreed. Please CC me and I can review it. :)
-Kees
--
Kees Cook
next prev parent reply other threads:[~2025-02-04 15:30 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-04 9:46 [syzbot] [hardening?] [mm?] BUG: bad usercopy in vfs_readlink syzbot
2025-02-04 11:38 ` Mateusz Guzik
2025-02-04 15:30 ` Kees Cook [this message]
2025-02-04 15:58 ` Mateusz Guzik
2025-02-04 16:49 ` Mateusz Guzik
2025-02-04 20:30 ` Theodore Ts'o
2025-02-04 20:48 ` Mateusz Guzik
2025-02-04 21:25 ` Mateusz Guzik
2025-02-05 5:26 ` Theodore Ts'o
2025-02-05 12:18 ` Mateusz Guzik
2025-02-05 12:26 ` Mateusz Guzik
2025-02-05 15:20 ` syzbot
2025-02-05 18:21 ` Jan Kara
2025-02-05 18:39 ` Kees Cook
2025-02-06 9:43 ` Jan Kara
2025-02-05 18:53 ` syzbot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202502040717.FCEFDB7E0@keescook \
--to=kees@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=brauner@kernel.org \
--cc=gustavoars@kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mjguzik@gmail.com \
--cc=syzbot+48a99e426f29859818c0@syzkaller.appspotmail.com \
--cc=syzkaller-bugs@googlegroups.com \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.