nginx and Apache killer
Igor Sysoev
igor at sysoev.ru
Mon Aug 29 18:45:50 UTC 2011
On Mon, Aug 29, 2011 at 09:30:54PM +0300, Gena Makhomed wrote:
> On 29.08.2011 3:15, Maxim Dounin wrote:
>
> >>>>> We'd also like to notify you that for standalone nginx installations
> >>>>> we've produced the attached patch. This patch prevents handling
> >>>>> malicious range requests at all, instead outputting just the entire file
> >>>>> if the total size of all ranges is greater than the expected response.
>
> >>>> this not protect nginx from "frequent nginx disk seek (D)Dos attack",
> >>>> and additional max_ranges checks/protections for nginx is required!!!
>
> >>> I don't think the "attack" you are talking about is something
> >>> practical. It requires prior knowledge of urls of many really
> >>> large (and "cold", i.e. not cached) files on the attacked site,
> >>> and it as well relies on disk seeks to be costly which is not
> >>> always true (and almost always not true for a single file, as even
> >>> "really large" still usually means "much less than disk size",
> >>> i.e. one can't force full disk seeks).
>
> >> one - can't. but, multiple such requests can make very high seek rate
> >> of disk subsystem, and performance of disk subsystem will be very low
>
> > For multiple requests you need multiple large and cold files.
> > That is what I was talking about.
>
> for example - public mirror servers with multiple large *.iso files
>
> in this and like cases - web server disk subsystem will be bottleneck,
> if one malicious request can force nginx to make 411 seek operations
> and immediately send to such attacker only ~ 411 bytes as server reply.
>
> nginx now easy can handle thousands of requests in one second,
> but server disk subsystem can't efficiently handle so many seeks.
> all other methods of DDoS attack to such servers are more laborious.
>
> and if nginx build without optional rewrite module - no way to protect.
>
> >>> (On the other hand, I *do* think that limiting number of ranges to
> >>> low number like 5 suggested here and there *is* harmfull. Quick
> >>> look over logs on my server for a couple of days reveals perfectly
> >>> valid requests from Adobe Reader with up to 17 ranges. Minimum
> >>> sane value will be something about 50.)
>
> > FWIW: grepped a bit more logs, and it looks like Adobe Reader uses
> > up to 200 ranges in a single request. At least I see multiple
> > requests with 200 ranges used (or less), but not any single
> > request with more than 200.
>
> for relatively small and "hot" pdf files - this is not problem at all.
> such popular pdf file can be completly in operating system file cache.
>
> also, only for such special cases more ranges can be easy allowed:
>
> http {
>
> max_ranges 1;
>
> server {
>
> location ~* \.pdf$ { max_ranges 200; }
> }
> }
>
> Adobe Reader will be happy, and also web server will not be
> vulnerable to "very frequent disk seek by nginx DDos attack".
>
> or - make the built-in nginx max_ranges autotuning feature:
>
> for bigger files - smaller count of range requests is allowed.
>
> for example:
>
> sz == file_size of requested file_name
>
> sz <= 1M: range requests limited only by large_client_header_buffers
>
> 1M < sz <= 64M: allow only 200 range requests, else return 416 error
>
> 64M < sz <= 128M: allow only 64 range requests, else return 416 error
>
> 128M < sz <= 256M: allow only 32 range requests, else return 416 error
>
> 256M < sz <= 512M: allow only 16 range requests, else return 416 error
>
> 512M < sz <= 1G: allow only 8 range requests, else return 416 error
>
> 1G < sz <= 2G: allow only 4 range requests, else return 416 error
>
> 2G < sz <= 4G: allow only 2 range requests, else return 416 error
>
> 4G < sz <= inf: allow only 1 range requests, else return 416 error
>
> also - use these rules only if "max_ranges auto;"
> and make "auto" the default value for "max_ranges" directive.
>
> if "max_ranges off;" - totally disable this type of protection,
> and range requests are limited only by large_client_header_buffers
>
> if "max_ranges N;" - limit current and nested locations to N ranges.
>
> >> probably - this is (special) feature only of some pdf readers software,
> >> and for all other file types "max_ranges 1;" will be safe and harmless?
>
> > I've not seen myself any applications using multiple ranges except
> > Adobe Reader. Though there were at least attempts to implement
> > JPEG2000 streaming using multiple ranges requests, and probably
> > there are other applications as well.
>
> Ok.
>
> Maxim, what you think about built-in nginx protection feature
> such as "max_ranges" directive - it will be useless or useful?
>
> I think: with "max_ranges" directive with default value "auto",
> nginx will be "secure by default" as vsftpd or postfix servers.
max_ranges is obvious soultion. With default value "any".
--
Igor Sysoev
More information about the nginx
mailing list