Saw it yesterday and sure enough, it crashes my Exim with a segfault.  I 
run Exim on Debian 2.2 with no modifications.
-A. Dave

xbud wrote:

>Not sure if this made to this list.
>
>I haven't confirmed the following, but thought it was worth forwarding.
>
>-xbud
>
>----------  Forwarded Message  ----------
>
>Subject: Exim 3.34 and lower (fwd)
>Date: Wed, 13 Feb 2002 11:19:49 -0700 (MST)
>From: Dave Ahmad <[EMAIL PROTECTED]>
>To: [EMAIL PROTECTED]
>
>Moderator note:
>
>I have not had the time to look at the Exim source to verify that these
>exist and that the attached fix is not broken.
>
>Dave Ahmad
>SecurityFocus
>www.securityfocus.com
>
>---------- Forwarded message ----------
>Return-Path: <[EMAIL PROTECTED]>
>Delivered-To: moderator for [EMAIL PROTECTED]
>Received: (qmail 32260 invoked from network); 13 Feb 2002 08:49:23 -0000
>Received: from mail.securityfocus.com (HELO securityfocus.com) (66.38.151.9)
>  by lists.securityfocus.com with SMTP; 13 Feb 2002 08:49:23 -0000
>Received: (qmail 20929 invoked by alias); 13 Feb 2002 08:50:32 -0000
>Received: (qmail 20925 invoked from network); 13 Feb 2002 08:50:31 -0000
>Received: from unknown (HELO 2xs.co.il) (212.68.128.50)
>  by mail.securityfocus.com with SMTP; 13 Feb 2002 08:50:31 -0000
>Received: from security.2xss.com
>       ([212.68.128.10] helo=2xss.com ident=root)
>       by 2xs.co.il with esmtp
>       id 16avBe-0003GM-00
>       for [EMAIL PROTECTED]; Wed, 13 Feb 2002 10:54:46 +0200
>Sender: [EMAIL PROTECTED]
>Message-ID: <[EMAIL PROTECTED]>
>Date: Wed, 13 Feb 2002 10:44:02 +0200
>From: Ehud Tenenbaum <[EMAIL PROTECTED]>
>Organization: 2xs LTD.
>X-Mailer: Mozilla 4.76 [en] (X11; U; Linux 2.4.16-pre1 i686)
>X-Accept-Language: en
>MIME-Version: 1.0
>To: [EMAIL PROTECTED]
>Subject: Exim 3.34 and lower
>Content-Type: multipart/mixed;
> boundary="------------C2FFD0A39E3737A0A718E02C"
>
>Hey,
>
>Its a good time to announce that 2xs security LTD. decided to
>create a research team in order to focus on finding new bugs,
>further more we managed to develop a security tool to discover
>bugs/security flaws. In the near future, the tool itself will became
>an open source project.
>
>Its looks like there is few insecure/lame programming in exim mail
>server up to current version.
>
>first lets take a look at the file:
>[2xs:root:~] ls -la /usr/exim/bin/exim
>-rws--x--x    1 root     root      2061186 Oct 23 12:56
>/usr/exim/bin/exim*
>[2xs:root:~]
>
>Suid goodie.
>
>[2xs:w00p:/root] id
>uid=1001(w00p) gid=100(users) groups=100(users)
>[2xs:w00p:/root] /usr/exim/bin/exim -F `perl -e' print "A" x 32770'` -C
>`perl -e' print "A" x 32768'`
>Segmentation fault
>[2xs:w00p:/root]
>
>Many other argument should work as well (as long there is -C among them)
>
>[2xs:root:~] gdb /usr/exim/bin/exim
>GNU gdb 5.0
>Copyright 2000 Free Software Foundation, Inc.
>GDB is free software, covered by the GNU General Public License, and you
>are
>welcome to change it and/or distribute copies of it under certain
>conditions.
>Type "show copying" to see the conditions.
>There is absolutely no warranty for GDB.  Type "show warranty" for
>details.
>This GDB was configured as "i386-slackware-linux"...
>(gdb) r -F `perl -e' print "A" x 32770'` -C `perl -e' print "A" x
>32768'`
>Starting program: /usr/exim/bin/exim -F `perl -e' print "A" x 32770'` -C
>`perl -e' print "A" x
>32768'`
>
>Program received signal SIGSEGV, Segmentation fault.
>strcpy (dest=0x820e208 'A' <repeats 200 times>..., src=0xbfff7b48 'A'
><repeats 200 times>...)
>    at ../sysdeps/generic/strcpy.c:40
>40      ../sysdeps/generic/strcpy.c: No such file or directory.
>(gdb) info registers
>eax            0x48216641       1210148417
>ecx            0x482166bf       1210148543
>edx            0xbfffa941       -1073764031
>ebx            0xbffef8d4       -1073809196
>esp            0xbffeeefc       0xbffeeefc
>ebp            0xbffeef00       0xbffeef00
>esi            0x820e208        136372744
>edi            0x3      3
>eip            0x401690e4       0x401690e4
>eflags         0x10286  66182
>cs             0x23     35
>ss             0x2b     43
>ds             0x2b     43
>es             0x2b     43
>fs             0x0      0
>gs             0x0      0
>fctrl          0x37f    895
>fstat          0x0      0
>ftag           0xffff   65535
>fiseg          0x23     35
>fioff          0x4009ca84       1074383492
>foseg          0x2b     43
>fooff          0x400fa440       1074766912
>fop            0x49b    1179
>
>after short debugging we found that there is no overflow since the
>eip register coredumped in the code segment and not in the data segment,
>yet we believe that there might be a way to exploit this bug with
>log_write(), we are not going to deliver a working exploit until the
>vendor
>will research and fix this bug.
>
>We provide a patch to version 3.34 that should solve this bug.
>
>In version 3.21 and lower there is another small bug with -t flag
>again non exploitable just bad programming.
>
>This bug was found by The Analyzer, Izik and Mixter. 2xs security
>research team.
>
>should anyone have questions or comments you can email us:
>
>[EMAIL PROTECTED]
>[EMAIL PROTECTED]
>[EMAIL PROTECTED]
>
>--
>------------
>Ehud Tenenbaum
>C.T.O & Project Manager
>2xs LTD.
>Tel: 972-9-9519980
>Fax: 972-9-9519982
>E-Mail: [EMAIL PROTECTED]
>------------
>                                 Have A Safe Day
>
>-------------------------------------------------------
>
>
>
>------------------------------------------------------------------------
>
>diff -Nru exim-3.34/src.old/accept.c exim-3.34/src/accept.c
>--- exim-3.34/src.old/accept.c Tue Feb 12 13:40:44 2002
>+++ exim-3.34/src/accept.c     Tue Feb 12 13:47:33 2002
>@@ -1506,7 +1506,7 @@
> 
> /* Save for comparing with next one */
> 
>-strcpy(last_message_id, message_id);
>+strncpy(last_message_id, message_id, MESSAGE_ID_LENGTH); /* Fixed a one-byte 
>overflow -- Mixter */
> 
> /* Add the current message id onto the current process info string if
> it will fit. */
>diff -Nru exim-3.34/src.old/deliver.c exim-3.34/src/deliver.c
>--- exim-3.34/src.old/deliver.c        Tue Feb 12 13:40:44 2002
>+++ exim-3.34/src/deliver.c    Tue Feb 12 14:15:53 2002
>@@ -3704,7 +3704,7 @@
> the message size. */
> 
> deliver_force = forced;
>-strcpy(message_id, id);
>+strncpy(message_id, id, MESSAGE_ID_LENGTH);
> return_count = 0;
> message_size = 0;
> 
>@@ -4083,7 +4083,8 @@
>         slen += 3;
>         }
> 
>-      strcpy(h->text + slen, s);
>+      /* Fixed potential remote vulnerability -- Mixter */
>+      strncpy(h->text + slen, s, size-slen-1);
>       slen += len;
>       }
> 
>diff -Nru exim-3.34/src.old/host.c exim-3.34/src/host.c
>--- exim-3.34/src.old/host.c   Tue Feb 12 13:40:44 2002
>+++ exim-3.34/src/host.c       Tue Feb 12 19:19:52 2002
>@@ -281,7 +281,7 @@
>   }
> 
> sender_fullhost =
>-  store_malloc((int)strlen(fullhost) + (int)strlen(rcvhost) + 2);
>+  store_malloc((int)strlen(fullhost) + (int)strlen(rcvhost) + 3);
> sender_rcvhost = sender_fullhost + (int)strlen(fullhost) + 1;
> strcpy(sender_fullhost, fullhost);
> strcpy(sender_rcvhost, rcvhost);
>@@ -471,7 +471,7 @@
> 
>   next = store_malloc(sizeof(ip_address_item));
>   next->next = NULL;
>-  strcpy(next->address, s);
>+  strncpy(next->address, s, 46);
> 
>   if (yield == NULL) yield = last = next; else
>     {
>@@ -571,7 +571,7 @@
> /* If there is no buffer, put the string into some new store. */
> 
> if (buffer == NULL) return string_copy(yield);
>-strcpy(buffer, yield);
>+strncpy(buffer, yield, 46);
> return buffer;
> }
> 
>diff -Nru exim-3.34/src.old/log.c exim-3.34/src/log.c
>--- exim-3.34/src.old/log.c    Tue Feb 12 13:40:44 2002
>+++ exim-3.34/src/log.c        Tue Feb 12 14:37:56 2002
>@@ -61,6 +61,14 @@
> if (!syslog_timestamp) s += 20;
> len = (int)strlen(s);
> 
>+/* Added safeguard against syslog overflows -- Mixter */
>+if(len > 4096)
>+{
>+      len = 4026;
>+      memset(s+4000,0,strlen(s)-4000);
>+      strcat(s, " WARNING: Message cut off!");
>+}
>+
> #ifndef NO_OPENLOG
> if (!syslog_open)
>   {
>@@ -185,7 +193,7 @@
> has been cycled, then open the file. The static slot for saving it is the same
> size as buffer, and the text has been checked above to fit. */
> 
>-if (strcmp(name, "main") == 0) strcpy(mainlog_name, buffer);
>+if (strcmp(name, "main") == 0) strncpy(mainlog_name, buffer, LOG_NAME_SIZE);
> 
> /* After a successful open, arrange for automatic closure on exec(). */
> 
>@@ -585,7 +593,7 @@
>       {
>       spaceleft = seplen + 1;
>       ptr = log_buffer + LOG_BUFFER_SIZE - spaceleft;
>-      strcpy(ptr - (int)strlen(tmsg), tmsg);
>+      strncpy(ptr - (int)strlen(tmsg), tmsg, spaceleft);
>       }
>     (void)string_format(ptr, spaceleft, separator);
>     while(*ptr) ptr++;
>diff -Nru exim-3.34/src.old/match.c exim-3.34/src/match.c
>--- exim-3.34/src.old/match.c  Tue Feb 12 13:40:45 2002
>+++ exim-3.34/src/match.c      Tue Feb 12 14:39:45 2002
>@@ -876,7 +876,7 @@
> "+caseful" in the list, it restores a caseful copy from the original address.
> */
> 
>-strcpy(address, origaddress);
>+strncpy(address, origaddress, big_buffer_size);
> for (p = address + ((caseless || llen < 0)? 0 : llen); *p != 0; p++)
>   *p = tolower(*p);
> 
>diff -Nru exim-3.34/src.old/readconf.c exim-3.34/src/readconf.c
>--- exim-3.34/src.old/readconf.c       Tue Feb 12 13:40:45 2002
>+++ exim-3.34/src/readconf.c   Tue Feb 12 14:25:01 2002
>@@ -356,7 +356,7 @@
>     char *newbuffer;
>     big_buffer_size += BIG_BUFFER_SIZE;
>     newbuffer = store_malloc(big_buffer_size);
>-    strcpy(newbuffer, big_buffer);
>+    strncpy(newbuffer, big_buffer, big_buffer_size-1);
>     store_free(big_buffer);
>     big_buffer = newbuffer;
>     if (fgets(big_buffer+newlen, big_buffer_size-newlen, config_file) == NULL)
>@@ -440,7 +440,7 @@
>       {
>       int newsize = big_buffer_size + BIG_BUFFER_SIZE;
>       char *newbuffer = store_malloc(newsize);
>-      strcpy(newbuffer, big_buffer);
>+      strncpy(newbuffer, big_buffer, big_buffer_size-1);
>       s = newbuffer  + (s - big_buffer);
>       ss = newbuffer + (ss - big_buffer);
>       t = newbuffer  + (t - big_buffer);
>@@ -461,7 +461,7 @@
>       memmove(p + replen, pp, ss - pp + 1);
>       ss += moveby;
>       }
>-    strncpy(p, m->replacement, replen);
>+    strncpy(p, m->replacement, replen-2);
>     t = p + replen;
>     }
>   }
>@@ -2240,7 +2240,8 @@
> 
> /* Finally, try the unadorned name */
> 
>-strcpy(big_buffer, config_filename);
>+/* Fixed overflow. 256 chars are maximally needed here. -- Mixter */
>+strncpy(big_buffer, config_filename, big_buffer_size>256?256:big_buffer_size);
> if (config_file == NULL) config_file = fopen(big_buffer, "r");
> 
> /* Failure to open the configuration file is a serious disaster. */
>@@ -2326,7 +2327,7 @@
>     m->next = NULL;
>     m->command_line = FALSE;
>     if (mlast == NULL) macros = m; else mlast->next = m;
>-    strcpy(m->name, name);
>+    strncpy(m->name, name, namelen-1); /* fixed potential overflow -- Mixter */
>     m->replacement = string_copy(s);
>     }
> 
>diff -Nru exim-3.34/src.old/tree.c exim-3.34/src/tree.c
>--- exim-3.34/src.old/tree.c   Tue Feb 12 13:40:46 2002
>+++ exim-3.34/src/tree.c       Tue Feb 12 14:30:45 2002
>@@ -32,7 +32,7 @@
> {
> char *p = s + (int)strlen(s);
> while (p > s && p[-1] != '@') p--;
>-if (p <= s) strcpy(prepared_address, s); else
>+if (p <= s) strncpy(prepared_address, s, 512); else /* fixed potential remote 
>overflow -- Mixter */
>   {
>   char *t = prepared_address;
>   char *pp = p - 2;
>



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to