-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Konstantin,

On 5/27/14, 10:12 AM, Konstantin Preißer wrote:
> Hi André,
> 
>> -----Original Message----- From: André Warnier
>> [mailto:a...@ice-sa.com] Sent: Tuesday, May 27, 2014 3:06 PM
>> 
>> Mark Thomas wrote:
>>> CVE-2014-0097 Information Disclosure
>>> 
>> ...
>> 
>>> 
>>> Description: The code used to parse the request content length
>>> header did not check for overflow in the result. This exposed a
>>> request smuggling vulnerability when Tomcat was located behind
>>> a reverse proxy that correctly processed the content length
>>> header.
>>> 
>> 
>> I believe you, but I must admit that I don't really get what the
>> problem is, here. If someone feels like explaining..
> 
> The fix for this issue also made me a bit curious (I don't know the
> background of the issue).
> 
> The old code for parsing the Content-Length header looked like
> this:
> 
> long n = c - '0'; long m;
> 
> while (--len > 0) { if (!isDigit(c = b[off++])) { throw new
> NumberFormatException(); } m = n * 10 + c - '0';
> 
> if (m < n) { // Overflow throw new NumberFormatException(); } else
> { n = m; } }
> 
> Where "b" is a byte-array containing ASCII decimal chars.
> 
> The code parses a decimal number like "123" by multiplying the
> current number (e.g. 12) by 10 (=120), then adding the next
> character (=123).
> 
> To check for an overflow, it checks if the "new" number is lower
> than the old one. Usually, when making a simple addition with
> positive numbers where the second one is low (0-9), this is enough
> as for an overflow, the first bit will go to 1, so the number is
> negative. E.g., when using signed bytes (8 bits): 0111111b (127) +
> 3 = 10000010b (-126)
> 
> However, the code above also does an multiplication by 10. For
> example, if the current number (signed long) is 6148914691236517205
> (binary:
> 101010101010101010101010101010101010101010101010101010101010101b)
> and the next character is '3', the calculation would be:
> 
> 101010101010101010101010101010101010101010101010101010101010101b
> (6148914691236517205) * 1010b (10) = 
> 101010101010101010101010101010101010101010101010101010101010010b
> (6148914691236517202)

Honestly, I was dumbfounded to see this in action. I've never studied
signed multiplication before. I'll have to read a lot more about this.

> 101010101010101010101010101010101010101010101010101010101010010b
> (6148914691236517202) + 11b (3) = 
> 101010101010101010101010101010101010101010101010101010101010101b
> (6148914691236517205)
> 
> In this case, the new number would == the old number, so the code "
> if (m < n)" would not detect the overflow.

Crazy.

- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBCAAGBQJThNvAAAoJEBzwKT+lPKRYr5gP/RBQRQ2ghYSjX7GIwOpRB20R
OGMfB7ACPfsXgp/V2syqLkNSiou0xKZvdffxkD4H90wmlTvWB9PZ7ZH6q87d6hZi
6Uq2CITabYVG9aMHeVcQ7ZUOIelGJkFCwRd9c1TtuYeuNeDZ+eGGSeU/ji9AVP/S
+f0/5+EnqsWgnAcdJ7FRzN1x6cBd80x9YqCY0hVkpgzeEjdTe++DaK10TWWVAPDb
Uk+cGKmdkAivsNiyqQmHvM7chR4UZwbefyH/gHDLdISbNThq2Gg64dPVPqjBydoS
2eEYv4DFbSwdBijQseWEEi014EO6m54kymYzV4wlnYwsdntMrZIPDMrkkrGqpn8Z
S8miQ0ezGV6HI1n/iMtlAX4uCG4BPxg2xdsDlrSl/riBBgwqhiqi3BFBM0qmDdFv
1hUSnoMJAiQfcldWqR/1BTj0t7GC7EmP+j1Pb2gA/8GhCj2AMx4eWgf2gz6voDB/
lTG8XmvEZJZHevT+LoKv+tTPqT20U0i5ltkI2VSUdO6u1TBZUh9ofkdheRLPVWeN
D00UAFBdPQfTa2JfC8QXNFY+vEyyFmQYcZRqnEZEZU2C3pPCzoGt/+MrndsZAwjS
nb9LjiJPflYO585pS8zE/Oymvtn7ZYALx1bAAf9fexwtYOUl3Rcy1n1lwIV4QWAW
Bhsbtz5rJNLoR6LOYnwy
=HxCV
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to