Новая уязвимость в Apache.

30.08.2011

Здравствуйте.

Недавно была обнаружена уязвимость в Apache всех версий, использование которой, при определенных условиях, могло привести к отказу в обслуживании. Проблема заключается в следующем: при выполнении некоторого perl-скрипта веб-серверу в несколько потоков отправляются простые запросы вида:

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 достаточно быстро растет, что даже при небольшом количестве запросов может привести к серьезным проблемам.

apache

Как проверить, уязвим ли Ваш сервер?

Достаточно отправить серверу два простых запроса к любому статическому файлу, к примеру, robots.txt:

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

где example.com — это Ваш домен.
Если в ответ Вы получите «HTTP/1.1 206 Partial Content«, значит Ваш сервер уязвим.

Как устранить уязвимость?

Если на Вашем сервере установлен Nginx, достаточно в конфигурационный файл nginx добавить следующие параметры:

proxy_set_header Range "";
proxy_set_header Request-Range "";

Для примерения настроек перезагрузите Nginx.
Если на Вашем сервере работает только Apache, проверьте установлен ли модуль Apache mod_headers. По умолчанию, в большинстве случаев, он уже установлен, но лишняя проверка не помешает. Выполните в командной строке сервера команду

apachectl -M

В результате выполнения данной команды будет отображен список всех подключенных модулей Apache. Если модуля нет в этом списке, его нужно подключить в сооветствии со спецификацией операционной системы. После того, необходимо добавить в конфигурационный файл Apache следующие строки:

RequestHeader unset Request-Range
RequestHeader unset Range

Для применения настроек перезагрузите Apache.
После всех настроек еще раз попробуйте обратиться к любому статическому файлу на сервере:
curl -I -H "Range: bytes=0-1,0-2" -s www.example.com/robots.txt | grep Partial
curl -I -H "Request-Range: bytes=0-1,0-2,0-3,0-4,0-5,0-6" -s www.example.com/robots.txt | grep Partial

В результате выполнения данных команд веб-сервер должен вернуть пустой ответ. Если это так, то проблема устранена.
Если у Вас возникнут какие-либо трудности, Вы можете обратиться за помощью к специалистам службы технической поддрежки.

Опубликовано в Новости | Нет комментариев »

Нет комментариев »

Нет комментариев

Оставить комментарий