Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package unrtf

It fixes two security holes reported in #772811, CVE-2014-9274 and
CVE-2014-9275. Additionally, it fixes an access to already freed memory (these
two patches, 0004 and 0005 have to go together).

debdiff attached.

unblock unrtf/0.21.5-2

-- System Information:
Debian Release: 8.0
  APT prefers testing
  APT policy: (990, 'testing'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 3.16.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=de_AT.UTF-8, LC_CTYPE=de_AT.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
diff -Nru unrtf-0.21.5/debian/changelog unrtf-0.21.5/debian/changelog
--- unrtf-0.21.5/debian/changelog	2013-11-30 12:30:28.000000000 +0100
+++ unrtf-0.21.5/debian/changelog	2014-12-22 20:20:50.000000000 +0100
@@ -1,3 +1,14 @@
+unrtf (0.21.5-2) unstable; urgency=medium
+
+  * Security fixes, closes: #772811
+    - Fix CVE-2014-9274: check that accesses to color table stay within bounds
+    - Fix CVE-2014-9275: various crashes
+  * possible security fixes:
+    - Fix Invalid read of size 4 in attr_get_param
+    - attr_get_param(): Silence a warning message again
+
+ -- Willi Mann <wi...@debian.org>  Mon, 22 Dec 2014 20:20:33 +0100
+
 unrtf (0.21.5-1) unstable; urgency=low
 
   * Imported Upstream version 0.21.5
diff -Nru unrtf-0.21.5/debian/patches/0001-check-that-accesses-to-color-table-stay-within-bound.patch unrtf-0.21.5/debian/patches/0001-check-that-accesses-to-color-table-stay-within-bound.patch
--- unrtf-0.21.5/debian/patches/0001-check-that-accesses-to-color-table-stay-within-bound.patch	1970-01-01 01:00:00.000000000 +0100
+++ unrtf-0.21.5/debian/patches/0001-check-that-accesses-to-color-table-stay-within-bound.patch	2014-12-21 22:04:20.000000000 +0100
@@ -0,0 +1,55 @@
+From: Jean-Francois Dockes <j...@recoll.org>
+Date: Sun, 21 Dec 2014 10:08:26 +0100
+Subject: check that accesses to color table stay within bounds,
+ esp that the color number is positive. This fixes {\cb-999} crashing
+ unrtf
+
+This fixes CVE-2014-9274, according to http://www.openwall.com/lists/oss-security/2014/12/04/15
+
+Origin: https://bitbucket.org/medoc/unrtf-int/commits/b0cef89a170a66bc48f8dd288ce562ea8ca91f7a/raw/
+Bug-Debian: http://bugs.debian.org/772811
+---
+ src/convert.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/src/convert.c b/src/convert.c
+index e563473..96bf438 100644
+--- a/src/convert.c
++++ b/src/convert.c
+@@ -868,6 +868,9 @@ process_color_table (Word *w)
+ 	r=g=b=0;
+ 
+ 	while(w) {
++                if (total_colors >= MAX_COLORS) {
++                        break;
++                }
+ 		char *s = word_string (w);
+ 
+ 		if (!strncmp("\\red",s,4)) {
+@@ -921,7 +924,7 @@ static int
+ cmd_cf (Word *w, int align, char has_param, int num) {
+ 	char str[40];
+ 
+-	if (!has_param || num>=total_colors) {
++	if (!has_param || num < 0 || num>=total_colors) {
+ 		warning_handler ("font color change attempted is invalid");
+ 	}
+ 	else
+@@ -948,7 +951,7 @@ static int
+ cmd_cb (Word *w, int align, char has_param, int num) {
+ 	char str[40];
+ 
+-	if (!has_param || num>=total_colors) {
++	if (!has_param || num < 0 || num>=total_colors) {
+ 		warning_handler ("font color change attempted is invalid");
+ 	}
+ 	else
+@@ -1153,7 +1156,7 @@ cmd_highlight (Word *w, int align, char has_param, int num)
+ {
+ 	char str[40];
+ 
+-	if (!has_param || num>=total_colors) {
++	if (!has_param || num < 0 || num>=total_colors) {
+ 		warning_handler ("font background color change attempted is invalid");
+ 	}
+ 	else
diff -Nru unrtf-0.21.5/debian/patches/0002-Need-to-process-word-chars-as-unsigned.-Else-char-wi.patch unrtf-0.21.5/debian/patches/0002-Need-to-process-word-chars-as-unsigned.-Else-char-wi.patch
--- unrtf-0.21.5/debian/patches/0002-Need-to-process-word-chars-as-unsigned.-Else-char-wi.patch	1970-01-01 01:00:00.000000000 +0100
+++ unrtf-0.21.5/debian/patches/0002-Need-to-process-word-chars-as-unsigned.-Else-char-wi.patch	2014-12-21 22:04:20.000000000 +0100
@@ -0,0 +1,29 @@
+From: Jean-Francois Dockes <j...@recoll.org>
+Date: Sun, 21 Dec 2014 10:47:03 +0100
+Subject: Need to process word chars as unsigned. Else char with hi bit set
+ can crash program
+
+Partially fixes CVE-2014-9275, according to
+https://lists.gnu.org/archive/html/bug-unrtf/2014-12/msg00001.html
+
+Origin: https://bitbucket.org/medoc/unrtf-int/commits/1df886f2e65f7c512a6217588ae8d94d4bcbc63d/raw/
+Bug-Debian: http://bugs.debian.org/772811
+---
+ src/hash.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/hash.c b/src/hash.c
+index b886d1e..67c6a25 100644
+--- a/src/hash.c
++++ b/src/hash.c
+@@ -133,8 +133,8 @@ hashitem_new (char *str)
+ 
+ 	hi->str = my_strdup(str);
+ 
+-	i = *str;
+-	if (i=='\\') i=str[1];
++	i = (unsigned char)*str;
++	if (i=='\\') i=(unsigned char)str[1];
+ 	i <<= 24;
+ 	hi->value = i | (hash_value++ & 0xffffff);
+ 	hi->next = NULL;
diff -Nru unrtf-0.21.5/debian/patches/0003-Fix-a-number-of-possible-crashes-caused-by-a-bad-for.patch unrtf-0.21.5/debian/patches/0003-Fix-a-number-of-possible-crashes-caused-by-a-bad-for.patch
--- unrtf-0.21.5/debian/patches/0003-Fix-a-number-of-possible-crashes-caused-by-a-bad-for.patch	1970-01-01 01:00:00.000000000 +0100
+++ unrtf-0.21.5/debian/patches/0003-Fix-a-number-of-possible-crashes-caused-by-a-bad-for.patch	2014-12-21 22:04:20.000000000 +0100
@@ -0,0 +1,128 @@
+From: Jean-Francois Dockes <j...@recoll.org>
+Date: Sun, 21 Dec 2014 10:51:47 +0100
+Subject: Fix a number of possible crashes caused by a bad format causing
+ word_string() to return NULL
+
+Second fix for CVE-2014-9275, according to
+https://lists.gnu.org/archive/html/bug-unrtf/2014-12/msg00001.html
+
+Origin: https://bitbucket.org/medoc/unrtf-int/commits/3c7ff3f888de0f0d957fe67b6bd4bec9c0d475f3/raw/
+Bug-Debian: http://bugs.debian.org/772811
+---
+ src/convert.c | 28 +++++++++++++++++-----------
+ 1 file changed, 17 insertions(+), 11 deletions(-)
+
+diff --git a/src/convert.c b/src/convert.c
+index 96bf438..bd84398 100644
+--- a/src/convert.c
++++ b/src/convert.c
+@@ -278,6 +278,8 @@ word_dump_date (Word *w)
+ 	CHECK_PARAM_NOT_NULL(w);
+ 	while (w) {
+ 	 	char *s = word_string (w);
++                if (!s)
++                        return;
+ 		if (*s == '\\') {
+ 			++s;
+ 			if (!strncmp (s, "yr", 2) && isdigit(s[2])) {
+@@ -524,6 +526,8 @@ process_font_table (Word *w)
+ 
+         if ((w2 = w->child)) {
+             tmp = word_string(w2);
++            if (!tmp)
++                    break;
+             if (!strncmp("\\f", tmp, 2)) {
+                 num = atoi(&tmp[2]);
+                 name[0] = 0;
+@@ -704,7 +708,8 @@ process_info_group (Word *w)
+ 			char *s;
+ 
+ 			s = word_string(child);
+-
++                        if (!s)
++                                return;
+ 			if (!inline_mode) {
+ 				if (!strcmp("\\title", s)) {
+ 					
+@@ -712,11 +717,11 @@ process_info_group (Word *w)
+ 					w2=child->next;
+ 					while (w2) {
+ 						char *s2 = word_string(w2);
+-						if (s2[0] != '\\') 
++						if (s2 && s2[0] != '\\') 
+ 						{
+ 							print_with_special_exprs (s2);
+ 						}
+-						else
++						else if (s2)
+ 						{
+ 							if (s2[1] == '\'')
+ 							{
+@@ -735,7 +740,7 @@ process_info_group (Word *w)
+ 					w2=child->next;
+ 					while (w2) {
+ 						char *s2 = word_string(w2);
+-						if (s2[0] != '\\') 
++						if (s2 && s2[0] != '\\') 
+ 							printf("%s,", s2);
+ 						w2 = w2->next;
+ 					}
+@@ -746,7 +751,7 @@ process_info_group (Word *w)
+ 					w2=child->next;
+ 					while (w2) {
+ 						char *s2 = word_string(w2);
+-						if (s2[0] != '\\') 
++						if (s2 && s2[0] != '\\') 
+ 							printf("%s", s2);
+ 						w2 = w2->next;
+ 					}
+@@ -758,7 +763,7 @@ process_info_group (Word *w)
+ 					w2=child->next;
+ 					while (w2) {
+ 						char *s2 = word_string(w2);
+-						if (s2[0] != '\\') 
++						if (s2 && s2[0] != '\\') 
+ 							printf("%s", s2);
+ 						w2 = w2->next;
+ 					}
+@@ -868,11 +873,10 @@ process_color_table (Word *w)
+ 	r=g=b=0;
+ 
+ 	while(w) {
+-                if (total_colors >= MAX_COLORS) {
++		char *s = word_string (w);
++                if (s == 0 || total_colors >= MAX_COLORS) {
+                         break;
+                 }
+-		char *s = word_string (w);
+-
+ 		if (!strncmp("\\red",s,4)) {
+ 			r = atoi(&s[4]);
+ 			while(r>255) r>>=8;
+@@ -1010,6 +1014,8 @@ cmd_field (Word *w, int align, char has_param, int num) {
+ 			char *s;
+ 
+ 			s = word_string(child);
++                        if (!s)
++                                return FALSE;
+ #if 1 /* daved experimenting with fldrslt */
+ 			if(!strcmp("\\fldrslt", s))
+ 				return FALSE;
+@@ -1033,7 +1039,7 @@ cmd_field (Word *w, int align, char has_param, int num) {
+ 				    if (s && !strcmp(s, "SYMBOL") )
+ 				    {
+ 					w4=w3->next;
+-					while(w4 && !strcmp(word_string(w4), " "))
++					while(w4 && word_string(w4) && !strcmp(word_string(w4), " "))
+ 						w4 = w4->next;
+ 					s4 = word_string(w4);
+ 					if (s4)
+@@ -1061,7 +1067,7 @@ cmd_field (Word *w, int align, char has_param, int num) {
+ 						    Word *w4;
+ 						    char *s4;
+ 						    w4=w3->next;
+-						    while (w4 && !strcmp(" ", word_string(w4)))
++						    while (w4 && word_string(w4) && !strcmp(" ", word_string(w4)))
+ 							    w4=w4->next;
+ 						    if (w4) {
+ 							    s4=word_string(w4);
diff -Nru unrtf-0.21.5/debian/patches/0004-attrstack_drop-Properly-drop-the-last-stack-element.patch unrtf-0.21.5/debian/patches/0004-attrstack_drop-Properly-drop-the-last-stack-element.patch
--- unrtf-0.21.5/debian/patches/0004-attrstack_drop-Properly-drop-the-last-stack-element.patch	1970-01-01 01:00:00.000000000 +0100
+++ unrtf-0.21.5/debian/patches/0004-attrstack_drop-Properly-drop-the-last-stack-element.patch	2014-12-21 22:04:20.000000000 +0100
@@ -0,0 +1,37 @@
+From: Fabian Keil <f...@fabiankeil.de>
+Date: Thu, 4 Dec 2014 18:15:29 +0100
+Subject: attrstack_drop(): Properly drop the last stack element
+
+Previously stack_of_stacks_top would point to free'd memory,
+resulting in:
+
+==38960== Invalid read of size 4
+==38960==    at 0x402853: attr_get_param (attr.c:355)
+==38960==    by 0x40818A: word_print_core (convert.c:3412)
+==38960==    by 0x406DBC: word_print (convert.c:3451)
+==38960==    by 0x40CA27: main (main.c:267)
+==38960==  Address 0x1e065e0 is 90,000 bytes inside a block of size 90,016 free'd
+==38960==    at 0x1068498: free (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
+==38960==    by 0x40CBD3: my_free (malloc.c:91)
+==38960==    by 0x402E8C: attrstack_drop (attr.c:582)
+==38960==    by 0x40812F: word_print_core (convert.c:3403)
+==38960==    by 0x406DBC: word_print (convert.c:3451)
+==38960==    by 0x40CA27: main (main.c:267)
+==38960==
+---
+ src/attr.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/attr.c b/src/attr.c
+index bc19b6c..2c2552b 100644
+--- a/src/attr.c
++++ b/src/attr.c
+@@ -571,7 +571,7 @@ attrstack_drop ()
+ 	while(prev_stack && prev_stack->next && prev_stack->next != stack)
+ 		prev_stack = prev_stack->next;
+ 
+-	if (prev_stack) {
++	if (prev_stack && (prev_stack != stack_of_stacks_top)) {
+ 		stack_of_stacks_top = prev_stack;
+ 		prev_stack->next = NULL;
+ 	} else {
diff -Nru unrtf-0.21.5/debian/patches/0005-attr_get_param-Silence-a-warning-message-again.patch unrtf-0.21.5/debian/patches/0005-attr_get_param-Silence-a-warning-message-again.patch
--- unrtf-0.21.5/debian/patches/0005-attr_get_param-Silence-a-warning-message-again.patch	1970-01-01 01:00:00.000000000 +0100
+++ unrtf-0.21.5/debian/patches/0005-attr_get_param-Silence-a-warning-message-again.patch	2014-12-21 22:04:20.000000000 +0100
@@ -0,0 +1,32 @@
+From: Fabian Keil <f...@fabiankeil.de>
+Date: Thu, 4 Dec 2014 18:20:12 +0100
+Subject: attr_get_param(): Silence a warning message again
+
+attr_get_param(ATTR_ENCODING) is always called once without a stack
+being available, but previously the use-after-free prevented the
+warning.
+---
+ src/attr.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/src/attr.c b/src/attr.c
+index 2c2552b..0337fd0 100644
+--- a/src/attr.c
++++ b/src/attr.c
+@@ -348,8 +348,14 @@ attr_get_param(int attr)
+ 	int i;
+ 	AttrStack *stack = stack_of_stacks_top;
+ 	if (!stack) {
+-		warning_handler("No stack to get attribute from");
+-		return;
++		if (attr != ATTR_ENCODING) {
++			/*
++			 * attr_get_param(ATTR_ENCODING) is always called
++			 * called once without a stack being available.
++			 */
++			warning_handler("No stack to get attribute from");
++		}
++		return NULL;
+ 	}
+ 
+ 	i=stack->tos;
diff -Nru unrtf-0.21.5/debian/patches/series unrtf-0.21.5/debian/patches/series
--- unrtf-0.21.5/debian/patches/series	1970-01-01 01:00:00.000000000 +0100
+++ unrtf-0.21.5/debian/patches/series	2014-12-21 22:04:20.000000000 +0100
@@ -0,0 +1,5 @@
+0001-check-that-accesses-to-color-table-stay-within-bound.patch
+0002-Need-to-process-word-chars-as-unsigned.-Else-char-wi.patch
+0003-Fix-a-number-of-possible-crashes-caused-by-a-bad-for.patch
+0004-attrstack_drop-Properly-drop-the-last-stack-element.patch
+0005-attr_get_param-Silence-a-warning-message-again.patch

Reply via email to