| From 0e714d27786ce1fb3efa9aac58abc096e68b1c2a Mon Sep 17 00:00:00 2001 |
| From: "Gustavo A. R. Silva" <gustavo@embeddedor.com> |
| Date: Tue, 17 Jul 2018 12:39:00 -0500 |
| Subject: vfio/pci: Fix potential Spectre v1 |
| |
| From: Gustavo A. R. Silva <gustavo@embeddedor.com> |
| |
| commit 0e714d27786ce1fb3efa9aac58abc096e68b1c2a upstream. |
| |
| info.index can be 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/vfio/pci/vfio_pci.c:734 vfio_pci_ioctl() |
| warn: potential spectre issue 'vdev->region' |
| |
| Fix this by sanitizing info.index before indirectly using it to index |
| vdev->region |
| |
| 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 |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com> |
| Signed-off-by: Alex Williamson <alex.williamson@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/vfio/pci/vfio_pci.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/vfio/pci/vfio_pci.c |
| +++ b/drivers/vfio/pci/vfio_pci.c |
| @@ -28,6 +28,7 @@ |
| #include <linux/uaccess.h> |
| #include <linux/vfio.h> |
| #include <linux/vgaarb.h> |
| +#include <linux/nospec.h> |
| |
| #include "vfio_pci_private.h" |
| |
| @@ -755,6 +756,9 @@ static long vfio_pci_ioctl(void *device_ |
| if (info.index >= |
| VFIO_PCI_NUM_REGIONS + vdev->num_regions) |
| return -EINVAL; |
| + info.index = array_index_nospec(info.index, |
| + VFIO_PCI_NUM_REGIONS + |
| + vdev->num_regions); |
| |
| i = info.index - VFIO_PCI_NUM_REGIONS; |
| |