From: Laszlo Ersek <lersek@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: Petr Matousek <pmatouse@redhat.com>,
secalert@redhat.com, qemu-stable@nongnu.org,
qemu-devel@nongnu.org, P J P <ppandit@redhat.com>,
Anthony Liguori <aliguori@amazon.com>,
spice-devel@lists.freedesktop.org
Subject: Re: [Qemu-devel] [CVE-2014-3615 PATCH v2 3/3] spice: make sure we don't overflow ssd->buf
Date: Fri, 05 Sep 2014 12:15:51 +0200 [thread overview]
Message-ID: <54098D57.3010008@redhat.com> (raw)
In-Reply-To: <1409909600.20018.11.camel@nilsson.home.kraxel.org>
On 09/05/14 11:33, Gerd Hoffmann wrote:
> On Fr, 2014-09-05 at 11:06 +0200, Laszlo Ersek wrote:
>>> > > Makes sense. I think it is easier to just multiply in 64bit, then
>> > check
>>> > > the result is small enougth (new patch attached).
>> >
>> > Okay, if you can guarantee that the product fits in uint64_t, then
>> > such
>> > a check would suffice.
>> >
>> > New patch has not been attached though :)
> Oops. Here we go.
>
> cheers,
> Gerd
>
>
> 0001-spice-make-sure-we-don-t-overflow-ssd-buf.patch
>
>
> From 33c5c3d1736fd577fc1279a1f3c50d2414e98fe3 Mon Sep 17 00:00:00 2001
> From: Gerd Hoffmann <kraxel@redhat.com>
> Date: Wed, 3 Sep 2014 15:50:08 +0200
> Subject: [PATCH] spice: make sure we don't overflow ssd->buf
>
> Related spice-only bug. We have a fixed 16 MB buffer here, being
> presented to the spice-server as qxl video memory in case spice is
> used with a non-qxl card. It's also used with qxl in vga mode.
>
> When using display resolutions requiring more than 16 MB of memory we
> are going to overflow that buffer. In theory the guest can write,
> indirectly via spice-server. The spice-server clears the memory after
> setting a new video mode though, triggering a segfault in the overflow
> case, so qemu crashes before the guest has a chance to do something
> evil.
>
> Fix that by switching to dynamic allocation for the buffer.
>
> CVE-2014-3615
>
> Cc: qemu-stable@nongnu.org
> Cc: secalert@redhat.com
> Cc: Laszlo Ersek <lersek@redhat.com>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> ui/spice-display.c | 20 +++++++++++++++-----
> 1 file changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/ui/spice-display.c b/ui/spice-display.c
> index 66e2578..def7b52 100644
> --- a/ui/spice-display.c
> +++ b/ui/spice-display.c
> @@ -334,11 +334,23 @@ void qemu_spice_create_host_memslot(SimpleSpiceDisplay *ssd)
> void qemu_spice_create_host_primary(SimpleSpiceDisplay *ssd)
> {
> QXLDevSurfaceCreate surface;
> + uint64_t surface_size;
>
> memset(&surface, 0, sizeof(surface));
>
> - dprint(1, "%s/%d: %dx%d\n", __func__, ssd->qxl.id,
> - surface_width(ssd->ds), surface_height(ssd->ds));
> + surface_size = (uint64_t) surface_width(ssd->ds) *
> + surface_height(ssd->ds) * 4;
> + assert(surface_size > 0);
> + assert(surface_size < INT_MAX);
> + if (ssd->bufsize < surface_size) {
> + ssd->bufsize = surface_size;
> + g_free(ssd->buf);
> + ssd->buf = g_malloc(ssd->bufsize);
> + }
> +
> + dprint(1, "%s/%d: %ux%u (size %" PRIu64 "/%d)\n", __func__, ssd->qxl.id,
> + surface_width(ssd->ds), surface_height(ssd->ds),
> + surface_size, ssd->bufsize);
>
> surface.format = SPICE_SURFACE_FMT_32_xRGB;
> surface.width = surface_width(ssd->ds);
> @@ -369,8 +381,6 @@ void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd)
> if (ssd->num_surfaces == 0) {
> ssd->num_surfaces = 1024;
> }
> - ssd->bufsize = (16 * 1024 * 1024);
> - ssd->buf = g_malloc(ssd->bufsize);
> }
>
> /* display listener callbacks */
> @@ -495,7 +505,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
> info->num_memslots = NUM_MEMSLOTS;
> info->num_memslots_groups = NUM_MEMSLOTS_GROUPS;
> info->internal_groupslot_id = 0;
> - info->qxl_ram_size = ssd->bufsize;
> + info->qxl_ram_size = 16 * 1024 * 1024;
> info->n_surfaces = ssd->num_surfaces;
> }
>
> -- 1.8.3.1
>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
prev parent reply other threads:[~2014-09-05 10:16 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-04 7:04 [Qemu-devel] [CVE-2014-3615 PATCH v2 0/3] vbe: bochs dispi interface fixes Gerd Hoffmann
2014-09-04 7:04 ` [Qemu-devel] [CVE-2014-3615 PATCH v2 1/3] vbe: make bochs dispi interface return the correct memory size with qxl Gerd Hoffmann
2014-09-04 7:04 ` [Qemu-devel] [CVE-2014-3615 PATCH v2 2/3] vbe: rework sanity checks Gerd Hoffmann
2014-09-04 7:04 ` [Qemu-devel] [CVE-2014-3615 PATCH v2 3/3] spice: make sure we don't overflow ssd->buf Gerd Hoffmann
2014-09-05 7:52 ` Laszlo Ersek
2014-09-05 8:58 ` Gerd Hoffmann
2014-09-05 9:06 ` Laszlo Ersek
2014-09-05 9:33 ` Gerd Hoffmann
2014-09-05 10:15 ` Laszlo Ersek [this message]
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=54098D57.3010008@redhat.com \
--to=lersek@redhat.com \
--cc=aliguori@amazon.com \
--cc=kraxel@redhat.com \
--cc=pmatouse@redhat.com \
--cc=ppandit@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.org \
--cc=secalert@redhat.com \
--cc=spice-devel@lists.freedesktop.org \
/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;
as well as URLs for NNTP newsgroup(s).