В http-сервере Apache найдена опасная уязвимость, позволяющая вызвать отказ в обслуживании через исчерпание всей доступной памяти. Опасность уязвимости усугубляется тем, что для её осуществления уже доступен готовый эксплоит, позволяющий совершить атаку с одной машины с генерацией минимального трафика. При отсутствия отдельных лимитов на размер выделяемой Apache памяти, после выполнения эксплоита наблюдается полное исчерпание памяти с уходом в бесконечный своппинг без возможности зайти в консоль.
Проблема вызвана ошибкой в реализации поддержки загрузки части файла по указанному диапазону (например, после обрыва соединения можно запросить загрузку начиная с определенной позиции). Ошибка связана с тем, что при обработке запроса, содержащего большое число диапазонов (например, "Range:bytes=0-,5-1,5-2,5-3,...,5-1000"), расходуется слишком много памяти. Для осуществления удачной атаки достаточно отправить около 50 подобных запросов на сервер.
Проблема присутствует в Apache 2.2.x, включая последний релиз 2.2.19. Исправление пока доступно в виде патча. Также имеется несколько способов временной защиты, не требующих пересборки Apache. Например, можно принудительно очищать заголовок Range при помощи mod_header ("RequestHeader unset 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]
http://www.opennet.ru/opennews/art.shtml?num=31582
Проверялка
http://seclists.org/fulldisclosure/2011/Aug/att-175/killapache_pl.bin
Комментариев нет:
Отправить комментарий