diff mbox series

[1/1] drm/i915/gvt: Fix mmap range check

Message ID 20190529135221.4819-2-tjaalton@ubuntu.com
State New
Headers show
Series CVE-2019-11085: drm/i915 privilege escalation via local access | expand

Commit Message

Timo Aaltonen May 29, 2019, 1:52 p.m. UTC
From: Zhenyu Wang <zhenyuw@linux.intel.com>

This is to fix missed mmap range check on vGPU bar2 region
and only allow to map vGPU allocated GMADDR range, which means
user space should support sparse mmap to get proper offset for
mmap vGPU aperture. And this takes care of actual pgoff in mmap
request as original code always does from beginning of vGPU
aperture.

Fixes: 659643f7d814 ("drm/i915/gvt/kvmgt: add vfio/mdev support to KVMGT")
Cc: "Monroy, Rodrigo Axel" <rodrigo.axel.monroy@intel.com>
Cc: "Orrala Contreras, Alfredo" <alfredo.orrala.contreras@intel.com>
Cc: stable@vger.kernel.org # v4.10+
Reviewed-by: Hang Yuan <hang.yuan@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>

CVE-2019-11085

(cherry picked from commit 51b00d8509dc69c98740da2ad07308b630d3eb7d)
Signed-off-by: Timo Aaltonen <timo.aaltonen@canonical.com>
---
 drivers/gpu/drm/i915/gvt/kvmgt.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

Comments

Kleber Sacilotto de Souza June 4, 2019, 2:06 p.m. UTC | #1
On 5/29/19 3:52 PM, Timo Aaltonen wrote:
> From: Zhenyu Wang <zhenyuw@linux.intel.com>
> 
> This is to fix missed mmap range check on vGPU bar2 region
> and only allow to map vGPU allocated GMADDR range, which means
> user space should support sparse mmap to get proper offset for
> mmap vGPU aperture. And this takes care of actual pgoff in mmap
> request as original code always does from beginning of vGPU
> aperture.
> 
> Fixes: 659643f7d814 ("drm/i915/gvt/kvmgt: add vfio/mdev support to KVMGT")
> Cc: "Monroy, Rodrigo Axel" <rodrigo.axel.monroy@intel.com>
> Cc: "Orrala Contreras, Alfredo" <alfredo.orrala.contreras@intel.com>
> Cc: stable@vger.kernel.org # v4.10+
> Reviewed-by: Hang Yuan <hang.yuan@intel.com>
> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
> 
> CVE-2019-11085
> 
> (cherry picked from commit 51b00d8509dc69c98740da2ad07308b630d3eb7d)
> Signed-off-by: Timo Aaltonen <timo.aaltonen@canonical.com>

Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>

> ---
>  drivers/gpu/drm/i915/gvt/kvmgt.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
> index 14dce5c201d5..8f23d1f064c6 100644
> --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
> +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
> @@ -940,7 +940,7 @@ static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
>  {
>  	unsigned int index;
>  	u64 virtaddr;
> -	unsigned long req_size, pgoff = 0;
> +	unsigned long req_size, pgoff, req_start;
>  	pgprot_t pg_prot;
>  	struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);
>  
> @@ -958,7 +958,17 @@ static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
>  	pg_prot = vma->vm_page_prot;
>  	virtaddr = vma->vm_start;
>  	req_size = vma->vm_end - vma->vm_start;
> -	pgoff = vgpu_aperture_pa_base(vgpu) >> PAGE_SHIFT;
> +	pgoff = vma->vm_pgoff &
> +		((1U << (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
> +	req_start = pgoff << PAGE_SHIFT;
> +
> +	if (!intel_vgpu_in_aperture(vgpu, req_start))
> +		return -EINVAL;
> +	if (req_start + req_size >
> +	    vgpu_aperture_offset(vgpu) + vgpu_aperture_sz(vgpu))
> +		return -EINVAL;
> +
> +	pgoff = (gvt_aperture_pa_base(vgpu->gvt) >> PAGE_SHIFT) + pgoff;
>  
>  	return remap_pfn_range(vma, virtaddr, pgoff, req_size, pg_prot);
>  }
>
Tyler Hicks June 4, 2019, 3:10 p.m. UTC | #2
On 2019-05-29 16:52:21, Timo Aaltonen wrote:
> From: Zhenyu Wang <zhenyuw@linux.intel.com>
> 
> This is to fix missed mmap range check on vGPU bar2 region
> and only allow to map vGPU allocated GMADDR range, which means
> user space should support sparse mmap to get proper offset for
> mmap vGPU aperture. And this takes care of actual pgoff in mmap
> request as original code always does from beginning of vGPU
> aperture.
> 
> Fixes: 659643f7d814 ("drm/i915/gvt/kvmgt: add vfio/mdev support to KVMGT")
> Cc: "Monroy, Rodrigo Axel" <rodrigo.axel.monroy@intel.com>
> Cc: "Orrala Contreras, Alfredo" <alfredo.orrala.contreras@intel.com>
> Cc: stable@vger.kernel.org # v4.10+
> Reviewed-by: Hang Yuan <hang.yuan@intel.com>
> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
> 
> CVE-2019-11085
> 
> (cherry picked from commit 51b00d8509dc69c98740da2ad07308b630d3eb7d)
> Signed-off-by: Timo Aaltonen <timo.aaltonen@canonical.com>

Acked-by: Tyler Hicks <tyhicks@canonical.com>

Thanks!

Tyler

> ---
>  drivers/gpu/drm/i915/gvt/kvmgt.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
> index 14dce5c201d5..8f23d1f064c6 100644
> --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
> +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
> @@ -940,7 +940,7 @@ static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
>  {
>  	unsigned int index;
>  	u64 virtaddr;
> -	unsigned long req_size, pgoff = 0;
> +	unsigned long req_size, pgoff, req_start;
>  	pgprot_t pg_prot;
>  	struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);
>  
> @@ -958,7 +958,17 @@ static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
>  	pg_prot = vma->vm_page_prot;
>  	virtaddr = vma->vm_start;
>  	req_size = vma->vm_end - vma->vm_start;
> -	pgoff = vgpu_aperture_pa_base(vgpu) >> PAGE_SHIFT;
> +	pgoff = vma->vm_pgoff &
> +		((1U << (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
> +	req_start = pgoff << PAGE_SHIFT;
> +
> +	if (!intel_vgpu_in_aperture(vgpu, req_start))
> +		return -EINVAL;
> +	if (req_start + req_size >
> +	    vgpu_aperture_offset(vgpu) + vgpu_aperture_sz(vgpu))
> +		return -EINVAL;
> +
> +	pgoff = (gvt_aperture_pa_base(vgpu->gvt) >> PAGE_SHIFT) + pgoff;
>  
>  	return remap_pfn_range(vma, virtaddr, pgoff, req_size, pg_prot);
>  }
> -- 
> 2.20.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
index 14dce5c201d5..8f23d1f064c6 100644
--- a/drivers/gpu/drm/i915/gvt/kvmgt.c
+++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
@@ -940,7 +940,7 @@  static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
 {
 	unsigned int index;
 	u64 virtaddr;
-	unsigned long req_size, pgoff = 0;
+	unsigned long req_size, pgoff, req_start;
 	pgprot_t pg_prot;
 	struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);
 
@@ -958,7 +958,17 @@  static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
 	pg_prot = vma->vm_page_prot;
 	virtaddr = vma->vm_start;
 	req_size = vma->vm_end - vma->vm_start;
-	pgoff = vgpu_aperture_pa_base(vgpu) >> PAGE_SHIFT;
+	pgoff = vma->vm_pgoff &
+		((1U << (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
+	req_start = pgoff << PAGE_SHIFT;
+
+	if (!intel_vgpu_in_aperture(vgpu, req_start))
+		return -EINVAL;
+	if (req_start + req_size >
+	    vgpu_aperture_offset(vgpu) + vgpu_aperture_sz(vgpu))
+		return -EINVAL;
+
+	pgoff = (gvt_aperture_pa_base(vgpu->gvt) >> PAGE_SHIFT) + pgoff;
 
 	return remap_pfn_range(vma, virtaddr, pgoff, req_size, pg_prot);
 }