[Bug report] KASAN: use-after-free Read in fb_videomode_to_var

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

We use our modified Syzkaller to fuzz the Linux kernel and found the following issue.

Head Commit: 4c893ff55907c61456bcb917781c0dd687a1e123
Git Tree: stable

Kernel config: https://pastebin.com/raw/BiggLxRg

Unfortunately, I don't have any reproducer for this crash yet.
IMPORTANT: if you fix the bug, please add the following tag to the commit:
Reported-by: lanyang0908@xxxxxxxxx

I guess that it is possible incurred by race condition?
Firstly, fb_videomode_to_var+0x2fc is corresponding to the field "xres" in the struct fb_videomode. Although before converting fb_videomode to fb_var_screeninfo, the system already checks whether the object mode is NULL, this object has possibility to be freed by other threads at this moment?

How do you think?

Related source code:
static int fbcon_resize(struct vc_data *vc, unsigned int width,
unsigned int height, unsigned int user)
{ ...
mode = fb_find_best_mode(&var, &info->modelist);
if (mode == NULL)
return -EINVAL;
display_to_var(&var, p);
fb_videomode_to_var(&var, mode);
  ...
}

void fb_videomode_to_var(struct fb_var_screeninfo *var,
const struct fb_videomode *mode)
{
var->xres = mode->xres;
...
}

Crash log:
==================================================================
BUG: KASAN: use-after-free in fb_videomode_to_var+0x2fc/0x5d0
Read of size 4 at addr ffff8880495c661c by task syz-executor.4/16705

CPU: 1 PID: 16705 Comm: syz-executor.4 Not tainted 5.10.180+ #6
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014
Call Trace:
 dump_stack+0x172/0x21e                                      
 ? stack_trace_save+0x107/0x1e0                                      
 ? show_regs_print_info+0x12/0x12                                    
 ? printk+0xc0/0x103                                      
 print_address_description+0x66/0x640                                      
 ? log_buf_vmcoreinfo_setup+0x45d/0x45d                                      
 ? _raw_spin_lock_irqsave+0xbf/0x100                                      
 ? stack_trace_save+0x107/0x1e0                                    
 ? stack_trace_snprint+0xe0/0xe0                                    
 kasan_report+0x141/0x1f0                                    
 ? fb_videomode_to_var+0x2fc/0x5d0                                      
 ? fb_videomode_to_var+0x2fc/0x5d0                                      
 ? fbcon_resize+0x627/0x17f0                                      
 ? fbcon_copy_font+0x130/0x130                                      
 ? __kmalloc+0x224/0x300                                      
 ? kzalloc+0x1d/0x40                                      
 ? fbcon_copy_font+0x130/0x130                                      
 ? vc_do_resize+0x7b7/0x18f0                                      
 ? vc_resize+0x50/0x50                                      
 ? _raw_spin_unlock_irqrestore+0x2e/0x60                                      
 ? lockdep_hardirqs_on+0x90/0x140                                      
 ? vt_ioctl+0x32f1/0x3ff0                                      
 ? mark_lock+0x1ac/0x1dc0                                      
 ? __vt_event_wait+0x230/0x230                                      
 ? __bfs+0x660/0x660                                      
 ? __bfs+0x660/0x660                                      
 ? trace_lock_acquire+0x1a0/0x1a0                                      
 ? rcu_read_lock_sched_held+0x87/0x110                                      
 ? __bpf_trace_rcu_utilization+0x10/0x10                                      
 ? __lock_acquire+0x1264/0x2b10                                      
 ? __lock_acquire+0x1264/0x2b10                                      
 ? trace_lock_acquire+0x1a0/0x1a0                                      
 ? tty_ioctl+0xf2a/0x1700                                      
 ? tty_do_resize+0x180/0x180                                      
 ? rcu_lock_release+0x9/0x20                                      
 ? __lock_acquire+0x2b10/0x2b10                                      
 ? __fget_files+0x37c/0x3b0                                      
 ? __fdget+0x18f/0x210                                      
 ? tty_do_resize+0x180/0x180                                      
 ? __x64_sys_ioctl+0x119/0x190                                      
 ? do_syscall_64+0x74/0xc0                                      
 ? entry_SYSCALL_64_after_hwframe+0x44/0xa9                                      

Allocated by task 7679:
 __kasan_kmalloc+0x102/0x140
 __kmalloc_node+0x262/0x380
 kvmalloc_node+0x81/0x110
 alloc_fdtable+0x151/0x260
 dup_fd+0x880/0xd00
 copy_process+0x1b66/0x5e80

The buggy address belongs to the object at ffff8880495c6600
 which belongs to the cache kmalloc-96 of size 96
The buggy address is located 28 bytes inside of
 96-byte region [ffff8880495c6600, ffff8880495c6660)
The buggy address belongs to the page:
page:0000000005617347 refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff8880495c6c80 pfn:0x495c6
flags: 0x4fff00000000200(slab)
raw: 04fff00000000200 ffffea0000629680 0000000200000002 ffff88800ec41780
raw: ffff8880495c6c80 000000008020001c 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 0x12a20(GFP_ATOMIC|__GFP_NOWARN|__GFP_NORETRY)
 prep_new_page+0x16/0xa0
 get_page_from_freelist+0xa3d/0xcb0
 __alloc_pages_nodemask+0x225/0x580
 allocate_slab+0xb4/0x520
 ___slab_alloc+0x1df/0x330
 kmem_cache_alloc_trace+0x288/0x2c0
 __hw_addr_sync+0x3c0/0xb30
 dev_mc_sync+0xdb/0x1a0
 vlan_dev_set_rx_mode+0x47/0x70
 __dev_mc_add+0x3ed/0x510
 igmp6_group_added+0x1a0/0x880
 __ipv6_dev_mc_inc+0x8c1/0xb60
 addrconf_dad_work+0x3f2/0x2040
 process_one_work+0x83b/0x10a0
 worker_thread+0xa94/0x1440
 kthread+0x3af/0x3d0
page last free stack trace:
 free_pcp_prepare+0x1dc/0x410
 free_unref_page+0x6a/0x220
 tlb_remove_table_rcu+0x78/0xf0
 rcu_core+0x81a/0x1190
 __do_softirq+0x376/0x72b
 asm_call_irq_on_stack+0xf/0x20

Memory state around the buggy address:
 ffff8880495c6500: 00 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc
 ffff8880495c6580: 00 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc
>ffff8880495c6600: fb fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
                            ^
 ffff8880495c6680: 00 00 00 00 00 00 00 00 00 00 00 00 fc fc fc fc
 ffff8880495c6700: 00 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc
==================================================================
Disabling lock debugging due to kernel taint
Kernel panic - not syncing: panic_on_warn set ...
CPU: 1 PID: 16705 Comm: syz-executor.4 Tainted: G    B             5.10.180+ #6
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014
Call Trace:
 dump_stack+0x172/0x21e                                      
 ? log_buf_vmcoreinfo_setup+0x45d/0x45d                                      
 ? show_regs_print_info+0x12/0x12                                      
 ? __irq_exit_rcu+0xc5/0x260                                      
 ? irq_exit_rcu+0x20/0x20                                      
 panic+0x2b6/0x7d0                                      
 ? schedule_preempt_disabled+0x20/0x20                                      
 ? trace_hardirqs_on+0x32/0x80                                      
 ? nmi_panic+0x80/0x80                                    
 ? preempt_schedule_thunk+0x16/0x18                                      
 ? trace_hardirqs_on+0x32/0x80                                      
 kasan_report+0x1e5/0x1f0                                      
 ? fb_videomode_to_var+0x2fc/0x5d0                                      
 ? fb_videomode_to_var+0x2fc/0x5d0                                      
 ? fbcon_resize+0x627/0x17f0                                      
 ? fbcon_copy_font+0x130/0x130                                      
 ? __kmalloc+0x224/0x300                                    
 ? kzalloc+0x1d/0x40                                      
 ? fbcon_copy_font+0x130/0x130                                      
 ? vc_do_resize+0x7b7/0x18f0                                    
 ? vc_resize+0x50/0x50                                    
 ? _raw_spin_unlock_irqrestore+0x2e/0x60                                      
 ? lockdep_hardirqs_on+0x90/0x140                                      
 ? vt_ioctl+0x32f1/0x3ff0                                      
 ? mark_lock+0x1ac/0x1dc0                                    
 ? __vt_event_wait+0x230/0x230                                    
 ? __bfs+0x660/0x660                                      
 ? __bfs+0x660/0x660                                    
 ? trace_lock_acquire+0x1a0/0x1a0                                      
 ? rcu_read_lock_sched_held+0x87/0x110                                      
 ? __bpf_trace_rcu_utilization+0x10/0x10                                    
 ? __lock_acquire+0x1264/0x2b10                                    
 ? __lock_acquire+0x1264/0x2b10                                    
 ? trace_lock_acquire+0x1a0/0x1a0                                    
 ? tty_ioctl+0xf2a/0x1700                                  
 ? tty_do_resize+0x180/0x180                                  
 ? rcu_lock_release+0x9/0x20                                
 ? __lock_acquire+0x2b10/0x2b10                                  
 ? __fget_files+0x37c/0x3b0                                    
 ? __fdget+0x18f/0x210                                    
 ? tty_do_resize+0x180/0x180                                    
 ? __x64_sys_ioctl+0x119/0x190                                    
 ? do_syscall_64+0x74/0xc0                                  
 ? entry_SYSCALL_64_after_hwframe+0x44/0xa9                                    
Kernel Offset: disabled
Rebooting in 86400 seconds..


Best regards,

Yang

[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux