В 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 е достъпно