lkml.org 
[lkml]   [2010]   [May]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/2 v2] pci: check caps from sysfs file open to read device dependent config space
    * Alan Cox (alan@lxorguk.ukuu.org.uk) wrote:
    > I agree with the problem - but IMHO the fix is to require opening the file
    > checks CAP_SYS_something instead: not to hack the read method and make it
    > even weirder and more un-Linux than it is now.

    This patch does that. Not as convenient from the KVM/libvirt point of view
    because it is not prepared to do this setup before dropping privileges
    and launching the VM.

    thanks,
    -chris
    --

    From: Chris Wright <chrisw@sous-sol.org>
    Subject: [PATCH 2/2 v2] pci: check caps from sysfs file open to read device dependent config space

    The PCI config space bin_attr read handler has a hardcoded CAP_SYS_ADMIN
    check to verify privileges before allowing a user to read device
    dependent config space. This is meant to protect from an unprivileged
    user potentially locking up the box.

    When assigning a PCI device directly to a guest with libvirt and KVM,
    the sysfs config space file is chown'd to the unprivileged user that
    the KVM guest will run as. The guest needs to have full access to the
    device's config space since it's responsible for driving the device.
    However, despite being the owner of the sysfs file, the CAP_SYS_ADMIN
    check will not allow read access beyond the config header.

    With this patch we check privileges against the capabilities used when
    openining the sysfs file. The allows a privileged process to open the
    file and hand it to an unprivileged process, and the unprivileged process
    can still read all of the config space.

    Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    ---
    drivers/pci/pci-sysfs.c | 3 ++-
    1 files changed, 2 insertions(+), 1 deletions(-)

    diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
    index ad44557..6309c5a 100644
    --- a/drivers/pci/pci-sysfs.c
    +++ b/drivers/pci/pci-sysfs.c
    @@ -21,6 +21,7 @@
    #include <linux/stat.h>
    #include <linux/topology.h>
    #include <linux/mm.h>
    +#include <linux/fs.h>
    #include <linux/capability.h>
    #include <linux/pci-aspm.h>
    #include <linux/slab.h>
    @@ -367,7 +368,7 @@ pci_read_config(struct file *filp, struct kobject *kobj,
    u8 *data = (u8*) buf;

    /* Several chips lock up trying to read undefined config space */
    - if (capable(CAP_SYS_ADMIN)) {
    + if (cap_raised(filp->f_cred->cap_effective, CAP_SYS_ADMIN)) {
    size = dev->cfg_size;
    } else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
    size = 128;
    --
    1.6.5.2

    \
     
     \ /
      Last update: 2010-05-13 19:45    [W:0.023 / U:33.788 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site