[reSIProcate] Hardening the parser (what goes into 1.0?)
Byron Campen
bcampen at estacado.net
Mon Aug 7 12:47:03 CDT 2006
On Aug 7, 2006, at 12:29 PM, Cullen Jennings wrote:
>
> Reduced people on thread as list server seemed to complain ...
>
> Yah - makes sense what you are saying few bits inline...
>
>
> On Aug 7, 2006, at 10:14 AM, Byron Campen wrote:
>
>> Comments inlined:
>>
>>>
>>>> 2. In general, overflow checking is not performed on header-
>>>> field-values/parameters that take integral values. The parse
>>>> code is yielding garbage when these are not within the range of
>>>> an int (in most cases, this is not enough to handle what the
>>>> RFCs say are valid).
>>> It irritates me off that the spec refuses to say what the upper
>>> bound of say content length is. My personal opinion is that the
>>> performance of 64 bit ints on the machines we use is about the
>>> same and we should just use either 32 or 64 bit ints for this and
>>> call it done.
>>>
>> Given that the maximum size of a SipMessage is 64K, I think it is
>> safe to assume that a UInt32 will be enough.
>>
>
> There are some people sending 100k MESSAGE messages over TCP with
> resip but this is sort of evil .... anyways, I agree 640 K should
> be enough for anyone :-) Seriously 32 bits in totally fine here and
> everywhere else I can think of too.
>
>>>
>>>> 3. Content-Length is not processed according to RFC 3261 Sec
>>>> 18.3 (ie, it is ignored in the UDP case)
>>> As a practical matter, proxies end up doing better when they send
>>> the body they got not the truncated version but I don't care.
>>>
>>>> 4. Multiple values are allowed (and re-emitted) in single-value
>>>> headers.
>>>>
>>>> On point 1:
>>>> We haven't taken any action yet. David queried whether it had
>>>> been decided that tracking uniqueness of parameters was too
>>>> expensive. I made the point that this could be leveraged in a
>>>> DoS attack by putting very large numbers of empty parameters
>>>> (ie. semi-colons) in a header-field-value, causing the data
>>>> structures used to hold these parameters to grow very large.
>>> The DOS attack could equally well be done by having a bunch of
>>> parameters a1, a2, a3 etc so if we are going to deal with the DOS
>>> issues, I would prefer some approach that just limited the memory
>>> a single message could use in total and not do this
>>
>> Not equally; it would be about 1/3 as effective (or if they're
>> doing a,b,c etc, 1/2 as effective). I feel conflicted about
>> setting upper limits on the number of parameters we will allow; on
>> the one hand, it kills this issue dead, but on the other, it
>> limits functionality. Checking for repeated params entails using a
>> more complicated data structure that will really get us into
>> trouble if someone DoS's us in this manner. I figure we should at
>> least ignore empty parameters though, since it is very light work.
>
> Yes, when doing Dos protection have to be careful that the code you
> put in to protect from DoS does not actually make the problem worse.
>
>>
>>>
>>>>
>>>> On point 2:
>>>> I have some code in a working-copy that has (mostly) replaced
>>>> IntegerCategory and IntegerParameter with the more descriptive
>>>> (and overflow safe) UInt32Category, UInt8Category,
>>>> UInt32Parameter, and UInt8Parameter. All the necessary changes
>>>> to Headers.?xx, HeaderTypes.hxx, SipMessage.?xx, ParameterTypes.?
>>>> xx, ParameterTypeEnums.hxx, and ParserCategory.?xx have been
>>>> made. Do people want to see this in a branch before we work it
>>>> into the main trunk? Also, is this something we want to push
>>>> into the release?
>>> Is there any advantage to UInt8 over always using UInt32? Again,
>>> I don't really care.
>>>
>>
>>
>>
>> Maybe we could have a "pedantic" mode that the stack could run in,
>> that performs thorough checking for garbage. This could be
>> incredibly useful for interop testing/protocol debugging.
>
> The old vovida stack used has a pedantic mode and it was somewhat
> useful. In the end we defaulted it off but could flip it on. Mostly
> people turned it on only when trying to debug a network. One thing
> this mode could do is make the stack parse every one of the headers.
>
>
>
This would be trivially easy to do now that we have a
SipMessage::parseAllHeaders(). The thing is, in many cases, the parse
code fails in such a way that is it impossible for the app to tell
that something went wrong (ie; integral overflow results in a value
like 4. Everything looks okay, but it is not.)
Best regards,
Byron Campen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20060807/6e3bfbca/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2369 bytes
Desc: not available
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20060807/6e3bfbca/attachment.bin>
More information about the resiprocate-devel
mailing list