linux/drivers/video/fbdev/core
Quanmin Yan a1f3058930 fbcon: Set fb_display[i]->mode to NULL when the mode is released
Recently, we discovered the following issue through syzkaller:

BUG: KASAN: slab-use-after-free in fb_mode_is_equal+0x285/0x2f0
Read of size 4 at addr ff11000001b3c69c by task syz.xxx
...
Call Trace:
 <TASK>
 dump_stack_lvl+0xab/0xe0
 print_address_description.constprop.0+0x2c/0x390
 print_report+0xb9/0x280
 kasan_report+0xb8/0xf0
 fb_mode_is_equal+0x285/0x2f0
 fbcon_mode_deleted+0x129/0x180
 fb_set_var+0xe7f/0x11d0
 do_fb_ioctl+0x6a0/0x750
 fb_ioctl+0xe0/0x140
 __x64_sys_ioctl+0x193/0x210
 do_syscall_64+0x5f/0x9c0
 entry_SYSCALL_64_after_hwframe+0x76/0x7e

Based on experimentation and analysis, during framebuffer unregistration,
only the memory of fb_info->modelist is freed, without setting the
corresponding fb_display[i]->mode to NULL for the freed modes. This leads
to UAF issues during subsequent accesses. Here's an example of reproduction
steps:
1. With /dev/fb0 already registered in the system, load a kernel module
   to register a new device /dev/fb1;
2. Set fb1's mode to the global fb_display[] array (via FBIOPUT_CON2FBMAP);
3. Switch console from fb to VGA (to allow normal rmmod of the ko);
4. Unload the kernel module, at this point fb1's modelist is freed, leaving
   a wild pointer in fb_display[];
5. Trigger the bug via system calls through fb0 attempting to delete a mode
   from fb0.

Add a check in do_unregister_framebuffer(): if the mode to be freed exists
in fb_display[], set the corresponding mode pointer to NULL.

Signed-off-by: Quanmin Yan <yanquanmin1@huawei.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Helge Deller <deller@gmx.de>
Cc: stable@vger.kernel.org
2025-10-28 22:59:19 +01:00
..
Kconfig fbdev fixes and cleanups for 6.17-rc1: 2025-08-02 09:58:11 -07:00
Makefile
bitblit.c fbdev: bitblit: bound-check glyph index in bit_putcs* 2025-10-28 22:59:19 +01:00
cfbcopyarea.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
cfbfillrect.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
cfbimgblt.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
cfbmem.h fbdev: Refactoring the fbcon packed pixel drawing routines 2025-03-26 22:39:21 +01:00
fb_backlight.c backlight: Replace fb events with a dedicated function call 2025-04-10 10:39:03 +01:00
fb_chrdev.c
fb_cmdline.c fbdev: Fix logic error in "offb" name match 2025-10-10 00:31:13 +02:00
fb_copyarea.h fbdev: Refactoring the fbcon packed pixel drawing routines 2025-03-26 22:39:21 +01:00
fb_ddc.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
fb_defio.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
fb_draw.h fbdev: Refactoring the fbcon packed pixel drawing routines 2025-03-26 22:39:21 +01:00
fb_fillrect.h fbdev: core: Fix ubsan warning in pixel_to_pat 2025-09-30 23:21:34 +02:00
fb_imageblit.h fbdev: Refactoring the fbcon packed pixel drawing routines 2025-03-26 22:39:21 +01:00
fb_info.c fbdev: Track display blanking state 2025-04-10 10:38:57 +01:00
fb_internal.h
fb_io_fops.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
fb_logo.c
fb_notify.c
fb_procfs.c
fb_sys_fops.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
fbcmap.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
fbcon.c fbcon: Set fb_display[i]->mode to NULL when the mode is released 2025-10-28 22:59:19 +01:00
fbcon.h fbcon: Use correct erase colour for clearing in fbcon 2025-03-26 22:39:19 +01:00
fbcon_ccw.c fbcon: Use correct erase colour for clearing in fbcon 2025-03-26 22:39:19 +01:00
fbcon_cw.c fbcon: Use correct erase colour for clearing in fbcon 2025-03-26 22:39:19 +01:00
fbcon_rotate.c
fbcon_rotate.h
fbcon_ud.c fbcon: Use correct erase colour for clearing in fbcon 2025-03-26 22:39:19 +01:00
fbcvt.c fbdev: core: fbcvt: avoid division by 0 in fb_cvt_hperiod() 2025-05-31 10:24:02 +02:00
fbmem.c fbcon: Set fb_display[i]->mode to NULL when the mode is released 2025-10-28 22:59:19 +01:00
fbmon.c fbdev: Use string choices helpers 2025-09-30 23:21:34 +02:00
fbsysfs.c fbdev: Track display blanking state 2025-04-10 10:38:57 +01:00
modedb.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
softcursor.c
svgalib.c fbdev fixes and cleanups for 6.17-rc1: 2025-08-02 09:58:11 -07:00
syscopyarea.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
sysfillrect.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
sysimgblt.c fbdev: Include <linux/export.h> 2025-06-16 09:06:19 +02:00
sysmem.h fbdev: Refactoring the fbcon packed pixel drawing routines 2025-03-26 22:39:21 +01:00
tileblit.c fbcon: Use correct erase colour for clearing in fbcon 2025-03-26 22:39:19 +01:00