[Pkg-xen-changes] r580 - in trunk/xen-3/debian: . patches
Bastian Blank
waldi at alioth.debian.org
Fri Jun 20 17:23:32 UTC 2008
Author: waldi
Date: Fri Jun 20 17:23:32 2008
New Revision: 580
Log:
* debian/changelog: Update.
* debian/patches/series: Add CVE-2008-1952.patch.
* debian/patches/CVE-2008-1952.patch: Add.
Added:
trunk/xen-3/debian/patches/CVE-2008-1952.patch
Modified:
trunk/xen-3/debian/changelog
trunk/xen-3/debian/patches/series
Modified: trunk/xen-3/debian/changelog
==============================================================================
--- trunk/xen-3/debian/changelog (original)
+++ trunk/xen-3/debian/changelog Fri Jun 20 17:23:32 2008
@@ -1,6 +1,8 @@
xen-3 (3.2.1-2) UNRELEASED; urgency=low
* Use e2fslibs based ext2 support for pygrub. (closes: #476366)
+ * Fix missing checks in pvfb code.
+ See CVE-2008-1952. (closes: #487095)
-- Bastian Blank <waldi at debian.org> Mon, 09 Jun 2008 18:50:59 +0200
Added: trunk/xen-3/debian/patches/CVE-2008-1952.patch
==============================================================================
--- (empty file)
+++ trunk/xen-3/debian/patches/CVE-2008-1952.patch Fri Jun 20 17:23:32 2008
@@ -0,0 +1,117 @@
+# HG changeset patch
+# User Keir Fraser <keir.fraser at citrix.com>
+# Date 1210689273 -3600
+# Node ID f70475e8396dc4bc0304d5ff697f18e2b35926f4
+# Parent 01f12d39071efa0b5e0d28c06584a42f19c49437
+ioemu: Fix PVFB backend to validate frontend's frame buffer
+description
+
+A buggy or malicious frontend can describe its shared framebuffer to
+the backend in a way that makes the backend map an arbitrary amount of
+guest memory, malloc an arbitrarily large internal buffer, copy
+arbitrary memory to that buffer, even beyond its end. A domU running
+a malicious frontend can abuse the former two for denial of service
+attacks against dom0. It can abuse the third to write arbitrary
+backend memory. It can abuse all three to terminate or crash the
+backend. Arbitrary code execution looks quite feasible.
+
+From: Markus Armbruster <armbru at redhat.com>
+Signed-off-by: Keir Fraser <keir.fraser at citrix.com>
+xen-unstable changeset: 17630:53195719f7621110dab7a97a2bca292b73baa715
+xen-unstable date: Tue May 13 15:08:17 2008 +0100
+
+diff -r 01f12d39071e -r f70475e8396d tools/ioemu/hw/xenfb.c
+--- a/tools/ioemu/hw/xenfb.c Tue May 13 15:23:51 2008 +0100
++++ b/tools/ioemu/hw/xenfb.c Tue May 13 15:34:33 2008 +0100
+@@ -22,8 +22,6 @@
+ #ifndef BTN_LEFT
+ #define BTN_LEFT 0x110 /* from <linux/input.h> */
+ #endif
+-
+-// FIXME defend against malicious frontend?
+
+ struct xenfb;
+
+@@ -476,6 +474,50 @@ void xenfb_shutdown(struct xenfb *xenfb)
+ free(xenfb);
+ }
+
++static int xenfb_configure_fb(struct xenfb *xenfb,
++ int width, int height, int depth,
++ size_t fb_len, int row_stride)
++{
++ size_t mfn_sz = sizeof(*((struct xenfb_page *)0)->pd);
++ size_t pd_len = sizeof(((struct xenfb_page *)0)->pd) / mfn_sz;
++ size_t fb_pages = pd_len * XC_PAGE_SIZE / mfn_sz;
++ size_t fb_len_max = fb_pages * XC_PAGE_SIZE;
++ int max_width, max_height;
++
++ if (depth != 8 && depth != 16 && depth != 24 && depth != 32) {
++ fprintf(stderr,
++ "FB: can't handle frontend fb depth %d\n",
++ depth);
++ return -1;
++ }
++ if (row_stride < 0 || row_stride > fb_len) {
++ fprintf(stderr,
++ "FB: invalid frontend stride %d\n", row_stride);
++ return -1;
++ }
++ max_width = row_stride / (depth / 8);
++ if (width < 0 || width > max_width) {
++ fprintf(stderr,
++ "FB: invalid frontend width %d limited to %d\n",
++ width, max_width);
++ width = max_width;
++ }
++ max_height = fb_len / row_stride;
++ if (height < 0 || height > max_height) {
++ fprintf(stderr,
++ "FB: invalid frontend height %d limited to %d\n",
++ height, max_height);
++ height = max_height;
++ }
++ xenfb->fb_len = fb_len;
++ xenfb->row_stride = row_stride;
++ xenfb->depth = depth;
++ xenfb->width = width;
++ xenfb->height = height;
++ fprintf(stderr, "Framebuffer %dx%dx%d stride %d\n",
++ width, height, depth, row_stride);
++ return 0;
++}
+
+ static void xenfb_on_fb_event(struct xenfb *xenfb)
+ {
+@@ -506,7 +548,6 @@ static void xenfb_on_fb_event(struct xen
+ || h != event->update.height) {
+ fprintf(stderr, "%s bogus update clipped\n",
+ xenfb->fb.nodename);
+- break;
+ }
+ xenfb_guest_copy(xenfb, x, y, w, h);
+ break;
+@@ -686,14 +727,15 @@ static int xenfb_read_frontend_fb_config
+ xenfb->protocol[0] = '\0';
+ xenfb_xs_printf(xenfb->xsh, xenfb->fb.nodename, "request-update", "1");
+
+- /* TODO check for permitted ranges */
+- fb_page = xenfb->fb.page;
+- xenfb->depth = fb_page->depth;
+- xenfb->width = fb_page->width;
+- xenfb->height = fb_page->height;
+- /* TODO check for consistency with the above */
+- xenfb->fb_len = fb_page->mem_length;
+- xenfb->row_stride = fb_page->line_length;
++ fb_page = xenfb->fb.page;
++ if (xenfb_configure_fb(xenfb,
++ fb_page->width, fb_page->height, fb_page->depth,
++ fb_page->mem_length, fb_page->line_length)
++ < 0) {
++ errno = EINVAL;
++ return -1;
++ }
++
+ fprintf(stderr, "Framebuffer depth %d width %d height %d line %d\n",
+ fb_page->depth, fb_page->width, fb_page->height, fb_page->line_length);
+ if (xenfb_map_fb(xenfb, xenfb->fb.otherend_id) < 0)
Modified: trunk/xen-3/debian/patches/series
==============================================================================
--- trunk/xen-3/debian/patches/series (original)
+++ trunk/xen-3/debian/patches/series Fri Jun 20 17:23:32 2008
@@ -1,3 +1,4 @@
+CVE-2008-1952.patch
config-prefix.diff
tools-rpath.diff
tools-prefix.diff
More information about the Pkg-xen-changes
mailing list