Уязвимость в Apache открывает двери к внутренним ресурсам на другой стороне обратного прокси
6 октября 2011 года
В http-сервере Apache обнаружена заслуживающая внимания уязвимость, проявляющаяся при работе в режиме обратного прокси. При наличии определенных rewrite-правил в конфигурации сервера, уявзимость позволяет отправить запрос из внешней сети к внутренним серверам в демилитаризованной зоне (DMZ) за границей межсетевого экрана. Проблеме подвержены все версии Apache 1.3.x и Apache 2.x. Разработчики Apache уже выпустили уведомление о наличии уязвимости и патч для устранения проблемы в Apache 2.2.21.
Проблема проявляется только в Apache, настроенном для работы в режиме обратного прокси (reverse proxy), т.е. который принимает внешние запросы и транслирует их на один или несколько внутренних ресурсов, напрямую недоступных из вне и, как правило, находящихся во внутренней сети предприятия.
Для формирования правил проброса запросов для определенного вида контента часто используется директива RewriteRule или ProxyPassMatch с типичными правилами преобразования запроса. Например:
RewriteRule (.*)\.(jpg|gif|png) http://images.example.com$1.$2 [P] ProxyPassMatch (.*)\.(jpg|gif|png) http://images.example.com$1.$2
При наличии подобных правил атакующий может отправить запрос "GET @other.example.com/something.png HTTP/1.1", что приведет не к обращению к серверу images.example.com, как того требуют правила трансляции, а к соединению с другим внутренним сервером other.example.com. При этом начальная часть "images.example.com@" будет воспринята и передана как часть URL с параметрами аутентификации (http://логин:пароль@хост:порт/путь?параметры). Зная примерно какая внутренняя подсеть используется в сети предприятия, просканировать наличие внутренних http-серверов в локальной сети можно через перебор внутренних IP-адресов, используя примерно такие запросы "GET @10.0.0.1 HTTP/1.0" или с явным указанием номера порта "GET :@10.0.0.1:8080 HTTP/1.0".
В качестве других примеров, можно привести следующие правила преобразования:
RewriteRule ^(.*) http://internalserver$1 [P] RewriteRule ^(.*) http://internalserver:80$1 [P] Rewriterule ^/images(.*) http://InternalImageServer$1 RewriteRule ^(.*) http://internalserver$1
для данных правил атакующий может передать следующие запросы:
GET @server2/console HTTP/1.0 GET 80/console HTTP/1.0 GET /images@server2/console HTTP/1.0 GET :@localhost:8080 HTTP/1.0
и получить в итоге преобразования переход по таким URL:
http://internalserver@server2/console http://internalserver:8080/console http://InternalImageServer@server2/console http://InternalImageServer:@localhost:8080/console
Проблема может быть решена при помощи патча, который запрещает передачу URI, начинающегося с символа "@" ("@other.example.com/something.png"), так как такой запрос не соответствует спецификации HTTP. Другой вариант решения проблемы - использование символа "/" в правилах преобразования запросов, т.е. указание "http://images.example.com/$1.$2" вместо "http://images.example.com$1.$2" или "http://internalserver/$1" вместо "http://internalserver$1", не позволит совершить атаку.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.