10704856 2003-09-17 11:19 +0200 /83 rader/ Michal Zalewski <lcamtuf@dione.ids.pl>
Importerad: 2003-09-17 18:47 av Brevbäraren
Extern mottagare: bugtraq@securityfocus.com
Extern mottagare: vulnwatch@securityfocus.com
Extern mottagare: full-disclosure@netsys.com
Mottagare: Bugtraq (import) <29042>
Ärende: Sendmail 8.12.9 prescan bug (a new one) [CAN-2003-0694]
------------------------------------------------------------
From: Michal Zalewski <lcamtuf@dione.ids.pl>
To: bugtraq@securityfocus.com, <vulnwatch@securityfocus.com>,
 <full-disclosure@netsys.com>
Message-ID: <Pine.LNX.4.44.0309162201480.11655-100000@dione.ids.pl>

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 --
(10704856) /Michal Zalewski <lcamtuf@dione.ids.pl>/(Ombruten)