Убийца Apache у вас на пороге!

Тема в разделе "Администрирование серверов", создана пользователем Красавчег, 25 авг 2011.

Модераторы: mefish, stooper
  1. Красавчег

    Красавчег Завсегдатай

    Регистр.:
    15 мар 2010
    Сообщения:
    901
    Симпатии:
    297
    Скопировал с хабра, бо чувствую, что скорей всего закроют пост для гостей:


    А если вдруг не закроют, то вот ссылка: http://habrahabr.ru/blogs/infosecurity/127029/




    Буквально пять дней назад в листе рассылки Full Disclosure появился скрипт, по заявлению автора, убивающий Apache начиная от самых старых версий до самых новых.

    И он действительно работает. Скрипт killapache.pl запускает в несколько десятков потоков простой запроc:

    HEAD / HTTP/1.1
    Host: www.example.com
    Range: bytes=0-,5-0,5-1,5-2,5-3,5-4,<...>,5-1299,5-1300
    Accept-Encoding: gzip
    Connection: close


    В ответ на такой запрос Apache для подсчета Content-Length собирает в памяти длинный ответ из перекрывающихся кусков запрошенного файла, который может занять и занимает заначительный объём памяти. При этом потребление памяти Apache начинает резко расти, как на том графике в начале, что при должном, совсем небольшом, количестве запросов приводит к DoS даже на приличных серверах.

    Разработчики Apache подошли к этой проблеме серьёзно, инициативные лица уже предложили изменения в RFC, закрывающие эту уязвимостью. Тем временем все сервера стоят открыты и не защищены.

    Как же быть?

    Если у вас перед Apache стоит nginx, то можно вообще ничего не делать, даже если файлы, для которых возможны описанные выше запросы, не раздаёт nginx, потому как по-умолчанию, по крайней мере на версии 1.1.0, nginx не передаёт загловок Range на проксируемый сервер.

    Проверить, уязвим ли ваш сервер к этой атаке легко:

    curl -I -H "Range: bytes=0-1,0-2" -s www.example.com/robots.txt | grep Partial

    Если на такие запросы отвечает Apache и вы видите 206 Partial Content, значит быть беде.

    Запретить nginx проксировать опасный заголовок можно директивой:

    proxy_set_header Range "";

    Если нет nginx?

    Если у вас во внешний мир Apache смотрит напрямую… Вы можете полностью заблокировать проблемный заголовок при помощи mod_headers:

    # a2enmod headers
    RequestHeader unset Range


    Если же вам всё-таки нужен этот заголовок, существует решение на основе mod_rewrite и ещё несколько более сложных с mod_headers.

     
  2. oioioi

    oioioi Создатель

    Регистр.:
    9 авг 2011
    Сообщения:
    34
    Симпатии:
    3
    как раз вчера на виртуалке собрал сборку lamp с самых свежих пакетов.
    сегодня прочитал правда на фрихабре данную новость, решил попробовать. Завелось с первого раза. За энджиником, все ок. Так что те админы, которые до сих пор не используют энджиникс, есть реальных повод наконец-то его использовать.
     
  3. barabula

    barabula

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    Так тут не правильный запрос, его нужно грамотно передалть, кто-то может под хайдом показать как? хочу проверить свою железку по нагрузке этой штуки.
     
  4. WebSeoGold

    WebSeoGold Создатель

    Регистр.:
    21 ноя 2010
    Сообщения:
    33
    Симпатии:
    1
    Апач начиная от самых старых версий до самых новых и сейчас кладется с помощью slow http post. А этой дыркой можно положить его даже за nginx, ну круто :)
     
  5. Kadavr

    Kadavr Создатель

    Регистр.:
    30 янв 2010
    Сообщения:
    27
    Симпатии:
    2
    А вот щас попробуем...
     
  6. Красавчег

    Красавчег Завсегдатай

    Регистр.:
    15 мар 2010
    Сообщения:
    901
    Симпатии:
    297
    Блин... я может сюда это зря выложил? :D
     
  7. barabula

    barabula

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    Ты б хайд побольше поставил, а то как никак штука серёздная, а вот левые рты как налетят сейчас.... через сутки 20 % серверов рунета лежат :D
     
  8. -=ZorG=-

    -=ZorG=-

    Регистр.:
    18 авг 2010
    Сообщения:
    262
    Симпатии:
    47
    Хостер должен такое блочить сам на уровне, хотя если пойдет ддос такого типа, то все клиенты обычного хостинга будут сосать лапу.
     
  9. MRSten

    MRSten Создатель

    Регистр.:
    30 июл 2011
    Сообщения:
    30
    Симпатии:
    3
    Можно открывать ддос сервис и снимать сливки.
     
  10. oioioi

    oioioi Создатель

    Регистр.:
    9 авг 2011
    Сообщения:
    34
    Симпатии:
    3
    Длительные последовательности Range можно блокировать через .htaccess:



    # Вариант 1:
    RewriteEngine On
    RewriteCond %{HTTP:Range} bytes=0-[0-9]+, [NC,OR]
    RewriteCond %{HTTP:Range} bytes=([0-9-],){4,} [NC,OR]
    RewriteCond %{HTTP:Range} bytes=[0-9,-]+,0-(,|$) [NC]
    RewriteRule .? http://%{SERVER_NAME}/ [NS,L,F]

    # Вариант 2:
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^(HEAD|GET) [NC]
    RewriteCond %{HTTP:Range} ([0-9]*-[0-9]*)(\s*,\s*[0-9]*-[0-9]*)+
    RewriteRule .* - [F]

    # Вариант 3:
    RewriteEngine On
    RewriteCond %{HTTP:Range} bytes=0-.* [NC]
    RewriteRule .? http://%{SERVER_NAME}/ [R=302,L]