[Fwd: [Full-Disclosure] Sendmail 8.12.9 prescan bug (a new one) [CAN-2003-0694]]

Dagmar d'Surreal dagmar.wants at nospam.com
Wed Sep 17 09:33:38 PDT 2003

Fun fun fun.  Hopefully people are actually running sendmail under it's
own uid all the time, which neatly minimizes the impact of these kinds
of bugs.

-----Forwarded Message-----
From: Michal Zalewski <lcamtuf at dione.ids.pl>
To: bugtraq at securityfocus.com, vulnwatch at securityfocus.com, full-disclosure at netsys.com
Subject: [Full-Disclosure] Sendmail 8.12.9 prescan bug (a new one) [CAN-2003-0694]
Date: Wed, 17 Sep 2003 11:19:46 +0200

Hello lists,


  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';
                                        if (delimptr != NULL)
+                                       {
+                                               if (p > addr)
+                                                       p--;
                                                *delimptr = p;
+                                       }
                                        CurEnv->e_to = saveto;
                                        return NULL;
The email address above is phony because the people making archives of list
traffic publicly available on the web aren't taking measures to protect the
email addresses from filthy spammers.  
              AIM: evilDagmar  Jabber: evilDagmar at jabber.org

More information about the lfs-security mailing list