dslreports logo
Search similar:


uniqs
1723

koitsu
MVM
join:2002-07-16
Mountain View, CA
Humax BGW320-500

koitsu

MVM

Apache 1.x/2.x Range header security issue

I wanted to make folks aware of this:

»apache.slashdot.org/stor ··· ack-Tool
»cve.mitre.org/cgi-bin/cv ··· 011-3192
»www.securityfocus.com/bid/49303
»seclists.org/fulldisclos ··· /Aug/175

Title:    Range header DoS vulnerability Apache HTTPD 1.3/2.x
 
CVE:      CVE-2011-3192:
Date:     20110824 1600Z
Product:  Apache HTTPD Web Server
Versions: Apache 1.3 all versions, Apache 2 all versions
 
Description:
============
 
A denial of service vulnerability has been found in the way the
multiple overlapping ranges are handled by the Apache HTTPD
server:
 
     http://seclists.org/fulldisclosure/2011/Aug/175
 
An attack tool is circulating in the wild. Active use of this tools has
been observed.
 
The attack can be done remotely and with a modest number of
requests can cause very significant memory and CPU usage on the
server.
 
The default Apache HTTPD installation is vulnerable.
 
There is currently no patch/new version of Apache HTTPD which
fixes this vulnerability. This advisory will be updated when a long
term fix is available.
 
A full fix is expected in the next 48 hours.
 
Mitigation:
============
 
However there are several immediate options to mitigate this issue
until a full fix is available:
 
1) Use SetEnvIf or mod_rewrite to detect a large number of ranges
and then either ignore the Range: header or reject the request.
 
   Option 1: (Apache 2.0 and 2.2)
 
          # Drop the Range header when more than 5 ranges.
          # CVE-2011-3192
          SetEnvIf Range (,.*?){5,} bad-range=1
          RequestHeader unset Range env=bad-range
 
          # optional logging.
          CustomLog logs/range-CVE-2011-3192.log common env=bad-range
 
   Option 2: (Also for Apache 1.3)
 
          # Reject request when more than 5 ranges in the Range: header.
          # CVE-2011-3192
          #
 
          RewriteEngine on
          RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$)
          RewriteRule .* - [F]
 
   The number 5 is arbitrary. Several 10's should not be an issue and
may be required for sites which for example serve PDFs to very high
end eReaders or use things such complex http based video
streaming.
 
2) Limit the size of the request field to a few hundred bytes. Note
that while this keeps the offending Range header short - it may
break other headers; such as sizeable cookies or security fields.
 
          LimitRequestFieldSize 200
 
   Note that as the attack evolves in the field you are likely to have
   to further limit this and/or impose other LimitRequestFields limits.
 
   See: http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestfieldsize
 
3) Use mod_headers to completely dis-allow the use of Range
headers:
 
          RequestHeader unset Range
 
   Note that this may break certain clients - such as those used for
   e-Readers and progressive/http-streaming video.
 
4) Deploy a Range header count module as a temporary stopgap
measure:
 
     http://people.apache.org/~dirkx/mod_rangecnt.c
 
   Precompiled binaries for some platforms are available at:
 
        http://people.apache.org/~dirkx/BINARIES.txt
 
5) Apply any of the current patches under discussion - such as:
 
http://mail-archives.apache.org/mod_mbox/httpd-dev/201108.mbox/%3cCAAPSnn2PO-d-C4nQt_TES2RRWiZr7urefhTKPWBC1b+K1Dqc7g@mail.gmail.com
%3e
 
Actions:
========
 
Apache HTTPD users who are concerned about a DoS attack
against their server should consider implementing any of the above
mitigations immediately.
 
When using a third party attack tool to verify vulnerability - know
that most of the versions in the wild currently check for the
presence of mod_deflate; and will (mis)report that your server is
not vulnerable if this module is not present. This vulnerability is not
dependent on presence or absence of that module.
 
Planning:
=========
 
This advisory will be updated when new information, a patch or a
new release is available. A patch or new apache release for Apache
2.0 and 2.2 is expected in the next 48 hours. Note that, while
popular, Apache 1.3 is deprecated.
 
Bink
Villains... knock off all that evil
join:2006-05-14
Colorado

Bink

Member

More of a DoS than a security issue, but availability is still important...

pflog
Bueller? Bueller?
MVM
join:2001-09-01
El Dorado Hills, CA

pflog to koitsu

MVM

to koitsu
ngrep-2.2.19.txt
16,062 bytes
ngrep-2.2.20.txt
11,218 bytes
The update to 2.2.20 seems to have broken video streaming that I was previously doing just fine.

The security update specifically mentions the range request:

SECURITY: CVE-2011-3192 (cve.mitre.org) core: Fix handling of byte-range requests to use less memory, to avoid denial of service. If the sum of all ranges in a request is larger than the original file, ignore the ranges and send the complete file. PR 51714. [Stefan Fritsch, Jim Jagielski, Ruediger Pluem, Eric Covener]

But as far as I can tell, my request is not larger than the original file, yet watching ngrep and comparing 2.2.19 and 2.2.20, apache is clearly ignoring the range request (see attached files to compare the ngrep output). In both tests, I played the file via dolphin browser on my phone and then attempted to seek to ~1/2 way through the file, then tried to seek to near the end of the file. With Apache 2.2.19, it works fine, but with 2.2.20 the seek doesn't happen for a while (time it takes to xfer the contents of the file sequentially to the requested seek point) and in the ngrep there is no indication of a range request processed by apache (nor is there an update to the apache access log which I see with 2.2.19).

I don't know if this is the INTENDED behavior or if their update is broken somehow, but the end result is the same - seeking in a video playing over http no longer works well, since the client side basically has to wait until the data is transferred up to (sequentially) the requested seek point.

In the 2.2.19 ngrep, the seek is denoted by this request:

GET /video/tv/test.avi HTTP/1.1..User-Agent: Lavf52.106.0..Accept: */*..Range: bytes=364419190-..Connection: close..Host: int.pflog.net....

and

HTTP/1.1 206 Partial Content..Date: Mon, 12 Sep 2011 03:33:53 GMT..Server: Apache..Last-Modified: Mon, 12 Sep 2011 03:33:31 GMT..ETag: "309-15e5733e-4acb630e238c0"..Accept-Ranges: bytes..Content-Length: 2939592..Content-Range: bytes 364419190-367358781/367358782..Connection: close..Content-Type: video/x-msvideo....

So unless apache is summing all requests instead of examining individual requests, I don't understand why this should not be working, based on their release notes. I have not yet looked at the code yet, but this definitely seems to be broken.

Can anyone else confirm? I've tested with VLC in windows 7, windows media player in win7, rockplayer on android as well as moboplayer on android. All have the same problematic behavior with apache 2.2.20 serving the movies.
pflog

pflog

MVM

One of the developers in #http-dev on freenode confirmed it's a bug and will be fixed in 2.2.21:

<sfritsch> pfloyd: that's a known bug and will be fixed in 2.2.21

Cool, at least I know I'm not crazy