From: Greg Kroah-Hartman Date: Mon, 6 Nov 2023 11:26:55 +0000 (+0100) Subject: 4.14-stable patches X-Git-Tag: v4.14.329~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2aa3175985d8a7b02b50d8744e834bf4edf49a6f;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: vc_screen-move-load-of-struct-vc_data-pointer-in-vcs_read-to-avoid-uaf.patch --- diff --git a/queue-4.14/series b/queue-4.14/series index a5603460419..ecc8c5c0c68 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -39,3 +39,4 @@ platform-x86-asus-wmi-change-asus_wmi_brn_down-code-.patch net-chelsio-cxgb4-add-an-error-code-check-in-t4_load.patch ata-ahci-fix-enum-constants-for-gcc-13.patch remove-the-sx8-block-driver.patch +vc_screen-move-load-of-struct-vc_data-pointer-in-vcs_read-to-avoid-uaf.patch diff --git a/queue-4.14/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs_read-to-avoid-uaf.patch b/queue-4.14/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs_read-to-avoid-uaf.patch new file mode 100644 index 00000000000..46de538ba13 --- /dev/null +++ b/queue-4.14/vc_screen-move-load-of-struct-vc_data-pointer-in-vcs_read-to-avoid-uaf.patch @@ -0,0 +1,117 @@ +From 226fae124b2dac217ea5436060d623ff3385bc34 Mon Sep 17 00:00:00 2001 +From: George Kennedy +Date: Tue, 24 Jan 2023 11:16:54 -0500 +Subject: vc_screen: move load of struct vc_data pointer in vcs_read() to avoid UAF + +From: George Kennedy + +commit 226fae124b2dac217ea5436060d623ff3385bc34 upstream. + +After a call to console_unlock() in vcs_read() the vc_data struct can be +freed by vc_deallocate(). Because of that, the struct vc_data pointer +load must be done at the top of while loop in vcs_read() to avoid a UAF +when vcs_size() is called. + +Syzkaller reported a UAF in vcs_size(). + +BUG: KASAN: use-after-free in vcs_size (drivers/tty/vt/vc_screen.c:215) +Read of size 4 at addr ffff8881137479a8 by task 4a005ed81e27e65/1537 + +CPU: 0 PID: 1537 Comm: 4a005ed81e27e65 Not tainted 6.2.0-rc5 #1 +Hardware name: Red Hat KVM, BIOS 1.15.0-2.module +Call Trace: + +__asan_report_load4_noabort (mm/kasan/report_generic.c:350) +vcs_size (drivers/tty/vt/vc_screen.c:215) +vcs_read (drivers/tty/vt/vc_screen.c:415) +vfs_read (fs/read_write.c:468 fs/read_write.c:450) +... + + +Allocated by task 1191: +... +kmalloc_trace (mm/slab_common.c:1069) +vc_allocate (./include/linux/slab.h:580 ./include/linux/slab.h:720 + drivers/tty/vt/vt.c:1128 drivers/tty/vt/vt.c:1108) +con_install (drivers/tty/vt/vt.c:3383) +tty_init_dev (drivers/tty/tty_io.c:1301 drivers/tty/tty_io.c:1413 + drivers/tty/tty_io.c:1390) +tty_open (drivers/tty/tty_io.c:2080 drivers/tty/tty_io.c:2126) +chrdev_open (fs/char_dev.c:415) +do_dentry_open (fs/open.c:883) +vfs_open (fs/open.c:1014) +... + +Freed by task 1548: +... +kfree (mm/slab_common.c:1021) +vc_port_destruct (drivers/tty/vt/vt.c:1094) +tty_port_destructor (drivers/tty/tty_port.c:296) +tty_port_put (drivers/tty/tty_port.c:312) +vt_disallocate_all (drivers/tty/vt/vt_ioctl.c:662 (discriminator 2)) +vt_ioctl (drivers/tty/vt/vt_ioctl.c:903) +tty_ioctl (drivers/tty/tty_io.c:2776) +... + +The buggy address belongs to the object at ffff888113747800 + which belongs to the cache kmalloc-1k of size 1024 +The buggy address is located 424 bytes inside of + 1024-byte region [ffff888113747800, ffff888113747c00) + +The buggy address belongs to the physical page: +page:00000000b3fe6c7c refcount:1 mapcount:0 mapping:0000000000000000 + index:0x0 pfn:0x113740 +head:00000000b3fe6c7c order:3 compound_mapcount:0 subpages_mapcount:0 + compound_pincount:0 +anon flags: 0x17ffffc0010200(slab|head|node=0|zone=2|lastcpupid=0x1fffff) +raw: 0017ffffc0010200 ffff888100042dc0 0000000000000000 dead000000000001 +raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000 +page dumped because: kasan: bad access detected + +Memory state around the buggy address: + ffff888113747880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb + ffff888113747900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb +> ffff888113747980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb + ^ + ffff888113747a00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb + ffff888113747a80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb +================================================================== +Disabling lock debugging due to kernel taint + +Fixes: ac751efa6a0d ("console: rename acquire/release_console_sem() to console_lock/unlock()") +Reported-by: syzkaller +Suggested-by: Jiri Slaby +Signed-off-by: George Kennedy +Link: https://lore.kernel.org/r/1674577014-12374-1-git-send-email-george.kennedy@oracle.com +[ 4.14: Adjust context ] +Signed-off-by: Suraj Jitindar Singh +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/vt/vc_screen.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +--- a/drivers/tty/vt/vc_screen.c ++++ b/drivers/tty/vt/vc_screen.c +@@ -219,10 +219,6 @@ vcs_read(struct file *file, char __user + console_lock(); + + attr = (currcons & 128); +- ret = -ENXIO; +- vc = vcs_vc(inode, &viewed); +- if (!vc) +- goto unlock_out; + + ret = -EINVAL; + if (pos < 0) +@@ -238,6 +234,11 @@ vcs_read(struct file *file, char __user + ssize_t orig_count; + long p = pos; + ++ ret = -ENXIO; ++ vc = vcs_vc(inode, &viewed); ++ if (!vc) ++ goto unlock_out; ++ + /* Check whether we are above size each round, + * as copy_to_user at the end of this loop + * could sleep.