| From: "Gustavo A. R. Silva" <gustavo@embeddedor.com> |
| Date: Thu, 16 Aug 2018 15:30:38 -0500 |
| Subject: tty: vt_ioctl: fix potential Spectre v1 |
| |
| commit e97267cb4d1ee01ca0929638ec0fcbb0904f903d upstream. |
| |
| vsa.console is indirectly controlled by user-space, hence leading to |
| a potential exploitation of the Spectre variant 1 vulnerability. |
| |
| This issue was detected with the help of Smatch: |
| |
| drivers/tty/vt/vt_ioctl.c:711 vt_ioctl() warn: potential spectre issue |
| 'vc_cons' [r] |
| |
| Fix this by sanitizing vsa.console before using it to index vc_cons |
| |
| Notice that given that speculation windows are large, the policy is |
| to kill the speculation on the first load and not worry if it can be |
| completed with a dependent load/store [1]. |
| |
| [1] https://marc.info/?l=linux-kernel&m=152449131114778&w=2 |
| |
| Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com> |
| Reviewed-by: Alan Cox <alan@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/tty/vt/vt_ioctl.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/tty/vt/vt_ioctl.c |
| +++ b/drivers/tty/vt/vt_ioctl.c |
| @@ -31,6 +31,8 @@ |
| #include <asm/io.h> |
| #include <asm/uaccess.h> |
| |
| +#include <linux/nospec.h> |
| + |
| #include <linux/kbd_kern.h> |
| #include <linux/vt_kern.h> |
| #include <linux/kbd_diacr.h> |
| @@ -703,6 +705,8 @@ int vt_ioctl(struct tty_struct *tty, |
| if (vsa.console == 0 || vsa.console > MAX_NR_CONSOLES) |
| ret = -ENXIO; |
| else { |
| + vsa.console = array_index_nospec(vsa.console, |
| + MAX_NR_CONSOLES + 1); |
| vsa.console--; |
| console_lock(); |
| ret = vc_allocate(vsa.console); |