Критическая уязвимость сервера Apache
26 Aug 2011 | Автор: dd |В наиболее популярном веб-сервере Apache, на этой неделе, обнаружена критическая уязвимость, которой подвержены многочисленные версии сервера, включающие как ветки 1.3.x, так и ветки 2.0.x b 2.2.x. , использование которой приводит к DoS сервера, вызванном переполнением памяти сервера, с уходом в бесконечный своппинг. Самое веселое во всем этом, что в инете уже имеется готовый эксплоит этой уязвимости, носящий название killapache.pl, который запуская в 40-50 потоков простой запрос:
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, если на нем не выставлены лимиты на размер выделяемой памяти под процесс. Скрипт эксплуатирует ошибку в реализации поддержки загрузки частей файла с использованием gzip-компрессии передаваемых данных, которая вынуждает сервер расходовать на каждый фрагмент слишком большое количество памяти.
Сразу надо отметить, что данной уязвимости не подвержены сервера на которых php собран без поддержки gzip. Также по идее можно выставить лимиты на использование памяти, и подключений с одного IP адреса. Тем не менее, даже не смотря на это, по заверениям спецов Apache, по интернету последние несколько дней прокатилась волна DoS атак на сервера под управлением Apache. Для Apache 2.2.x в самое ближайшее время обещают выпустить патч, устраняющий данную уязвимость, а вот пользователям 1.3.х придется довольствоваться закрытием данной уязвимости на своих серверах, посредством некоторого количества уловок, так как ветка 1.3.х уже не поддерживается.
Закрывается данная уязвимость с помощью:
1. блокировки длинных последовательностей Range через mod_rewrite (для обеих веток):
RewriteEngine on
RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$)
RewriteRule .* – [F]
2. с помощью mod_header, выставлением RequestHeader unset Range
3. с помощью SetEnvIf для Apache 2.Х:
# Удаляем заголовок Range, если в нем более 5 диапазонов
SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range
# помещаем в лог попытки атаки
CustomLog logs/range-CVE-2011-3192.log common env=bad-range
4. использования лимита для максимального размера поля LimitRequestFieldSize 200, где 200 – размер параметров в байтах
5. также данная уязвимость может быть локализована за счет использования проксирования сервером ngix, путем запреты проксирования опасных заголовков:
proxy_set_header Range “”;
Теги: apache, IT безопасность