99 lines
3.1 KiB
Diff
99 lines
3.1 KiB
Diff
From: Matthew Garrett <matthew.garrett@nebula.com>
|
|
Date: Wed, 8 Nov 2017 15:11:33 +0000
|
|
Subject: [11/29] PCI: Lock down BAR access when the kernel is locked down
|
|
Origin: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/commit?id=d107d11fd7ac982a34b1233722cb3e72f9fe5a20
|
|
|
|
Any hardware that can potentially generate DMA has to be locked down in
|
|
order to avoid it being possible for an attacker to modify kernel code,
|
|
allowing them to circumvent disabled module loading or module signing.
|
|
Default to paranoid - in future we can potentially relax this for
|
|
sufficiently IOMMU-isolated devices.
|
|
|
|
Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
|
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
|
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
|
|
Reviewed-by: "Lee, Chun-Yi" <jlee@suse.com>
|
|
cc: linux-pci@vger.kernel.org
|
|
---
|
|
drivers/pci/pci-sysfs.c | 9 +++++++++
|
|
drivers/pci/proc.c | 9 ++++++++-
|
|
drivers/pci/syscall.c | 3 ++-
|
|
3 files changed, 19 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/pci/pci-sysfs.c
|
|
+++ b/drivers/pci/pci-sysfs.c
|
|
@@ -930,6 +930,9 @@ static ssize_t pci_write_config(struct f
|
|
loff_t init_off = off;
|
|
u8 *data = (u8 *) buf;
|
|
|
|
+ if (kernel_is_locked_down("Direct PCI access"))
|
|
+ return -EPERM;
|
|
+
|
|
if (off > dev->cfg_size)
|
|
return 0;
|
|
if (off + count > dev->cfg_size) {
|
|
@@ -1224,6 +1227,9 @@ static int pci_mmap_resource(struct kobj
|
|
enum pci_mmap_state mmap_type;
|
|
struct resource *res = &pdev->resource[bar];
|
|
|
|
+ if (kernel_is_locked_down("Direct PCI access"))
|
|
+ return -EPERM;
|
|
+
|
|
if (res->flags & IORESOURCE_MEM && iomem_is_exclusive(res->start))
|
|
return -EINVAL;
|
|
|
|
@@ -1299,6 +1305,9 @@ static ssize_t pci_write_resource_io(str
|
|
struct bin_attribute *attr, char *buf,
|
|
loff_t off, size_t count)
|
|
{
|
|
+ if (kernel_is_locked_down("Direct PCI access"))
|
|
+ return -EPERM;
|
|
+
|
|
return pci_resource_io(filp, kobj, attr, buf, off, count, true);
|
|
}
|
|
|
|
--- a/drivers/pci/proc.c
|
|
+++ b/drivers/pci/proc.c
|
|
@@ -117,6 +117,9 @@ static ssize_t proc_bus_pci_write(struct
|
|
int size = dev->cfg_size;
|
|
int cnt;
|
|
|
|
+ if (kernel_is_locked_down("Direct PCI access"))
|
|
+ return -EPERM;
|
|
+
|
|
if (pos >= size)
|
|
return 0;
|
|
if (nbytes >= size)
|
|
@@ -196,6 +199,9 @@ static long proc_bus_pci_ioctl(struct fi
|
|
#endif /* HAVE_PCI_MMAP */
|
|
int ret = 0;
|
|
|
|
+ if (kernel_is_locked_down("Direct PCI access"))
|
|
+ return -EPERM;
|
|
+
|
|
switch (cmd) {
|
|
case PCIIOC_CONTROLLER:
|
|
ret = pci_domain_nr(dev->bus);
|
|
@@ -237,7 +243,8 @@ static int proc_bus_pci_mmap(struct file
|
|
struct pci_filp_private *fpriv = file->private_data;
|
|
int i, ret, write_combine = 0, res_bit = IORESOURCE_MEM;
|
|
|
|
- if (!capable(CAP_SYS_RAWIO))
|
|
+ if (!capable(CAP_SYS_RAWIO) ||
|
|
+ kernel_is_locked_down("Direct PCI access"))
|
|
return -EPERM;
|
|
|
|
if (fpriv->mmap_state == pci_mmap_io) {
|
|
--- a/drivers/pci/syscall.c
|
|
+++ b/drivers/pci/syscall.c
|
|
@@ -93,7 +93,8 @@ SYSCALL_DEFINE5(pciconfig_write, unsigne
|
|
u32 dword;
|
|
int err = 0;
|
|
|
|
- if (!capable(CAP_SYS_ADMIN))
|
|
+ if (!capable(CAP_SYS_ADMIN) ||
|
|
+ kernel_is_locked_down("Direct PCI access"))
|
|
return -EPERM;
|
|
|
|
dev = pci_get_domain_bus_and_slot(0, bus, dfn);
|