From: Baokun Li <libaokun1@huawei.com>
To: Qianqiang Liu <qianqiang.liu@163.com>, <tytso@mit.edu>,
Jan Kara <jack@suse.cz>
Cc: <adilger.kernel@dilger.ca>,
syzbot <syzbot+f792df426ff0f5ceb8d1@syzkaller.appspotmail.com>,
<linux-ext4@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<syzkaller-bugs@googlegroups.com>,
Yang Erkun <yangerkun@huawei.com>
Subject: Re: [PATCH] ext4: fix out-of-bounds issue in ext4_xattr_set_entry
Date: Tue, 8 Oct 2024 15:40:39 +0800 [thread overview]
Message-ID: <d62a25e9-04de-4309-98d1-22a4f9b5bb49@huawei.com> (raw)
In-Reply-To: <Zu+8aQBJgMn7xVws@thinkpad.lan>
On 2024/9/22 14:42, Qianqiang Liu wrote:
> syzbot has found an out-of-bounds issue in ext4_xattr_set_entry:
>
> ==================================================================
> BUG: KASAN: out-of-bounds in ext4_xattr_set_entry+0x8ce/0x1f60 fs/ext4/xattr.c:1781
> Read of size 18446744073709551572 at addr ffff888036426850 by task syz-executor264/5095
>
> CPU: 0 UID: 0 PID: 5095 Comm: syz-executor264 Not tainted 6.11.0-syzkaller-03917-ga940d9a43e62 #0
> Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014
> 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
> kasan_check_range+0x282/0x290 mm/kasan/generic.c:189
> __asan_memmove+0x29/0x70 mm/kasan/shadow.c:94
> ext4_xattr_set_entry+0x8ce/0x1f60 fs/ext4/xattr.c:1781
> [...]
> ==================================================================
>
> This issue is caused by a negative size in memmove.
> We need to check for this.
>
> Fixes: dec214d00e0d ("ext4: xattr inode deduplication")
> Reported-by: syzbot+f792df426ff0f5ceb8d1@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=f792df426ff0f5ceb8d1
> Tested-by: syzbot+f792df426ff0f5ceb8d1@syzkaller.appspotmail.com
> Signed-off-by: Qianqiang Liu <qianqiang.liu@163.com>
> ---
> fs/ext4/xattr.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
> index 46ce2f21fef9..336badb46246 100644
> --- a/fs/ext4/xattr.c
> +++ b/fs/ext4/xattr.c
> @@ -1776,7 +1776,14 @@ static int ext4_xattr_set_entry(struct ext4_xattr_info *i,
> } else if (s->not_found) {
> /* Insert new name. */
> size_t size = EXT4_XATTR_LEN(name_len);
> - size_t rest = (void *)last - (void *)here + sizeof(__u32);
> + size_t rest;
> +
> + if (last < here) {
> + ret = -ENOSPC;
> + goto out;
> + } else {
> + rest = (void *)last - (void *)here + sizeof(__u32);
> + }
>
> memmove((void *)here + size, here, rest);
> memset(here, 0, size);
This change just passes syzbot's test cases without fixing the real
problem.
The root cause of the problem is that the inode's xattr block is marked as
free in the block bitmap, so that block is allocated to the ea inode
resulting in the data in the xattr block being overwritten, and the last of
the second lookups changing resulting in out-of-bounds access.
The stack that triggers the problem is as follows:
// An inode with an xattr block of 33.
__ext4_mark_inode_dirty
__ext4_expand_extra_isize
ext4_expand_extra_isize_ea
ext4_xattr_make_inode_space
// Move xattr from inode to block
ext4_xattr_move_to_block
// Find out if the xattr exists in the block
ext4_xattr_block_find
// If xattr does not exist, here == last
xattr_find_entry
// Add a new xattr to the block
ext4_xattr_block_set
|// xattr is too long, needs an ea inode
|ext4_xattr_inode_lookup_create
| ext4_xattr_inode_create
| ext4_xattr_inode_write
| ext4_map_blocks
| // xattr block 33 is assigned to the new ea inode
| memcpy(bh->b_data, buf, csize)
| // The value of xattr overwrites the data in the xattr block.
|ext4_xattr_set_entry
// Since the contents of the xattr block have changed,
// now here == last does not hold, so it is possible to
// have last < here and trigger an out-of-bounds access.
So I think we should probably add a helper function ext4_mb_block_inuse()
that checks if xattr block is free with the block bitmap in check_xattrs().
Or go one step further and add a mechanism like xfs Reverse-Mapping, which
makes sure that allocated blocks do point to the target inode, which could
replace the current block_validity, and could also be used in future online
fscks.
Ted, Honza, do you have any thoughts?
Regards,
Baokun
next prev parent reply other threads:[~2024-10-08 7:40 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-22 0:16 [syzbot] [ext4?] KASAN: out-of-bounds Read " syzbot
2024-09-22 5:46 ` Qianqiang Liu
2024-09-22 6:35 ` syzbot
2024-09-22 6:42 ` [PATCH] ext4: fix out-of-bounds issue " Qianqiang Liu
2024-10-01 9:41 ` Ojaswin Mujoo
2024-10-01 10:15 ` Qianqiang Liu
2024-10-02 6:27 ` Qianqiang Liu
2024-10-08 7:40 ` Baokun Li [this message]
2024-10-09 15:50 ` Jan Kara
2024-10-11 2:18 ` Baokun Li
2024-10-14 16:31 ` Jan Kara
2024-10-16 8:02 ` Baokun Li
2024-10-16 20:47 ` Theodore Ts'o
2024-10-17 12:42 ` Baokun Li
2024-10-17 14:47 ` Theodore Ts'o
2024-10-18 3:44 ` Baokun Li
2024-10-02 6:31 ` [syzbot] [ext4?] KASAN: out-of-bounds Read " Qianqiang Liu
2024-10-02 6:54 ` 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=d62a25e9-04de-4309-98d1-22a4f9b5bb49@huawei.com \
--to=libaokun1@huawei.com \
--cc=adilger.kernel@dilger.ca \
--cc=jack@suse.cz \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=qianqiang.liu@163.com \
--cc=syzbot+f792df426ff0f5ceb8d1@syzkaller.appspotmail.com \
--cc=syzkaller-bugs@googlegroups.com \
--cc=tytso@mit.edu \
--cc=yangerkun@huawei.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®