Re: [PATCH] tweak QP's header handling for messages with no body

[email protected] (Matt Sergeant)
Newsgroups perl.qpsmtpd
Message-ID <alpine.DEB.2.01.1108171839500.17519@bodger>
Yup. I should check if Haraka does the right thing with this too :)

On Tue, 16 Aug 2011, Jared Johnson wrote:

> True, I was led astray by the comment that seemed to indicate it was all
> about headers.  if the intention of the comment is correct, then it should
> probably if ( $in_header and ... ), whether or not the new regex is added.
> That block would also need to be moved to after the block that sets
> $in_header = 0 if we've reached the end, to avoid catching the blank line
> that separates headers and newlines.
>
> At any rate, Chris has a point -- I was actually thinking the other day
> that code like that original deferral would be better of sitting in a
> plugin, so I could muck around with it in a more straightforward manner in
> order to, say, log what we did to our own database, or change it to a
> rejection, or whatever :)
>
> Anyway, this is all kind of minutia compared to the original patch, which
> I feel I should remind everyone has to do with accepting legitimate mail
> from Lotus software without inadvertently stripping the headers :)
>
> -Jared
>
>> That line of code doesn't look at the headers though, just at the final
>> dot at the end-of-data.
>>
>>> ------------------------------------------------------------------------
>>>
>>> 	Jared Johnson <mailto:[email protected]>
>>> August 16, 2011 3:00 PM
>>>
>>>
>>> There's already a special case for something similar to this:
>>>
>>> # Reject messages that have either bare LF or CR. rjkaes noticed a
>>> # lot of spam that is malformed in the header.
>>>
>>> ($_ eq ".\n" or $_ eq ".\r")
>>> and $self->respond(421, "See
>>> http://smtpd.develooper.com/barelf.html")
>>> and return $self->disconnect;
>>>
>>> you could just make it ( /\r\r\n$/ or $_ eq ".\n" or $_ eq ".\r" )
>>> maybe?
>>> and update the link to point to a URL that explains both?
>>>
>>> -Jared
>>>
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> 	Matt Sergeant <mailto:[email protected]>
>>> August 16, 2011 11:28 AM
>>>
>>>
>>> Yup there's a lot of this going around right now. Just to be explicit
>>> though, the header lines end in \r\r\n. Worth rejecting the bloody
>>> lot, frankly :)
>>>
>>> ------------------------------------------------------------------------
>>>
>>> 	Chris Lewis <mailto:[email protected]>
>>> August 15, 2011 4:21 PM
>>>
>>>
>>>
>>>
>>> As a FYI, I've been seeing bot-emitted spam that appears to have extra
>>> \r at the end of _all_ header lines, and the qpsmtpd parser seems to
>>> be treating all of it as part of the _body_.  IOW: except for the
>>> received line inserted by qpsmtpd, qpsmtpd doesn't see _any_ headers.
>>>
>>> This implementation is backrev (0.80 I think), and as it's only spam
>>> from one particular bot, we don't care about that particular wierdness
>>> enough to investigate further.  But it's worth being aware of.
>>>
>>> ------------------------------------------------------------------------
>>>
>>> 	Jared Johnson <mailto:[email protected]>
>>> August 15, 2011 3:39 PM
>>>
>>>
>>> Hi,
>>>
>>> We got a bug report from someone using IBM's Lotus suite (I think for
>>> both
>>> their MUA and MTA). Their users would often send messages where all the
>>> content was in the subject and they didn't bother sending any message
>>> content. I'm not sure if it's due to an apparently uncommon behavior for
>>> their particular MUA or their MTA, but every one of these messages was
>>> coming through with data in a form that looked like this:
>>>
>>> "Subject: howdy\r\n.\r\n"
>>>
>>> Rather than including the blank line that one might expect to follow
>>> headers, since it's required in the event that a message body is
>>> present:
>>>
>>> "Subject: howdy\r\n\r\n.\r\n"
>>>
>>> The customer reported these messages were having their subjects
>>> stripped;
>>> additional testing indicted all existing headers were being stripped. It
>>> looks like this is because the loop that processes message data in
>>> Qpsmtpd::SMTP::data_respond() and creates a Mail::Header object which is
>>> later used to write out the header in delivery, only works if a blank
>>> line
>>> exists after the header, e.g. the second form above. The following is
>>> all
>>> I could find in RFC 5322 that elaborated on this blank line, which
>>> obviously must exist if a message body is included:
>>>
>>> "A message consists of header fields (collectively called "the header
>>> section of the message") followed, optionally, by a body. The header
>>> section is a sequence of lines of characters with special syntax as
>>> defined in this specification. The body is simply a sequence of
>>> characters that follows the header section and is separated from the
>>> header section by an empty line (i.e., a line with nothing preceding the
>>> CRLF)."
>>>
>>> I read this as implicitly allowing the exclusion of this blank line if
>>> there is no message body: the specification for the blank line is only
>>> mentioned in the description of the body, which is itself described as
>>> optional. Considering we haven't run into this bug in years of usage, I
>>> assume it's unconventional to exclude the blank line, but it looks like
>>> it
>>> is legitimate syntax.
>>>
>>> At any rate this was effecting multiple legitimate end users so we put
>>> together the attached patch, which pulls the header building into its
>>> own
>>> sub which is then called inside the loop if we reach the blank line
>>> indicating the header section is complete; otherwise, it's called
>>> outside
>>> of the loop if we have no more message data, indicating the header
>>> section
>>> is complete. Sorry I'm not putting this on a github fork, I still don't
>>> have my git stuff together, I may never get around to it but I thought
>>> you
>>> guys might find this useful.
>>>
>>> -Jared
>>
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.