]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dmaengine: idxd: add a new security check to deal with a hardware erratum
authorArjan van de Ven <arjan@linux.intel.com>
Wed, 24 Apr 2024 14:43:22 +0000 (14:43 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2024 09:56:23 +0000 (11:56 +0200)
commit e11452eb071b2a8e6ba52892b2e270bbdaa6640d upstream.

On Sapphire Rapids and related platforms, the DSA and IAA devices have an
erratum that causes direct access (for example, by using the ENQCMD or
MOVDIR64 instructions) from untrusted applications to be a security problem.

To solve this, add a flag to the PCI device enumeration and device structures
to indicate the presence/absence of this security exposure. In the mmap()
method of the device, this flag is then used to enforce that the user
has the CAP_SYS_RAWIO capability.

In a future patch, a write() based method will be added that allows untrusted
applications submit work to the accelerator, where the kernel can do
sanity checking on the user input to ensure secure operation of the accelerator.

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/dma/idxd/cdev.c
drivers/dma/idxd/idxd.h
drivers/dma/idxd/init.c

index a9b96b18772f322ef4c74ba8acad04ae1f978c99..2138c993f20778ad30e41ca4fab3ec7aeda465dc 100644 (file)
@@ -198,6 +198,18 @@ static int idxd_cdev_mmap(struct file *filp, struct vm_area_struct *vma)
        int rc;
 
        dev_dbg(&pdev->dev, "%s called\n", __func__);
+
+       /*
+        * Due to an erratum in some of the devices supported by the driver,
+        * direct user submission to the device can be unsafe.
+        * (See the INTEL-SA-01084 security advisory)
+        *
+        * For the devices that exhibit this behavior, require that the user
+        * has CAP_SYS_RAWIO capabilities.
+        */
+       if (!idxd->user_submission_safe && !capable(CAP_SYS_RAWIO))
+               return -EPERM;
+
        rc = check_vma(wq, vma, __func__);
        if (rc < 0)
                return rc;
index 7ced8d283d98b28f071e5ce7f0f5f6c5f71d78c6..14c6ef987fede70891b17957c0d4069630bdd110 100644 (file)
@@ -258,6 +258,7 @@ struct idxd_driver_data {
        struct device_type *dev_type;
        int compl_size;
        int align;
+       bool user_submission_safe;
 };
 
 struct idxd_device {
@@ -316,6 +317,8 @@ struct idxd_device {
        struct idxd_pmu *idxd_pmu;
 
        unsigned long *opcap_bmap;
+
+       bool user_submission_safe;
 };
 
 /* IDXD software descriptor */
index e0f49545d89ff1d9ec5c6e0ec1cc730100ec96e5..30193195c8133a158db39cccb9ce24ee73cc0a64 100644 (file)
@@ -48,6 +48,7 @@ static struct idxd_driver_data idxd_driver_data[] = {
                .compl_size = sizeof(struct dsa_completion_record),
                .align = 32,
                .dev_type = &dsa_device_type,
+               .user_submission_safe = false, /* See INTEL-SA-01084 security advisory */
        },
        [IDXD_TYPE_IAX] = {
                .name_prefix = "iax",
@@ -55,6 +56,7 @@ static struct idxd_driver_data idxd_driver_data[] = {
                .compl_size = sizeof(struct iax_completion_record),
                .align = 64,
                .dev_type = &iax_device_type,
+               .user_submission_safe = false, /* See INTEL-SA-01084 security advisory */
        },
 };
 
@@ -663,6 +665,8 @@ static int idxd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        dev_info(&pdev->dev, "Intel(R) Accelerator Device (v%x)\n",
                 idxd->hw.version);
 
+       idxd->user_submission_safe = data->user_submission_safe;
+
        return 0;
 
  err_dev_register: