Kernel KVM virtualization development
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@redhat.com>
To: Vlad Tsyrklevich <vlad@tsyrklevich.net>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH] vfio/pci: Fix integer overflow/heap memory disclosure
Date: Tue, 11 Oct 2016 10:10:31 -0600	[thread overview]
Message-ID: <20161011101031.4cdd6647@t450s.home> (raw)
In-Reply-To: <1476183739-35210-1-git-send-email-vlad@tsyrklevich.net>

On Tue, 11 Oct 2016 13:02:19 +0200
Vlad Tsyrklevich <vlad@tsyrklevich.net> wrote:

> The VFIO_DEVICE_SET_IRQS and VFIO_DEVICE_GET_PCI_HOT_RESET_INFO ioctls
> do not sufficiently sanitize user-supplied integers, allowing users to
> read arbitrary amounts of kernel heap memory or cause a crash.
> 
> Signed-off-by: Vlad Tsyrklevich <vlad@tsyrklevich.net>
> 
> ---
>  drivers/vfio/pci/vfio_pci.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
> index d624a52..c3fbfb8 100644
> --- a/drivers/vfio/pci/vfio_pci.c
> +++ b/drivers/vfio/pci/vfio_pci.c
> @@ -838,6 +838,7 @@ static long vfio_pci_ioctl(void *device_data,
>  			return -EFAULT;
>  
>  		if (hdr.argsz < minsz || hdr.index >= VFIO_PCI_NUM_IRQS ||
> +		    hdr.count >= (U32_MAX - hdr.start) ||
>  		    hdr.flags & ~(VFIO_IRQ_SET_DATA_TYPE_MASK |
>  				  VFIO_IRQ_SET_ACTION_TYPE_MASK))
>  			return -EINVAL;


Isn't the issue you're trying to solve here caught in the code block
below this?  ie.

                if (!(hdr.flags & VFIO_IRQ_SET_DATA_NONE)) {
                        size_t size;
                        int max = vfio_pci_get_irq_count(vdev, hdr.index);
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

                        if (hdr.flags & VFIO_IRQ_SET_DATA_BOOL)
                                size = sizeof(uint8_t);
                        else if (hdr.flags & VFIO_IRQ_SET_DATA_EVENTFD)
                                size = sizeof(int32_t);
                        else
                                return -EINVAL;

                        if (hdr.argsz - minsz < hdr.count * size ||
                            hdr.start >= max || hdr.start + hdr.count > max)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                return -EINVAL;

                        data = memdup_user((void __user *)(arg + minsz),
                                           hdr.count * size);
                        if (IS_ERR(data))
                                return PTR_ERR(data);
                }

In fact we're doing better than allowing U32_MAX, we're testing the
number of indexes for a given IRQ and making sure the user hasn't
exceeded that.

> @@ -909,6 +910,9 @@ static long vfio_pci_ioctl(void *device_data,
>  
>  		WARN_ON(!fill.max); /* Should always be at least one */
>  
> +		if (hdr.count > fill.max)
> +			hdr.count = fill.max;
> +
>  		/*
>  		 * If there's enough space, fill it now, otherwise return
>  		 * -ENOSPC and the number of devices affected.

hdr.count is an output for this ioctl, not an input.  hdr.count is set
on all success paths and on the -ENOSPC path, the user cannot rely on a
value for any other error cases.

I'm not seeing that there's an issue on either path here, please
elaborate if you still disagree.  Thanks,

Alex

  reply	other threads:[~2016-10-11 16:22 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-11 11:02 [PATCH] vfio/pci: Fix integer overflow/heap memory disclosure Vlad Tsyrklevich
2016-10-11 16:10 ` Alex Williamson [this message]
2016-10-11 20:04   ` Vlad Tsyrklevich
2016-10-11 22:39     ` Alex Williamson
2016-10-12  7:53       ` [PATCH v2] vfio/pci: Fix integer overflows, bitmask check Vlad Tsyrklevich
2016-10-12 14:51         ` Alex Williamson
2016-10-12 15:06           ` Vlad Tsyrklevich
2016-10-12 15:39             ` Alex Williamson
2016-10-12 16:51               ` [PATCH v3] " Vlad Tsyrklevich
2016-10-26 21:19                 ` Alex Williamson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161011101031.4cdd6647@t450s.home \
    --to=alex.williamson@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=vlad@tsyrklevich.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox