| From b2b2dd71e0859436d4e05b2f61f86140250ed3f8 Mon Sep 17 00:00:00 2001 |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Date: Fri, 22 Nov 2019 12:42:20 -0800 |
| Subject: tty: vt: keyboard: reject invalid keycodes |
| |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| |
| commit b2b2dd71e0859436d4e05b2f61f86140250ed3f8 upstream. |
| |
| Do not try to handle keycodes that are too big, otherwise we risk doing |
| out-of-bounds writes: |
| |
| BUG: KASAN: global-out-of-bounds in clear_bit include/asm-generic/bitops-instrumented.h:56 [inline] |
| BUG: KASAN: global-out-of-bounds in kbd_keycode drivers/tty/vt/keyboard.c:1411 [inline] |
| BUG: KASAN: global-out-of-bounds in kbd_event+0xe6b/0x3790 drivers/tty/vt/keyboard.c:1495 |
| Write of size 8 at addr ffffffff89a1b2d8 by task syz-executor108/1722 |
| ... |
| kbd_keycode drivers/tty/vt/keyboard.c:1411 [inline] |
| kbd_event+0xe6b/0x3790 drivers/tty/vt/keyboard.c:1495 |
| input_to_handler+0x3b6/0x4c0 drivers/input/input.c:118 |
| input_pass_values.part.0+0x2e3/0x720 drivers/input/input.c:145 |
| input_pass_values drivers/input/input.c:949 [inline] |
| input_set_keycode+0x290/0x320 drivers/input/input.c:954 |
| evdev_handle_set_keycode_v2+0xc4/0x120 drivers/input/evdev.c:882 |
| evdev_do_ioctl drivers/input/evdev.c:1150 [inline] |
| |
| In this case we were dealing with a fuzzed HID device that declared over |
| 12K buttons, and while HID layer should not be reporting to us such big |
| keycodes, we should also be defensive and reject invalid data ourselves as |
| well. |
| |
| Reported-by: syzbot+19340dff067c2d3835c0@syzkaller.appspotmail.com |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Cc: stable <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20191122204220.GA129459@dtor-ws |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/tty/vt/keyboard.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/tty/vt/keyboard.c |
| +++ b/drivers/tty/vt/keyboard.c |
| @@ -1358,7 +1358,7 @@ static void kbd_event(struct input_handl |
| |
| if (event_type == EV_MSC && event_code == MSC_RAW && HW_RAW(handle->dev)) |
| kbd_rawcode(value); |
| - if (event_type == EV_KEY) |
| + if (event_type == EV_KEY && event_code <= KEY_MAX) |
| kbd_keycode(event_code, value, HW_RAW(handle->dev)); |
| |
| spin_unlock(&kbd_event_lock); |