|
Message-ID: <CAO3qeMXKb7vad9opV7B1oSsHbJ8D4jTpQaF2CwF=J1vVdcSe8g@mail.gmail.com> Date: Tue, 14 Jun 2022 09:07:55 +0800 From: Gerald Lee <sundaywind2004@...il.com> To: oss-security@...ts.openwall.com Subject: CVE-2022-1976: Linux Kernel: A use-after-free in __lock_acquire Hi all, =*=*=*=*=*=*=*=*= BUG DETAILS =*=*=*=*=*=*=*=*= The old inflight tracking for any file type that has io_uring_fops needs to be assigned, otherwise trivial circular references never get the ctx cleaned up and hence it'll leak. This issue was reported on May 31 and assigned CVE-2022-1976. C repro is attached. =*=*=*=*=*=*=*=*= BACKTRACE =*=*=*=*=*=*=*=*= BUG: KASAN: use-after-free in __lock_acquire+0x385f/0x5840 root/opt/kernel/kernel/locking/lockdep.c:4899 Read of size 8 at addr ffff8880682db3b8 by task kworker/1:9/9642 CPU: 1 PID: 9642 Comm: kworker/1:9 Not tainted 5.18.0 #7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 Workqueue: events io_fallback_req_func Call Trace: <TASK> __dump_stack root/opt/kernel/lib/dump_stack.c:88 [inline] dump_stack_lvl+0xcd/0x134 root/opt/kernel/lib/dump_stack.c:106 print_address_description root/opt/kernel/mm/kasan/report.c:313 [inline] print_report.cold+0xe5/0x659 root/opt/kernel/mm/kasan/report.c:429 kasan_report+0x8a/0x1b0 root/opt/kernel/mm/kasan/report.c:491 __lock_acquire+0x385f/0x5840 root/opt/kernel/kernel/locking/lockdep.c:4899 lock_acquire root/opt/kernel/kernel/locking/lockdep.c:5641 [inline] lock_acquire+0x1ab/0x520 root/opt/kernel/kernel/locking/lockdep.c:5606 __raw_spin_lock_irq root/opt/kernel/./include/linux/spinlock_api_smp.h:119 [inline] _raw_spin_lock_irq+0x32/0x50 root/opt/kernel/kernel/locking/spinlock.c:170 spin_lock_irq root/opt/kernel/./include/linux/spinlock.h:374 [inline] io_poll_remove_entry root/opt/kernel/fs/io_uring.c:6840 [inline] io_poll_remove_entries.part.0+0x15f/0x7d0 root/opt/kernel/fs/io_uring.c:6873 io_poll_remove_entries root/opt/kernel/fs/io_uring.c:6853 [inline] io_poll_task_func+0x187/0x500 root/opt/kernel/fs/io_uring.c:6971 io_fallback_req_func+0xfa/0x1b0 root/opt/kernel/fs/io_uring.c:1824 process_one_work+0x9cc/0x1650 root/opt/kernel/kernel/workqueue.c:2289 worker_thread+0x623/0x1070 root/opt/kernel/kernel/workqueue.c:2436 kthread+0x2e9/0x3a0 root/opt/kernel/kernel/kthread.c:376 ret_from_fork+0x1f/0x30 root/opt/kernel/arch/x86/entry/entry_64.S:302 </TASK> Allocated by task 11840: kasan_save_stack+0x1e/0x40 root/opt/kernel/mm/kasan/common.c:38 kasan_set_track root/opt/kernel/mm/kasan/common.c:45 [inline] set_alloc_info root/opt/kernel/mm/kasan/common.c:436 [inline] ____kasan_kmalloc root/opt/kernel/mm/kasan/common.c:515 [inline] ____kasan_kmalloc root/opt/kernel/mm/kasan/common.c:474 [inline] __kasan_kmalloc+0xa9/0xd0 root/opt/kernel/mm/kasan/common.c:524 kasan_kmalloc root/opt/kernel/./include/linux/kasan.h:234 [inline] __kmalloc+0x1c9/0x4c0 root/opt/kernel/mm/slub.c:4414 io_ring_ctx_alloc root/opt/kernel/fs/io_uring.c:1838 [inline] io_uring_create root/opt/kernel/fs/io_uring.c:12396 [inline] io_uring_setup.cold+0x176/0x2a59 root/opt/kernel/fs/io_uring.c:12535 do_syscall_x64 root/opt/kernel/arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 root/opt/kernel/arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x46/0xb0 Freed by task 787: kasan_save_stack+0x1e/0x40 root/opt/kernel/mm/kasan/common.c:38 kasan_set_track+0x21/0x30 root/opt/kernel/mm/kasan/common.c:45 kasan_set_free_info+0x20/0x30 root/opt/kernel/mm/kasan/generic.c:370 ____kasan_slab_free root/opt/kernel/mm/kasan/common.c:366 [inline] ____kasan_slab_free root/opt/kernel/mm/kasan/common.c:328 [inline] __kasan_slab_free+0x11d/0x190 root/opt/kernel/mm/kasan/common.c:374 kasan_slab_free root/opt/kernel/./include/linux/kasan.h:200 [inline] slab_free_hook root/opt/kernel/mm/slub.c:1728 [inline] slab_free_freelist_hook root/opt/kernel/mm/slub.c:1754 [inline] slab_free root/opt/kernel/mm/slub.c:3510 [inline] kfree+0xec/0x4b0 root/opt/kernel/mm/slub.c:4552 io_ring_ctx_free root/opt/kernel/fs/io_uring.c:11159 [inline] io_ring_exit_work+0xefb/0xf43 root/opt/kernel/fs/io_uring.c:11303 process_one_work+0x9cc/0x1650 root/opt/kernel/kernel/workqueue.c:2289 worker_thread+0x623/0x1070 root/opt/kernel/kernel/workqueue.c:2436 kthread+0x2e9/0x3a0 root/opt/kernel/kernel/kthread.c:376 ret_from_fork+0x1f/0x30 root/opt/kernel/arch/x86/entry/entry_64.S:302 Last potentially related work creation: kasan_save_stack+0x1e/0x40 root/opt/kernel/mm/kasan/common.c:38 __kasan_record_aux_stack+0xbe/0xd0 root/opt/kernel/mm/kasan/generic.c:348 insert_work+0x4a/0x390 root/opt/kernel/kernel/workqueue.c:1358 __queue_work+0x4dd/0x1140 root/opt/kernel/kernel/workqueue.c:1517 queue_work_on+0xee/0x110 root/opt/kernel/kernel/workqueue.c:1545 queue_work root/opt/kernel/./include/linux/workqueue.h:502 [inline] io_ring_ctx_wait_and_kill+0x2b6/0x2ec root/opt/kernel/fs/io_uring.c:11357 io_uring_release+0x42/0x46 root/opt/kernel/fs/io_uring.c:11365 __fput+0x277/0x9d0 root/opt/kernel/fs/file_table.c:317 task_work_run+0xe0/0x1a0 root/opt/kernel/kernel/task_work.c:177 exit_task_work root/opt/kernel/./include/linux/task_work.h:38 [inline] do_exit+0xb16/0x2dc0 root/opt/kernel/kernel/exit.c:795 do_group_exit+0xd2/0x2f0 root/opt/kernel/kernel/exit.c:925 get_signal+0x2847/0x2880 root/opt/kernel/kernel/signal.c:2864 arch_do_signal_or_restart+0x81/0x1e30 root/opt/kernel/arch/x86/kernel/signal.c:869 exit_to_user_mode_loop root/opt/kernel/kernel/entry/common.c:166 [inline] exit_to_user_mode_prepare+0x174/0x260 root/opt/kernel/kernel/entry/common.c:201 __syscall_exit_to_user_mode_work root/opt/kernel/kernel/entry/common.c:283 [inline] syscall_exit_to_user_mode+0x19/0x60 root/opt/kernel/kernel/entry/common.c:294 do_syscall_64+0x42/0xb0 root/opt/kernel/arch/x86/entry/common.c:86 entry_SYSCALL_64_after_hwframe+0x46/0xb0 The buggy address belongs to the object at ffff8880682db000 which belongs to the cache kmalloc-2k of size 2048 The buggy address is located 952 bytes inside of 2048-byte region [ffff8880682db000, ffff8880682db800) The buggy address belongs to the physical page: page:ffffea0001a0b600 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x682d8 head:ffffea0001a0b600 order:3 compound_mapcount:0 compound_pincount:0 flags: 0x4fff00000010200(slab|head|node=1|zone=1|lastcpupid=0x7ff) raw: 04fff00000010200 ffffea00019e8e00 dead000000000002 ffff888010c42000 raw: 0000000000000000 0000000000080008 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected page_owner tracks the page as allocated page last allocated via order 3, migratetype Unmovable, gfp_mask 0xd20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC), pid 6529, tgid 6529 (syz-executor.2), ts 33495069085, free_ts 0 set_page_owner root/opt/kernel/./include/linux/page_owner.h:31 [inline] post_alloc_hook root/opt/kernel/mm/page_alloc.c:2434 [inline] prep_new_page+0x297/0x330 root/opt/kernel/mm/page_alloc.c:2441 get_page_from_freelist+0x210e/0x3ab0 root/opt/kernel/mm/page_alloc.c:4182 __alloc_pages+0x30c/0x6e0 root/opt/kernel/mm/page_alloc.c:5408 alloc_pages+0x119/0x250 root/opt/kernel/mm/mempolicy.c:2272 alloc_slab_page root/opt/kernel/mm/slub.c:1799 [inline] allocate_slab root/opt/kernel/mm/slub.c:1944 [inline] new_slab+0x2a9/0x3f0 root/opt/kernel/mm/slub.c:2004 ___slab_alloc+0xc62/0x1080 root/opt/kernel/mm/slub.c:3005 __slab_alloc.isra.0+0x4d/0xa0 root/opt/kernel/mm/slub.c:3092 slab_alloc_node root/opt/kernel/mm/slub.c:3183 [inline] slab_alloc root/opt/kernel/mm/slub.c:3225 [inline] kmem_cache_alloc_trace+0x383/0x460 root/opt/kernel/mm/slub.c:3256 kmalloc root/opt/kernel/./include/linux/slab.h:581 [inline] kzalloc root/opt/kernel/./include/linux/slab.h:714 [inline] ipv6_add_dev root/opt/kernel/net/ipv6/addrconf.c:378 [inline] ipv6_add_dev+0xfe/0x12d0 root/opt/kernel/net/ipv6/addrconf.c:368 addrconf_notify+0x614/0x1bb0 root/opt/kernel/net/ipv6/addrconf.c:3521 notifier_call_chain+0xb5/0x200 root/opt/kernel/kernel/notifier.c:84 call_netdevice_notifiers_info root/opt/kernel/net/core/dev.c:1938 [inline] call_netdevice_notifiers_info+0xb5/0x130 root/opt/kernel/net/core/dev.c:1923 call_netdevice_notifiers_extack root/opt/kernel/net/core/dev.c:1976 [inline] call_netdevice_notifiers root/opt/kernel/net/core/dev.c:1990 [inline] register_netdevice+0xeb5/0x12b0 root/opt/kernel/net/core/dev.c:9994 veth_newlink+0x405/0xa90 root/opt/kernel/drivers/net/veth.c:1764 __rtnl_newlink+0xf52/0x1600 root/opt/kernel/net/core/rtnetlink.c:3483 rtnl_newlink+0x64/0xa0 root/opt/kernel/net/core/rtnetlink.c:3531 page_owner free stack trace missing Memory state around the buggy address: ffff8880682db280: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff8880682db300: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb >ffff8880682db380: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ^ ffff8880682db400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff8880682db480: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb =*=*=*=*=*=*=*=*= PATCH =*=*=*=*=*=*=*=*= The patch has been merged into the Linux kernel mainline and stable-master tree. It can be found here: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9cae36a094e7e9d6e5fe8b6dcd4642138b3eb0c7 =*=*=*=*=*=*=*=*= CREDIT =*=*=*=*=*=*=*=*= Zhixin Li from Zero-one Security <sundaywind2004@...il.com> Thanks. Content of type "text/html" skipped View attachment "repro.c" of type "text/x-c-code" (12613 bytes)
Powered by blists - more mailing lists
Please check out the Open Source Software Security Wiki, which is counterpart to this mailing list.
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.