vfio/pci: Fix potential Spectre v1
Subsystems (2)
PATCH 1/1 vfio/pci: Fix potential Spectre v1
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
--- drivers/vfio/pci/vfio_pci.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/vfio/pci/vfio_pci.c +4 -0
@@ -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"
@@ -727,6 +728,9 @@ static long vfio_pci_ioctl(void *device_data,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 ;
Signature · 1 line
2.7.4
Alex Williamson
AppliedQuoted 15 lines · On Tue, 17 Jul 2018 12:39:00 -0500 "Gustavo A. R. Silva"…
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:734vfio_pci_ioctl()
warn: potential spectre issue 'vdev->region'Fix this by sanitizing info.index before indirectly using it to index
vdev->regionNotice 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].
Quoted 7 lines
[1] https://marc.info/?l=linux-kernel&m=152449131114778&w=2
Signed-off-by Gustavo A. R. Silva <[email protected]>--- drivers/vfio/pci/vfio_pci.c | 4 ++++ 1 file changed, 4 insertions(+)
Applied to vfio for-linus branch for v4.18. Thanks!
Alex
Quoted 22 lines
drivers/vfio/pci/vfio_pci.c +4
-0@@ -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" @@ -727,6 +728,9 @@ static long vfio_pci_ioctl(void *device_data,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 ;