x86: Lock down IO port access when the kernel is locked down
authorMatthew Garrett <matthew.garrett@nebula.com>
Wed, 5 Apr 2017 16:40:30 +0000 (17:40 +0100)
committerPeter Michael Green <plugwash@raspbian.org>
Wed, 7 Feb 2018 23:32:32 +0000 (23:32 +0000)
IO port access would permit users to gain access to PCI configuration
registers, which in turn (on a lot of hardware) give access to MMIO
register space. This would potentially permit root to trigger arbitrary
DMA, so lock it down by default.

This also implicitly locks down the KDADDIO, KDDELIO, KDENABIO and
KDDISABIO console ioctls.

Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Gbp-Pq: Topic features/all/lockdown
Gbp-Pq: Name 0050-x86-Lock-down-IO-port-access-when-the-kernel-is-lock.patch

arch/x86/kernel/ioport.c
drivers/char/mem.c

index 2f723301eb58fc5ad0d6796b342446ae2ee0c9e6..1d58481cf1c5863642f8db033eda2b390bc299fd 100644 (file)
@@ -31,7 +31,7 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
 
        if ((from + num <= from) || (from + num > IO_BITMAP_BITS))
                return -EINVAL;
-       if (turn_on && !capable(CAP_SYS_RAWIO))
+       if (turn_on && (!capable(CAP_SYS_RAWIO) || kernel_is_locked_down()))
                return -EPERM;
 
        /*
@@ -121,7 +121,7 @@ SYSCALL_DEFINE1(iopl, unsigned int, level)
                return -EINVAL;
        /* Trying to gain more privileges? */
        if (level > old) {
-               if (!capable(CAP_SYS_RAWIO))
+               if (!capable(CAP_SYS_RAWIO) || kernel_is_locked_down())
                        return -EPERM;
        }
        regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) |
index d0cc69aa3af8f331223ff583cebcdca63a952124..cd2d9b3bd68ae990058c7f140620c89d7784bedd 100644 (file)
@@ -769,6 +769,8 @@ static loff_t memory_lseek(struct file *file, loff_t offset, int orig)
 
 static int open_port(struct inode *inode, struct file *filp)
 {
+       if (kernel_is_locked_down())
+               return -EPERM;
        return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
 }