Files
linux-stable-mirror/include/linux
Quanmin YanandGreg Kroah-Hartman 468f78276a fbcon: Set fb_display[i]->mode to NULL when the mode is released
commit a1f3058930 upstream.

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
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2025-11-24 10:29:11 +01:00
..
2025-05-09 09:43:58 +02:00
2024-10-04 16:29:59 +02:00
2025-11-02 22:14:42 +09:00
2025-09-11 17:20:27 +02:00
2024-12-14 19:59:58 +01:00
2025-07-06 11:00:16 +02:00
2025-02-08 09:52:02 +01:00
2025-01-09 13:31:41 +01:00
2025-10-23 16:16:42 +02:00
2025-08-15 12:08:42 +02:00
2025-01-23 17:21:12 +01:00
2025-01-09 13:31:41 +01:00
2025-02-01 18:37:51 +01:00
2025-02-27 04:10:50 -08:00
2025-08-01 09:47:30 +01:00
2024-10-17 15:24:23 +02:00
2025-05-22 14:12:12 +02:00
2024-11-08 16:28:26 +01:00