Автор Тема: Сериозна DoS-уязвимост в HTTP-сървъра Apache (CVE-2011-3192)  (Прочетена 4348 пъти)

dejuren

  • Напреднали
  • *****
  • Публикации: 1025
  • Distribution: Ubuntu, RedHat
  • Window Manager: lxde KDE4
    • Профил
В http-сървъра Apache е нaмерена опасна уязвимост, позволяваща предизвикването на  отказ от обслужване через изчерпване на цялата достъпна памет. Опасността от уязвимостта се задълбочава от това, че за нея е достъпен готов експлоит, позволяващ атакa от една машина с генерация на минимален трафик. При отсътствие на отделни лимити за размера на отделената от Apache памет след изпълнение на експлоита следва пълно изчерпване на паметта с вход в безкрайно свoпиране без възможност за достъп до конзола.

Проблемът е предизвикан от грешка в реализацията на поддръжката на зареждането на части от файла в указан диапазон (например, след прекъсване на съединение може да се извика зареждане от определена позиция). Грешката е свързана с това, че при обработка на заявка, съдържаща голямо число диапазони (например, "Range:bytes=0-,5-1,5-2,5-3,...,5-1000") в съчетание с използване на gzip-компресия на върнатия резултат се изразходва твърде много памет. Например, ако в заглавната част Range се предадат 1000 диапазона, то Apache се опитва отделно да компресира всеки диапазон. Всяка операция компресия изисква много памет (дори за компресиране на един байт се отделя буфер за компресия на блока), в резултат е лесно да се изчерпи цялата налична памет. За успешна атака е достатъчно изпращането на около 50 подобни заявки със съставен Range на сървър.

Проблемът присъства в Apache 2.2.x, включително и последния релиз 2.2.19. Поправка засега е достъпна във вид на пач. Има и няколко способа за временна защита, не изискващи прекомпилация на Apache. Например може принудително да се почиства заглавната част Range с помощта на mod_header ("RequestHeader unset Range" и "RequestHeader unset Request-Range") или да се блокират дълги последователности Range через mod_rewrite:

Код:

   # Вариант 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]



Интересно е, че теоретическата възможност за подобна атака известния полски експерт по компютърна безопасност работещ в Google Михал Залевски (Michal Zalewski),  е съобщил още преди 4 години, но проблемът по някакви причини не е бил приет сериозно и поправки не са били внесени.

Разработчиците на  Apache публикуваха официален отчет за уязвимостта, в който посочват, че в мрежата е регистрирана вълна DoS-атаки, базирани на тази уязвимост. Обновяване за Apache 2.0.x 2.2.x се планира да бъде пуснато в течение  на 48 часа, следователно трябва да бъде достъпно в рамките на следващите няколко часа. Клонът Apache 1.3.x също е уязвим за проблема, но обновление за него няма да се прави, тъй като поддръжката му е прекратена. На администраторите се препоръчва срочно да приложат посочените по-долу обходни методи за защита.

Забележка: Уязвимостта също може да се експлoатира чрез хедър 'Request-Range', затова приведените методи за защита са неефективни (трябва да се добави в конфигурацията "RequestHeader unset Request-Range" за блокиране на работата на устарелия хедър Reqest-Range, исползван само в Netscape Navigator 2-3 и MSIE 3).


  • Исползване на SetEnvIf за Apache 2.0 и 2.2:
Код:
  # Премахваме заглавната част Range, ако в нея има повече от 5 диапазона
  SetEnvIf Range (?:,.*?){5,5} bad-range=1
  RequestHeader unset Range env=bad-range
  RequestHeader unset Request-Range
  # добавяме в лог за опитите за атака
  CustomLog logs/range-CVE-2011-3192.log common env=bad-range

  • Исползване на mod_rewrite за Apache 1.3 и 2.x:
Код:
   RewriteEngine on
   RewriteCond %{HTTP:range} !(bytes=[^,]+(,[^,]+){0,4}$|^$)
   RewriteRule .* - [F]
   RequestHeader unset Request-Range
  • Ограничение на максималния размер на поле чрез директивата "http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestfieldsize>LimitRequestFieldSize 200", където 200 е размера на параметрите в байтове. Внимание, този параметър действа за всички полета, което може да доведе до проблеми, например при исползване на големи cookie.
  • Исползване на mod_headers за пълна забрана на заглавния Range - "RequestHeader unset Range". Този метод може да доведе до неработоспособност на някои приложениякато програми за зареждане на файлове, PDF и плейери на поточно видео;
  • Исползване на специален модул mod_rangecnt (готови сборки за някои редки платформи), контролиращ числото диапазони във директивата Range.

Update: Обновлението 2.2.20 е достъпно
« Последна редакция: Aug 31, 2011, 16:48 от dejuren »
Активен

http://webchat.freenode.net/?channels=ubuntu-bg
The quieter you become, the more you are able to hear.
Две седмици цъкане с мишката спестяват два часа четене на документацията.

edmon

  • Гост
Код:
#Apache httpd Remote Denial of Service (memory exhaustion)
#By Kingcope
#Year 2011
#
# Will result in swapping memory to filesystem on the remote side
# plus killing of processes when running out of swap space.
# Remote System becomes unstable.
#

Тва го пробвах върху няколко АПАЧА и не ги бутна!!
Активен

sickmind

  • Гост
Хммм.... странно!!
имаш ли инсталиран пакета: libparallel-forkmanager-perl
аз го пробвах срещу дебиан стейбъл, апачето започна да използва всички процесори след по малко от 5 секунди, а след десетина започна да пълни swap'a много бързо!


usage: perl killapache.pl <host> [numforks]
example: perl killapache.pl http://www.example.com 50

едит: ако искаш дай си IP адрес'а и кажи в колко часа да го пусна, ти само наблюдавай машината ;)

edit2: пробвах го срещу убунту - отново успех, не зная коя версия е apache'то защото не е моя машината но утре ще питам :Р
« Последна редакция: Aug 28, 2011, 16:20 от sickmind »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Disable mod_deflate, add LimitRequestFieldSize 1024 in apache.conf.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Това с полетата 1024 може да създаде проблем ако приложение използва повече и по-дълги cookies.
Активен

mobilio - професионални мобилни приложения

sickmind

  • Гост
Аз си реших проблема с метода SetEnvIf
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Те дългите cookies винаги са били проблем, защото apache така или иначе има лимит на request size-а. Едно време беше модерно да се гавриш с хората като си правиш killer hyperlink към сайт с някаква XSS уязвимост през GET параметър. Примерно новинарски сайт - пращаш на някой познат уж някаква новина, и когато той го отвори, javascript кода сетва едно cookie с огромен lifetime и дължина няколко хиляди байта - повече въпросният сайт няма отваряне докато не си изчистиш cookie-тата. Като го отвориш излиза някаква apache грешка. Ей такива простотии.
Активен

"Knowledge is power" - France is Bacon

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
От снощи debian реши проблема като качи update-ти за апача, в който проблема е фикснат.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше