[Esd-l] Detection rule for sendmail header exploit

Joe Steele joe at madewell.com
Sat Mar 8 17:49:40 PST 2003


On Friday, March 07, 2003 9:49 AM, John D. Hardin wrote:
>
> On Fri, 7 Mar 2003, daniel lance herrick wrote:
>
> > On Thu, 6 Mar 2003, John D. Hardin wrote:
> >
> > > * ^(From|To|CC|Reply-To|Resent-From): .*<>.*<>.*<>.*<>.*<>.*\(.*\)
> >

[snip]

>
> There are two possible weaknesses in the above RE:
>
> 1) that the <> pairs can be non-empty and the exploit still works, and

>From what I see in the sendmail code, the allowable buffer overrun 
increases (up to a limit) with each unnested pair of <> (nested pairs 
do not contribute), and it does not matter whether the pairs are 
empty or *non-empty*.  

The published exploit relies on being able to store "aptr" at offset 
OFF3+l (i.e., at offset 306), which requires overrunning the buffer 
by 60 bytes (by my count, which is only approximate: 60 = 306 - 250 + 
sizeof aptr).  So it needs at least 60 pairs of <>.  The exploit uses 
138 pairs, so the extra pairs end up being filler which pads the 
buffer.  This padding could be replaced with arbitrary text 
interspersed inside and outside of the pairs of <>.

Based on the comments above, the pattern ".*<>.*<>.*<>.*<>.*<>" is 
easily bypassed.  And although the pattern 
".*<.*>.*<.*>.*<.*>.*<.*>.*<.*>" should trap any exploit, it is too 
simplistic because lists of addresses will also be caught.  To be 
effective without casting too large a net, each address in a list 
needs to be scanned separately.  Attempting to do this with a regular 
expression could get complicated.

The brute force method of trimming headers down to 250 bytes would 
probably be effective at blocking any exploit, but I doubt that it is 
a reasonable solution, particularly for recipient headers.  (In 
reality, the 250 byte limit need only be applied to each individual 
address in a list.)

Another point to note is that the RE should begin with the following 
in order to trap all headers for which sendmail is vulnerable:

* ^((resent-)?(sender|from|(reply-)?to|cc|bcc)\
    |(errors|disposition-notification|apparently)-to):

>
> 2) that the comment can be unterminated - no trailing ) - and the
> exploit still works.

I wouldn't rely on the presence of parentheses, because I don't think 
they're that critical to the success of the exploit.  All they do is 
surround 28 NOP's.  Sendmail doesn't care whether the NOP's are 
inside a comment.  I suspect the intent was to protect aptr inside 
the parentheses (because doing so would make sense), but the code 
stuffs aptr right after the ")" instead, and yet it still works.

--Joe  


More information about the esd-l mailing list