Computer Security
[EN] securityvulns.ru
no-pyccku



Related information

  Buffer overflows on address parsing in sendmail

  sendmail 8.12.9 available

  ISS Security Brief: Email Processing Vulnerability in Sendmail

  CERT Advisory CA-2003-12 Buffer Overflow in Sendmail

  Sendmail: -1 gone wild

From:Michal Zalewski <lcamtuf_(at)_DIONE.IDS.PL>
Date:17.09.2003
Subject:[Full-Disclosure] Sendmail 8.12.9 prescan bug (a new one) [CAN-2003-0694]

Hello lists,

--------
Overview
--------

 There seems to be a remotely exploitable vulnerability in Sendmail up to
 and including the latest version, 8.12.9. The problem lies in prescan()
 function, but is not related to previous issues with this code.

 The primary attack vector is an indirect invocation via parseaddr(),
 although other routes are possible. Heap or stack structures, depending
 on the calling location, can be overwritten due to the ability to go
 past end of the input buffer in strtok()-alike routines.

 This is an early release, thanks to my sheer stupidity.

--------------
Attack details
--------------

 Local exploitation on little endian Linux is confirmed to be trivial
 via recipient.c and sendtolist(), with a pointer overwrite leading to a
 neat case of free() on user-supplied data, i.e.:

 eip = 0x40178ae2
 edx = 0x41414141
 esi = 0x61616161

 SEGV in chunk_free (ar_ptr=0x4022a160, p=0x81337e0) at malloc.c:3242

 0x40178ae2 <chunk_free+486>:    mov    %esi,0xc(%edx)
 0x40178ae5 <chunk_free+489>:    mov    %edx,0x8(%esi)

 Remote attack is believed to be possible.

----------------
Workaround / fix
----------------

 Vendor was notified, and released an early patch attached below.
 There are no known workarounds.

Index: parseaddr.c
===================================================================
RCS file: /cvs/src/gnu/usr.sbin/sendmail/sendmail/parseaddr.c,v
retrieving revision 1.16
diff -u -r1.16 parseaddr.c
--- parseaddr.c 29 Mar 2003 19:44:01 -0000      1.16
+++ parseaddr.c 16 Sep 2003 17:37:26 -0000
@@ -700,7 +700,11 @@
                                               addr[MAXNAME] = '\0';
       returnnull:
                                       if (delimptr != NULL)
+                                       {
+                                               if (p > addr)
+                                                       p--;
                                               *delimptr = p;
+                                       }
                                       CurEnv->e_to = saveto;
                                       return NULL;
                               }

--
------------------------- bash$ :(){ :|:&};: --
Michal Zalewski * [http://lcamtuf.coredump.cx]
   Did you know that clones never use mirrors?
--------------------------- 2003-09-16 21:18 --









_______________________________________________
Full-Disclosure - We believe in it.
Charter: http://lists.netsys.com/full-disclosure-charter.html

About | Terms of use | Privacy Policy
© SecurityVulns, 3APA3A, Vladimir Dubrovin
Nizhny Novgorod

 
 



Rating@Mail.ru
test server