Легко эксплуатируемая DoS-уязвимость в HTTP-сервере Apache

В http-сервере Apache найдена опасная уязвимость, позволяющая вызвать отказ в обслуживании через исчерпание всей доступной памяти. Опасность уязвимости усугубляется тем, что для её осуществления уже доступен готовый эксплоит, позволяющий совершить атаку с одной машины с генерацией минимального трафика. При отсутствии отдельных лимитов на размер выделяемой Apache памяти, после выполнения эксплоита наблюдается полное исчерпание памяти с уходом в бесконечный своппинг без возможности зайти в консоль. Проблема вызвана ошибкой в реализации поддержки загрузки части файла по указанному диапазону (например, после обрыва соединения можно запросить загрузку начиная с определенной позиции). Ошибка связана с тем, что при обработке запроса, содержащего большое число диапазонов (например, “Range:bytes=0-,5-1,5-2,5-3,...,5-1000”) в сочетании с использованием gzip-сжатия отдаваемого контента, расходуется слишком много памяти. Например, если в заголовке Range передана тысяча диапазонов, то 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: 1 2 3 4 5 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: 1 2 3 4 RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(HEAD|GET) [NC] RewriteCond %{HTTP:Range} ([0-9]*-[0-9]*)(\s*,\s*[0-9]*-[0-9]*)+ RewriteRule .* - [F] Вариант 3: 1 2 3 RewriteEngine On RewriteCond %{HTTP:Range} bytes=0-.* [NC] RewriteRule .? http://%{SERVER_NAME}/ [R=302,L] Интересно, что о теоретической возможности совершения подобной атаки Михаил Залевски (Michal Zalewski), известный польский эксперт в области компьютерной безопасности в настоящее время работающий в Google, сообщал еще 4 года назад, но проблема по каким-то причинам не была воспринята всерьез и исправления не были внесены. ...

13 квітня 2016 · 3 хвилин · 582 слів · dimetrius

Лимиты Apache на VPS сервере

Статья в виде заметки… В файле /etc/httpd/conf/httpd.conf ищем секцию и немного увеличиваем значения (MaxRequestsPerChild лучше наоборот уменьшить). Например, таким образом (по умолчанию настройки слишком зажаты, мы же здесь увеличим лимиты, съедая попутно больше оперативной памяти): 1 2 3 4 5 6 7 8 StartServers 5 MinSpareServers 5 MaxSpareServers 15 ServerLimit 30 MaxClients 30 MaxRequestsPerChild 200 MaxKeepAliveRequests 50 KeepAliveTimeout 5 И, как, обычно, после этого необходимо выполнить 1 # service httpd restart Источник и личный опыт

13 квітня 2016 · 1 хвилина · 75 слів · dimetrius

Ограничение доступа средствами Nginx

Небольшая заметка о том, как средствами Nginx закрыть доступ к файлам/папке по паролю. В nginx это решение не менее элегантно, чем в apache, а может и еще лучше, кому как нравится. В конфигурационном файле, в папке (локейшене), которую хотим закрыть надо только указать файл, где хранятся пароли. Вот два примера для закрытия папки с файлами: 1 2 3 4 5 6 7 8 location ^~ /files/ { root /path/to/server; autoindex on; autoindex_exact_size off; auth_basic "Hello, please login"; auth_basic_user_file /usr/nginx/passwords; access_log /usr/nginx/logs/files.log download; } и админовской части c дополнительным ограничением по IP: 1 2 3 4 5 6 7 8 9 10 location ^~ /admin/ { fastcgi_pass unix:/home/project/server.sock; include conf/fastcgi.conf; allow 11.11.0.0/16; allow 22.22.22.22; deny all; auth_basic "Hello, Admin, please login"; auth_basic_user_file /usr/nginx/adminpassword; access_log /usr/nginx/logs/admin.log main; } Добавить пользователя можно с помощью стандартной утилиты от apache: 1 htpasswd -b passwords NewUser NewPassword В файле запись с зашифрованным паролем имеет вид: 1 NewUser:P47ghZ4kloG78: Your Can Comment Here Защиту от перебора паролей можно организовать одновременно двумя методами, основанными на использовании iptables: Блокирование IP на время, если количество запросов в секунду превышает какое-либо разумное количество Вести лог неудачных попыток подбора пароля и скриптом раз в минуту проверять лог и заносить IP адреса в iptables Для первого варианта достаточно создать правила: ...

13 квітня 2016 · 2 хвилин · 359 слів · dimetrius

Получение списка всех виртуальных хостов, определенных во всех файлах конфигурации Apache

Вы когда-нибудь искали, где определён виртуальный хост сайта в файлах конфигурации apache? Существует удобная опция, в виде скрипта apache2ctl, который может помочь в этом вопросе. Если Вы наберёте команду: 1 apache2ctl -S в командной строке, Вы получите список всех виртуальных хостов и серверов по умолчанию, включая номер строки, где они определены. Например: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # apache2ctl -S VirtualHost configuration: wildcard NameVirtualHosts and _default_ servers: *:8080 is a NameVirtualHost default server ispconfig.local (/etc/apache2/sites-enabled/000-ispconfig.vhost:10) port 8080 namevhost ispconfig.local (/etc/apache2/sites-enabled/000-ispconfig.vhost:10) *:8081 is a NameVirtualHost default server ispconfig.local (/etc/apache2/sites-enabled/000-apps.vhost:10) port 8081 namevhost ispconfig.local (/etc/apache2/sites-enabled/000-apps.vhost:10) *:80 is a NameVirtualHost default server ispconfig.local (/etc/apache2/sites-enabled/000-default:1) port 80 namevhost ispconfig.local (/etc/apache2/sites-enabled/000-default:1) port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com.vhost:7) Syntax OK Источник КОМТЕТ

13 квітня 2016 · 1 хвилина · 124 слів · dimetrius

Установка nginx на сервер Fedora 14 под управлением ISPConfig 3

Вступление Начиналось всё с сервера, который находился дома и его производительность меня не устраивала, наверное потому что изначально эта ОС вообще была десктопом. Для увеличения этой самой производительности я установил nginx как фронтэнд для apache. Сайтов было всего 3-4, прописать конфиги проблем не составляло, поэтому никакой панели управления небыло. На данный момент куплен VPS, на который установлена панель управления ISPConfig 3. Причём с самого начала было точно определено что в любом случае перед apache будет установлен nginx. Не буду описывать все плюсы, которые мы получаем при его использовании… Итак, сейчас у вас должна быть установлена ISPConfig 3 на Fedora 14, всё настроено и отлажено. Конфигурация Apache В конфигах apache нам нужно изменить 80 порт на тот, на котором должен apache должен слушать входящие соединения от nginx. Обычно я переношу его на порт 8080, но у большинства на этом порту будет висеть панель управления ISPConfig 3, поэтому будет использовать порт 82. 1 sed -ie 's/*:80/*:82/g' /etc/httpd/conf/sites-available/*.vhost Здесь заметьте что в конфигах изначально может быть прописан порт 8080 для панели управления. Если мы сделаем так, как выше написал я, то получим уже не 8080, а 8280. Это обязательно нужно сразу же исправить. Комманда sed сделает бэкап оригинальных файлов *.vhost с расширением *.vhoste, эти файлы можем переместить. 1 2 mkdir /root/httpd_vhost_backup/ mv /etc/httpd/conf/sites-available/*.vhoste /root/httpd_vhost_backup/ Перезапустите apache и используя netstat посмотрите слушает ли он порт 82 вместо 80: ...

13 квітня 2016 · 5 хвилин · 1037 слів · dimetrius