Re: [syzbot] upstream test error: KASAN: invalid-access Read in __entry_tramp_text_end

Dmitry Vyukov
2021-09-17T15:06:40Z

On Sat, 4 Sept 2021 at 13:57, syzbot
<syzbot+488ddf8087564d6de6e2@syzkaller.appspotmail.com> wrote:
>
> Hello,
>
> syzbot found the following issue on:
>
> HEAD commit: f1583cb1be35 Merge tag 'linux-kselftest-next-5.15-rc1' of ..
> git tree: upstream
> console output: https://syzkaller.appspot.com/x/log.txt?x=16354043300000
> kernel config: https://syzkaller.appspot.com/x/.config?x=5fe535c85e8d7384
> dashboard link: https://syzkaller.appspot.com/bug?extid=488ddf8087564d6de6e2
> compiler: aarch64-linux-gnu-gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.1
> userspace arch: arm64
>
> IMPORTANT: if you fix the issue, please add the following tag to the commit:
> Reported-by: syzbot+488ddf8087564d6de6e2@syzkaller.appspotmail.com
>
> ==================================================================
> BUG: KASAN: invalid-access in __entry_tramp_text_end+0xdfc/0x3000
> Read at addr f4ff000002a361a0 by task kdevtmpfs/22
> Pointer tag: [f4], memory tag: [fe]
>
> CPU: 1 PID: 22 Comm: kdevtmpfs Not tainted 5.14.0-syzkaller-09284-gf1583cb1be35 #0
> Hardware name: linux,dummy-virt (DT)
> Call trace:
> dump_backtrace+0x0/0x1ac arch/arm64/kernel/stacktrace.c:76
> show_stack+0x18/0x24 arch/arm64/kernel/stacktrace.c:215
> __dump_stack lib/dump_stack.c:88 [inline]
> dump_stack_lvl+0x68/0x84 lib/dump_stack.c:105
> print_address_description+0x7c/0x2b4 mm/kasan/report.c:256
> __kasan_report mm/kasan/report.c:442 [inline]
> kasan_report+0x134/0x380 mm/kasan/report.c:459
> __do_kernel_fault+0x128/0x1bc arch/arm64/mm/fault.c:317
> do_bad_area arch/arm64/mm/fault.c:466 [inline]
> do_tag_check_fault+0x74/0x90 arch/arm64/mm/fault.c:737
> do_mem_abort+0x44/0xb4 arch/arm64/mm/fault.c:813
> el1_abort+0x40/0x60 arch/arm64/kernel/entry-common.c:357
> el1h_64_sync_handler+0xb0/0xd0 arch/arm64/kernel/entry-common.c:408
> el1h_64_sync+0x78/0x7c arch/arm64/kernel/entry.S:567
> __entry_tramp_text_end+0xdfc/0x3000

/\/\/\/\/\/\/\

This is broken unwind on arm64. d_lookup statically calls __d_lookup,
not __entry_tramp_text_end (which is not even a function).
See the following thread for some debugging details:
https://lore.kernel.org/lkml/CACT4Y+ZByJ71QfYHTByWaeCqZFxYfp8W8oyrK0baNaSJMDzoUw@mail.gmail.com/

But there is also the use-after-free in d_lookup.

> d_lookup+0x44/0x70 fs/dcache.c:2370
> lookup_dcache+0x24/0x84 fs/namei.c:1520
> __lookup_hash+0x24/0xd0 fs/namei.c:1543
> kern_path_locked+0x90/0x10c fs/namei.c:2567
> handle_remove+0x38/0x284 drivers/base/devtmpfs.c:312
> handle drivers/base/devtmpfs.c:382 [inline]
> devtmpfs_work_loop drivers/base/devtmpfs.c:395 [inline]
> devtmpfsd+0x8c/0xd0 drivers/base/devtmpfs.c:437
> kthread+0x150/0x15c kernel/kthread.c:319
> ret_from_fork+0x10/0x20 arch/arm64/kernel/entry.S:756
>
> Allocated by task 22:
> kasan_save_stack+0x28/0x60 mm/kasan/common.c:38
> kasan_set_track mm/kasan/common.c:46 [inline]
> set_alloc_info mm/kasan/common.c:434 [inline]
> __kasan_slab_alloc+0xb0/0x110 mm/kasan/common.c:467
> kasan_slab_alloc include/linux/kasan.h:254 [inline]
> slab_post_alloc_hook mm/slab.h:519 [inline]
> slab_alloc_node mm/slub.c:2959 [inline]
> slab_alloc mm/slub.c:2967 [inline]
> kmem_cache_alloc+0x1cc/0x340 mm/slub.c:2972
> getname_kernel+0x30/0x150 fs/namei.c:226
> kern_path_locked+0x2c/0x10c fs/namei.c:2558
> handle_remove+0x38/0x284 drivers/base/devtmpfs.c:312
> handle drivers/base/devtmpfs.c:382 [inline]
> devtmpfs_work_loop drivers/base/devtmpfs.c:395 [inline]
> devtmpfsd+0x8c/0xd0 drivers/base/devtmpfs.c:437
> kthread+0x150/0x15c kernel/kthread.c:319
> ret_from_fork+0x10/0x20 arch/arm64/kernel/entry.S:756
>
> Freed by task 22:
> kasan_save_stack+0x28/0x60 mm/kasan/common.c:38
> kasan_set_track+0x28/0x3c mm/kasan/common.c:46
> kasan_set_free_info+0x20/0x30 mm/kasan/tags.c:36
> ____kasan_slab_free.constprop.0+0x178/0x1e0 mm/kasan/common.c:366
> __kasan_slab_free+0x10/0x1c mm/kasan/common.c:374
> kasan_slab_free include/linux/kasan.h:230 [inline]
> slab_free_hook mm/slub.c:1628 [inline]
> slab_free_freelist_hook+0xc4/0x20c mm/slub.c:1653
> slab_free mm/slub.c:3213 [inline]
> kmem_cache_free+0x9c/0x420 mm/slub.c:3229
> putname.part.0+0x68/0x7c fs/namei.c:270
> putname include/linux/err.h:41 [inline]
> filename_parentat fs/namei.c:2547 [inline]
> kern_path_locked+0x64/0x10c fs/namei.c:2558
> handle_remove+0x38/0x284 drivers/base/devtmpfs.c:312
> handle drivers/base/devtmpfs.c:382 [inline]
> devtmpfs_work_loop drivers/base/devtmpfs.c:395 [inline]
> devtmpfsd+0x8c/0xd0 drivers/base/devtmpfs.c:437
> kthread+0x150/0x15c kernel/kthread.c:319
> ret_from_fork+0x10/0x20 arch/arm64/kernel/entry.S:756
>
> The buggy address belongs to the object at ffff000002a36180
> which belongs to the cache names_cache of size 4096
> The buggy address is located 32 bytes inside of
> 4096-byte region [ffff000002a36180, ffff000002a37180)
> The buggy address belongs to the page:
> page:00000000a105b3ae refcount:1 mapcount:0 mapping:0000000000000000 index:0xf3ff000002a34100 pfn:0x42a30
> head:00000000a105b3ae order:3 compound_mapcount:0 compound_pincount:0
> flags: 0x1ffc00000010200(slab|head|node=0|zone=0|lastcpupid=0x7ff|kasantag=0x0)
> raw: 01ffc00000010200 0000000000000000 dead000000000122 faff000002837700
> raw: f3ff000002a34100 0000000080070003 00000001ffffffff 0000000000000000
> page dumped because: kasan: bad access detected
>
> Memory state around the buggy address:
> ffff000002a35f00: fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe
> ffff000002a36000: fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe
> >ffff000002a36100: fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe
> ^
> ffff000002a36200: fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe
> ffff000002a36300: fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe fe
> ==================================================================
>
>
> ---
> 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.
>
> --
> You received this message because you are subscribed to the Google Groups "syzkaller-bugs" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to syzkaller-bugs+unsubscribe@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/syzkaller-bugs/000000000000a3cf8605cb2a1ec0%40google.com.