Linux: vt: selection: Fix unsigned underflow and slab-out-of-bounds read in paste_selection()
What fixes it
- 037d7e3ca5c593092f4b0d471eb869a85cbddde0LinuxCVE List
- 619c6d7dd76fff15a9714fbf02ce299b737f01a2LinuxCVE List
- 39495ef5d6f8019e62d65807f217a7ca8232727aLinuxCVE List
- 3.17LinuxCVE List
- 4.5LinuxCVE List
- 4.10LinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
vt: selection: Fix unsigned underflow and slab-out-of-bounds read in paste_selection()
In paste_selection(), the loop copies min_t(unsigned int, vc_sel.buf_len - pasted,tty->receive_room) bytes per iteration into tty_ldisc_receive_buf() and increments pasted += count.
Because the selection mutex (vc_sel.lock) is dropped inside the loop Whenever the line discipline buffer fills up and paste_selection() sleeps on tty->write_wait, a concurrent TIOCLINUX (TIOCL_SETSEL) ioctl can replace vc_sel.buffer with a shorter selection and reduce vc_sel.buf_len below pasted.
When paste_selection() resumes, vc_sel.buf_len - pasted underflows as an unsigned integer to a large positive value, causing tty_ldisc_receive_buf(ld, vc_sel.buffer + pasted, NULL, count) to read up to 4094 bytes out-of-bounds past the newly allocated vc_sel.buffer.
Fix this by terminating the loop when pasted >= vc_sel.buf_len.
Kernel stack trace (Linux 7.3.0-rc3): ================================================================== BUG: KASAN: slab-out-of-bounds in n_tty_receive_buf_common+0xa01/0x1650 Read of size 4094 at addr ffff888101c58010 by task kworker/u17:1/65 Workqueue: events_unbound flush_to_ldisc Call Trace: <TASK> dump_stack_lvl+0x70/0xa0 print_report+0x153/0x4c6 kasan_report+0xf1/0x120 kasan_check_range+0x11c/0x200 __asan_memcpy+0x29/0x70 n_tty_receive_buf_common+0xa01/0x1650 tty_ldisc_receive_buf+0x66/0x110 tty_port_default_receive_buf+0x6b/0xb0 flush_to_ldisc+0x1b4/0x410 process_one_work+0x6ff/0x1110 worker_thread+0x4a8/0xb70 kthread+0x307/0x3e0 ret_from_fork+0x3ed/0x680 </TASK> ==================================================================
Text from CVE List
Affected versions 22
- Linuxaffected: e8c75a30a23c6ba63f4ef6895cbf41fd42f21aa2 before 037d7e3ca5c593092f4b0d471eb869a85cbddde0CVE List
- Linuxaffected: e8c75a30a23c6ba63f4ef6895cbf41fd42f21aa2 before 619c6d7dd76fff15a9714fbf02ce299b737f01a2CVE List
- Linuxaffected: e8c75a30a23c6ba63f4ef6895cbf41fd42f21aa2 before 39495ef5d6f8019e62d65807f217a7ca8232727aCVE List
- Linuxaffected: 54c522782fd11a720f959ee9cb5a15bb9580343dCVE List
- Linuxaffected: 05c508edc9d0b44e4706d3c2cf14ee12aac210d2CVE List
- Linuxaffected: e5be0e24ffc7f5783a3864b5b958088ed15be9e8CVE List
- Linuxaffected: a4719f6d07b2c63223f7452c435c5f578f105cfeCVE List
- Linuxaffected: b4492f1e7456bd162714c0ec2815c2749d930844CVE List
- Linuxaffected: 9a9c13ad21a8220cb70c9807a920f43520515f94CVE List
- Linuxaffected: 8c368d36878e2fc99285279fc5e14b3d3cb8947cCVE List
- Linuxaffected: 3.16.83 before 3.17CVE List
- Linuxaffected: 4.4.216 before 4.5CVE List
- Linuxaffected: 4.9.216 before 4.10CVE List
- Linuxaffected: 4.14.173 before 4.15CVE List
- Linuxaffected: 4.19.109 before 4.20CVE List
- Linuxaffected: 5.4.25 before 5.5CVE List
- Linuxaffected: 5.5.9 before 5.6CVE List
- Linuxaffected: 5.6CVE List
- Linuxunaffected: all versions before 5.6CVE List
- Linuxunaffected: 6.18.56 through 6.18.*CVE List
- Linuxunaffected: 7.2.10 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List