• Mike Gabriel's avatar
    40 patches, fixing several X.Org CVEs in NX. · 45878811
    Mike Gabriel authored
    * Security fixes:
      - Rebase loads of X.Org patches (mainly from RHEL-5) against NX. If not
        all patches from a CVE patch series appear here, then it means that
        the affected file/code is not used in NX at build time.
      - X.Org CVE-2011-2895:
          1001-LZW-decompress-fix-for-CVE-2011-2895-From-xorg-lib-X.patch
      - X.Org CVE-2011-4028:
          1002-Fix-CVE-2011-4028-File-disclosure-vulnerability.-ups.patch
      - X.Org CVE-2013-4396:
          1003-Avoid-use-after-free-in-dix-dixfonts.c-doImageText-C.patch
      - X.Org CVE-2013-6462:
          1004-CVE-2013-6462-unlimited-sscanf-overflows-stack-buffe.patch
      - X.Org CVE-2014-0209:
          1005-CVE-2014-0209-integer-overflow-of-realloc-size-in-Fo.patch
          1006-CVE-2014-0209-integer-overflow-of-realloc-size-in-le.patch
      - X.Org CVE-2014-0210:
          1007-CVE-2014-0210-unvalidated-length-in-_fs_recv_conn_se.patch
          1009-CVE-2014-0210-unvalidated-lengths-when-reading-repli.patch
          1011-CVE-2014-0210-unvalidated-length-fields-in-fs_read_q.patch
          1014-CVE-2014-0210-unvalidated-length-fields-in-fs_read_e.patch
          1015-CVE-2014-0210-unvalidated-length-fields-in-fs_read_g.patch
          1016-CVE-2014-0210-unvalidated-length-fields-in-fs_read_l.patch
          1017-CVE-2014-0210-unvalidated-length-fields-in-fs_read_l.patch
      - X.Org CVE-2014-0211:
          1010-CVE-2014-0211-Integer-overflow-in-fs_get_reply-_fs_s.patch
          1012-CVE-2014-0211-integer-overflow-in-fs_read_extent_inf.patch
          1013-CVE-2014-0211-integer-overflow-in-fs_alloc_glyphs-fr.patch
          1018-unchecked-malloc-may-allow-unauthed-client-to-crash-.patch
      - X.Org CVE-2014-8092:
          1019-dix-integer-overflow-in-ProcPutImage-CVE-2014-8092-1.patch
          1020-dix-integer-overflow-in-GetHosts-CVE-2014-8092-2-4.patch
          1021-dix-integer-overflow-in-RegionSizeof-CVE-2014-8092-3.patch
          1022-dix-integer-overflow-in-REQUEST_FIXED_SIZE-CVE-2014-.patch
      - X.Org CVE-2014-8097:
          1023-dbe-unvalidated-lengths-in-DbeSwapBuffers-calls-CVE-.patch
      - X.Org CVE-2014-8095:
          1024-Xi-unvalidated-lengths-in-Xinput-extension-CVE-2014-.patch
      - X.Org CVE-2014-8096:
          1025-xcmisc-unvalidated-length-in-SProcXCMiscGetXIDList-C.patch
      - X.Org CVE-2014-8099:
          1026-Xv-unvalidated-lengths-in-XVideo-extension-swapped-p.patch
      - X.Org CVE-2014-8100:
          1027-render-check-request-size-before-reading-it-CVE-2014.patch
          1028-render-unvalidated-lengths-in-Render-extn.-swapped-p.patch
      - X.Org CVE-2014-8102:
          1029-xfixes-unvalidated-length-in-SProcXFixesSelectSelect.patch
      - X.Org CVE-2014-8101:
          1030-randr-unvalidated-lengths-in-RandR-extension-swapped.patch
      - X.Org CVE-2014-8093:
          1031-glx-Be-more-paranoid-about-variable-length-requests-.patch
          1032-glx-Be-more-strict-about-rejecting-invalid-image-siz.patch
          1033-glx-Additional-paranoia-in-__glXGetAnswerBuffer-__GL.patch
          1034-glx-Add-safe_-add-mul-pad-v3-CVE-2014-8093-4-6-v4.patch
          1036-glx-Integer-overflow-protection-for-non-generated-re.patch
      - X.Org CVE-2014-8098:
          1035-glx-Length-checking-for-GLXRender-requests-v2-CVE-20.patch
          1037-glx-Top-level-length-checking-for-swapped-VendorPriv.patch
          1038-glx-Length-checking-for-non-generated-single-request.patch
          1039-glx-Length-checking-for-RenderLarge-requests-v2-CVE-.patch
          1040-glx-Pass-remaining-request-length-into-varsize-v2-CV.patch
      - Security fixes with no assigned CVE:
          1008-Don-t-crash-when-we-receive-an-FS_Error-from-the-fon.patch
    45878811
1017-CVE-2014-0210-unvalidated-length-fields-in-fs_read_l.patch 3.6 KB
From b65259bf3bcca15b5069cb7a6c06f95a40f79813 Mon Sep 17 00:00:00 2001
From: Mike DePaulo <mikedep333@gmail.com>
Date: Sun, 8 Feb 2015 22:38:32 -0500
Subject: [PATCH 17/40] CVE-2014-0210: unvalidated length fields in
 fs_read_list_info() from xorg/lib/libXfont commit
 d338f81df1e188eb16e1d6aeea7f4800f89c1218

fs_read_list_info() parses a reply from the font server.  The reply
contains a number of additional data items with embedded length or
count fields, none of which are validated. This can cause out of
bound reads when looping over these items in the reply.
---
 nx-X11/lib/font/fc/fserve.c | 56 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 55 insertions(+), 1 deletion(-)

diff --git a/nx-X11/lib/font/fc/fserve.c b/nx-X11/lib/font/fc/fserve.c
index 60d9017..6ba3ad4 100644
--- a/nx-X11/lib/font/fc/fserve.c
+++ b/nx-X11/lib/font/fc/fserve.c
@@ -2500,6 +2500,7 @@ fs_read_list_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec)
     FSBlockedListInfoPtr	binfo = (FSBlockedListInfoPtr) blockrec->data;
     fsListFontsWithXInfoReply	*rep;
     char			*buf;
+    long			bufleft;
     FSFpePtr			conn = (FSFpePtr) fpe->private;
     fsPropInfo			*pi;
     fsPropOffset		*po;
@@ -2536,7 +2537,8 @@ fs_read_list_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec)
     }
 
     buf = (char *) rep + SIZEOF (fsListFontsWithXInfoReply);
-    
+    bufleft = (rep->length << 2) - SIZEOF (fsListFontsWithXInfoReply);
+ 
     /*
      * The original FS implementation didn't match
      * the spec, version 1 was respecified to match the FS.
@@ -2544,19 +2546,71 @@ fs_read_list_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec)
      */
     if (conn->fsMajorVersion <= 1)
     {
+	if (rep->nameLength > bufleft) {
+#ifdef DEBUG
+	    fprintf(stderr,
+		    "fsListFontsWithXInfo: name length (%d) > bufleft (%ld)\n",
+		    (int) rep->nameLength, bufleft);
+#endif
+	    err = AllocError;
+	    goto done;
+	}
+	/* binfo->name is a 256 char array, rep->nameLength is a CARD8 */
 	memcpy (binfo->name, buf, rep->nameLength);
 	buf += _fs_pad_length (rep->nameLength);
+	bufleft -= _fs_pad_length (rep->nameLength);
     }
     pi = (fsPropInfo *) buf;
+    if (SIZEOF (fsPropInfo) > bufleft) {
+#ifdef DEBUG
+	fprintf(stderr,
+		"fsListFontsWithXInfo: PropInfo length (%d) > bufleft (%ld)\n",
+		(int) SIZEOF (fsPropInfo), bufleft);
+#endif
+	err = AllocError;
+	goto done;
+    }
+    bufleft -= SIZEOF (fsPropInfo);
     buf += SIZEOF (fsPropInfo);
     po = (fsPropOffset *) buf;
+    if (pi->num_offsets > (bufleft / SIZEOF (fsPropOffset))) {
+#ifdef DEBUG
+	fprintf(stderr,
+		"fsListFontsWithXInfo: offset length (%d * %d) > bufleft (%ld)\n",
+		pi->num_offsets, (int) SIZEOF (fsPropOffset), bufleft);
+#endif
+	err = AllocError;
+	goto done;
+    }
+    bufleft -= pi->num_offsets * SIZEOF (fsPropOffset);
     buf += pi->num_offsets * SIZEOF (fsPropOffset);
     pd = (pointer) buf;
+    if (pi->data_len > bufleft) {
+#ifdef DEBUG
+	fprintf(stderr,
+		"fsListFontsWithXInfo: data length (%d) > bufleft (%ld)\n",
+		pi->data_len, bufleft);
+#endif
+	err = AllocError;
+	goto done;
+    }
+    bufleft -= pi->data_len;
     buf += pi->data_len;
     if (conn->fsMajorVersion > 1)
     {
+	if (rep->nameLength > bufleft) {
+#ifdef DEBUG
+	    fprintf(stderr,
+		    "fsListFontsWithXInfo: name length (%d) > bufleft (%ld)\n",
+		    (int) rep->nameLength, bufleft);
+#endif
+	    err = AllocError;
+	    goto done;
+	}
+	/* binfo->name is a 256 char array, rep->nameLength is a CARD8 */
 	memcpy (binfo->name, buf, rep->nameLength);
 	buf += _fs_pad_length (rep->nameLength);
+	bufleft -= _fs_pad_length (rep->nameLength);
     }
 
 #ifdef DEBUG
-- 
2.1.4