All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Peng Zhang <zhangpeng362@huawei.com>
Cc: jack@suse.com, jack@suse.cz, yi.zhang@huawei.com,
	yujie.liu@intel.com, hch@lst.de, akpm@linux-foundation.org,
	butterflyhuangxx@gmail.com, willy@infradead.org,
	stable@vger.kernel.org, linux-kernel@vger.kernel.org,
	syzbot+69c9fdccc6dd08961d34@syzkaller.appspotmail.com
Subject: Re: [PATCH] udf: Fix a slab-out-of-bounds write bug in udf_find_entry()
Date: Wed, 9 Nov 2022 12:25:32 +0100	[thread overview]
Message-ID: <20221109112532.kfgjpbb3rdkynltb@quack3> (raw)
In-Reply-To: <20221109013542.442790-1-zhangpeng362@huawei.com>

On Wed 09-11-22 01:35:42, Peng Zhang wrote:
> From: ZhangPeng <zhangpeng362@huawei.com>
> 
> Syzbot reported a slab-out-of-bounds Write bug:
> 
> loop0: detected capacity change from 0 to 2048
> ==================================================================
> BUG: KASAN: slab-out-of-bounds in udf_find_entry+0x8a5/0x14f0
> fs/udf/namei.c:253
> Write of size 105 at addr ffff8880123ff896 by task syz-executor323/3610
> 
> CPU: 0 PID: 3610 Comm: syz-executor323 Not tainted
> 6.1.0-rc2-syzkaller-00105-gb229b6ca5abb #0
> Hardware name: Google Compute Engine/Google Compute Engine, BIOS
> Google 10/11/2022
> Call Trace:
>  <TASK>
>  __dump_stack lib/dump_stack.c:88 [inline]
>  dump_stack_lvl+0x1b1/0x28e lib/dump_stack.c:106
>  print_address_description+0x74/0x340 mm/kasan/report.c:284
>  print_report+0x107/0x1f0 mm/kasan/report.c:395
>  kasan_report+0xcd/0x100 mm/kasan/report.c:495
>  kasan_check_range+0x2a7/0x2e0 mm/kasan/generic.c:189
>  memcpy+0x3c/0x60 mm/kasan/shadow.c:66
>  udf_find_entry+0x8a5/0x14f0 fs/udf/namei.c:253
>  udf_lookup+0xef/0x340 fs/udf/namei.c:309
>  lookup_open fs/namei.c:3391 [inline]
>  open_last_lookups fs/namei.c:3481 [inline]
>  path_openat+0x10e6/0x2df0 fs/namei.c:3710
>  do_filp_open+0x264/0x4f0 fs/namei.c:3740
>  do_sys_openat2+0x124/0x4e0 fs/open.c:1310
>  do_sys_open fs/open.c:1326 [inline]
>  __do_sys_creat fs/open.c:1402 [inline]
>  __se_sys_creat fs/open.c:1396 [inline]
>  __x64_sys_creat+0x11f/0x160 fs/open.c:1396
>  do_syscall_x64 arch/x86/entry/common.c:50 [inline]
>  do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80
>  entry_SYSCALL_64_after_hwframe+0x63/0xcd
> RIP: 0033:0x7ffab0d164d9
> Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89
> f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01
> f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48
> RSP: 002b:00007ffe1a7e6bb8 EFLAGS: 00000246 ORIG_RAX: 0000000000000055
> RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007ffab0d164d9
> RDX: 00007ffab0d164d9 RSI: 0000000000000000 RDI: 0000000020000180
> RBP: 00007ffab0cd5a10 R08: 0000000000000000 R09: 0000000000000000
> R10: 00005555573552c0 R11: 0000000000000246 R12: 00007ffab0cd5aa0
> R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
>  </TASK>
> 
> Allocated by task 3610:
>  kasan_save_stack mm/kasan/common.c:45 [inline]
>  kasan_set_track+0x3d/0x60 mm/kasan/common.c:52
>  ____kasan_kmalloc mm/kasan/common.c:371 [inline]
>  __kasan_kmalloc+0x97/0xb0 mm/kasan/common.c:380
>  kmalloc include/linux/slab.h:576 [inline]
>  udf_find_entry+0x7b6/0x14f0 fs/udf/namei.c:243
>  udf_lookup+0xef/0x340 fs/udf/namei.c:309
>  lookup_open fs/namei.c:3391 [inline]
>  open_last_lookups fs/namei.c:3481 [inline]
>  path_openat+0x10e6/0x2df0 fs/namei.c:3710
>  do_filp_open+0x264/0x4f0 fs/namei.c:3740
>  do_sys_openat2+0x124/0x4e0 fs/open.c:1310
>  do_sys_open fs/open.c:1326 [inline]
>  __do_sys_creat fs/open.c:1402 [inline]
>  __se_sys_creat fs/open.c:1396 [inline]
>  __x64_sys_creat+0x11f/0x160 fs/open.c:1396
>  do_syscall_x64 arch/x86/entry/common.c:50 [inline]
>  do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80
>  entry_SYSCALL_64_after_hwframe+0x63/0xcd
> 
> The buggy address belongs to the object at ffff8880123ff800
>  which belongs to the cache kmalloc-256 of size 256
> The buggy address is located 150 bytes inside of
>  256-byte region [ffff8880123ff800, ffff8880123ff900)
> 
> The buggy address belongs to the physical page:
> page:ffffea000048ff80 refcount:1 mapcount:0 mapping:0000000000000000
> index:0x0 pfn:0x123fe
> head:ffffea000048ff80 order:1 compound_mapcount:0 compound_pincount:0
> flags: 0xfff00000010200(slab|head|node=0|zone=1|lastcpupid=0x7ff)
> raw: 00fff00000010200 ffffea00004b8500 dead000000000003 ffff888012041b40
> raw: 0000000000000000 0000000080100010 00000001ffffffff 0000000000000000
> page dumped because: kasan: bad access detected
> page_owner tracks the page as allocated
> page last allocated via order 0, migratetype Unmovable, gfp_mask 0x0(),
> pid 1, tgid 1 (swapper/0), ts 1841222404, free_ts 0
>  create_dummy_stack mm/page_owner.c:67 [inline]
>  register_early_stack+0x77/0xd0 mm/page_owner.c:83
>  init_page_owner+0x3a/0x731 mm/page_owner.c:93
>  kernel_init_freeable+0x41c/0x5d5 init/main.c:1629
>  kernel_init+0x19/0x2b0 init/main.c:1519
> page_owner free stack trace missing
> 
> Memory state around the buggy address:
>  ffff8880123ff780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>  ffff8880123ff800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> >ffff8880123ff880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06
>                                                                 ^
>  ffff8880123ff900: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>  ffff8880123ff980: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
> ==================================================================
> 
> Fix this by changing the memory size allocated for copy_name from
> UDF_NAME_LEN(254) to UDF_NAME_LEN_CS0(255), because the total length
> (lfi) of subsequent memcpy can be up to 255.
> 
> Reported-by: syzbot+69c9fdccc6dd08961d34@syzkaller.appspotmail.com
> Fixes: 066b9cded00b ("udf: Use separate buffer for copying split names")
> Signed-off-by: ZhangPeng <zhangpeng362@huawei.com>

Ah, good catch! Thanks for the fix! I've added it to my tree and will push
it to Linus tomorrow.

								Honza


> ---
>  fs/udf/namei.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/fs/udf/namei.c b/fs/udf/namei.c
> index fb4c30e05245..ae7bc13a5298 100644
> --- a/fs/udf/namei.c
> +++ b/fs/udf/namei.c
> @@ -240,7 +240,7 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir,
>  						      poffset - lfi);
>  			else {
>  				if (!copy_name) {
> -					copy_name = kmalloc(UDF_NAME_LEN,
> +					copy_name = kmalloc(UDF_NAME_LEN_CS0,
>  							    GFP_NOFS);
>  					if (!copy_name) {
>  						fi = ERR_PTR(-ENOMEM);
> -- 
> 2.25.1
> 
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

      parent reply	other threads:[~2022-11-09 11:25 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-09  1:35 [PATCH] udf: Fix a slab-out-of-bounds write bug in udf_find_entry() Peng Zhang
2022-11-09  1:11 ` kernel test robot
2022-11-09 11:25 ` Jan Kara [this message]

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=20221109112532.kfgjpbb3rdkynltb@quack3 \
    --to=jack@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=butterflyhuangxx@gmail.com \
    --cc=hch@lst.de \
    --cc=jack@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=syzbot+69c9fdccc6dd08961d34@syzkaller.appspotmail.com \
    --cc=willy@infradead.org \
    --cc=yi.zhang@huawei.com \
    --cc=yujie.liu@intel.com \
    --cc=zhangpeng362@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 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.