Control: tags 797976 + pending

Dear maintainer,

I've prepared an NMU for spice (versioned as 0.12.5-1.2) and
uploaded it to DELAYED/2. Please feel free to tell me if I
should delay it longer.

Regards,
Salvatore
diff -Nru spice-0.12.5/debian/changelog spice-0.12.5/debian/changelog
--- spice-0.12.5/debian/changelog	2015-08-14 09:29:46.000000000 +0200
+++ spice-0.12.5/debian/changelog	2015-09-05 05:52:55.000000000 +0200
@@ -1,3 +1,12 @@
+spice (0.12.5-1.2) unstable; urgency=high
+
+  * Non-maintainer upload.
+  * Add CVE-2015-3247.patch patch.
+    CVE-2015-3247: Memory corruption in worker_update_monitors_config().
+    (Closes: #797976)
+
+ -- Salvatore Bonaccorso <car...@debian.org>  Sat, 05 Sep 2015 05:51:01 +0200
+
 spice (0.12.5-1.1) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru spice-0.12.5/debian/patches/CVE-2015-3247.patch spice-0.12.5/debian/patches/CVE-2015-3247.patch
--- spice-0.12.5/debian/patches/CVE-2015-3247.patch	1970-01-01 01:00:00.000000000 +0100
+++ spice-0.12.5/debian/patches/CVE-2015-3247.patch	2015-09-05 05:52:55.000000000 +0200
@@ -0,0 +1,115 @@
+From 524eef10c6c6c2f3f30be28c56b8f96adc7901f0 Mon Sep 17 00:00:00 2001
+From: Frediano Ziglio <fzig...@redhat.com>
+Date: Tue, 9 Jun 2015 08:50:46 +0100
+Subject: [PATCH] Avoid race conditions reading monitor configs from guest
+
+For security reasons do not assume guest do not change structures it
+pass to Qemu.
+Guest could change count field while Qemu is copying QXLMonitorsConfig
+structure leading to heap corruption.
+This patch avoid it reading count only once.
+
+Signed-off-by: Frediano Ziglio <fzig...@redhat.com>
+---
+ server/red_worker.c | 46 ++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 32 insertions(+), 14 deletions(-)
+
+--- a/server/red_worker.c
++++ b/server/red_worker.c
+@@ -11051,7 +11051,8 @@ static inline void red_monitors_config_i
+ }
+ 
+ static void worker_update_monitors_config(RedWorker *worker,
+-                                          QXLMonitorsConfig *dev_monitors_config)
++                                          QXLMonitorsConfig *dev_monitors_config,
++                                          uint16_t count, uint16_t max_allowed)
+ {
+     int heads_size;
+     MonitorsConfig *monitors_config;
+@@ -11060,22 +11061,22 @@ static void worker_update_monitors_confi
+     monitors_config_decref(worker->monitors_config);
+ 
+     spice_debug("monitors config %d(%d)",
+-                dev_monitors_config->count,
+-                dev_monitors_config->max_allowed);
+-    for (i = 0; i < dev_monitors_config->count; i++) {
++                count,
++                max_allowed);
++    for (i = 0; i < count; i++) {
+         spice_debug("+%d+%d %dx%d",
+                     dev_monitors_config->heads[i].x,
+                     dev_monitors_config->heads[i].y,
+                     dev_monitors_config->heads[i].width,
+                     dev_monitors_config->heads[i].height);
+     }
+-    heads_size = dev_monitors_config->count * sizeof(QXLHead);
++    heads_size = count * sizeof(QXLHead);
+     worker->monitors_config = monitors_config =
+         spice_malloc(sizeof(*monitors_config) + heads_size);
+     monitors_config->refs = 1;
+     monitors_config->worker = worker;
+-    monitors_config->count = dev_monitors_config->count;
+-    monitors_config->max_allowed = dev_monitors_config->max_allowed;
++    monitors_config->count = count;
++    monitors_config->max_allowed = max_allowed;
+     memcpy(monitors_config->heads, dev_monitors_config->heads, heads_size);
+ }
+ 
+@@ -11459,33 +11460,50 @@ void handle_dev_display_migrate(void *op
+     red_migrate_display(worker, rcc);
+ }
+ 
++static inline uint32_t qxl_monitors_config_size(uint32_t heads)
++{
++    return sizeof(QXLMonitorsConfig) + sizeof(QXLHead) * heads;
++}
++
+ static void handle_dev_monitors_config_async(void *opaque, void *payload)
+ {
+     RedWorkerMessageMonitorsConfigAsync *msg = payload;
+     RedWorker *worker = opaque;
+-    int min_size = sizeof(QXLMonitorsConfig) + sizeof(QXLHead);
+     int error;
++    uint16_t count, max_allowed;
+     QXLMonitorsConfig *dev_monitors_config =
+         (QXLMonitorsConfig*)get_virt(&worker->mem_slots, msg->monitors_config,
+-                                     min_size, msg->group_id, &error);
++                                     qxl_monitors_config_size(1),
++                                     msg->group_id, &error);
+ 
+     if (error) {
+         /* TODO: raise guest bug (requires added QXL interface) */
+         return;
+     }
+     worker->driver_cap_monitors_config = 1;
+-    if (dev_monitors_config->count == 0) {
++    count = dev_monitors_config->count;
++    max_allowed = dev_monitors_config->max_allowed;
++    if (count == 0) {
+         spice_warning("ignoring an empty monitors config message from driver");
+         return;
+     }
+-    if (dev_monitors_config->count > dev_monitors_config->max_allowed) {
++    if (count > max_allowed) {
+         spice_warning("ignoring malformed monitors_config from driver, "
+                       "count > max_allowed %d > %d",
+-                      dev_monitors_config->count,
+-                      dev_monitors_config->max_allowed);
++                      count,
++                      max_allowed);
++        return;
++    }
++    /* get pointer again to check virtual size */
++    dev_monitors_config =
++        (QXLMonitorsConfig*)get_virt(&worker->mem_slots, msg->monitors_config,
++                                     qxl_monitors_config_size(count),
++                                     msg->group_id, &error);
++    if (error) {
++        /* TODO: raise guest bug (requires added QXL interface) */
+         return;
+     }
+-    worker_update_monitors_config(worker, dev_monitors_config);
++    worker_update_monitors_config(worker, dev_monitors_config, count, max_allowed);
+     red_worker_push_monitors_config(worker);
+ }
+ 
diff -Nru spice-0.12.5/debian/patches/series spice-0.12.5/debian/patches/series
--- spice-0.12.5/debian/patches/series	2014-05-23 16:46:36.000000000 +0200
+++ spice-0.12.5/debian/patches/series	2015-09-05 05:52:55.000000000 +0200
@@ -1 +1,2 @@
 fix-tests-warnings.patch
+CVE-2015-3247.patch

Attachment: signature.asc
Description: Digital signature

Reply via email to