HTTP Response Splitting — это очень опасная атака на веб-приложения, которая использует уязвимость в обработке HTTP-заголовков сервером. Но чтобы понять, насколько она серьёзна, давайте углубимся в технические детали и разберёмся, как именно работает эта атака, какие риски она несёт и как защититься от неё.
Оглавление
Что такое HTTP Response Splitting?
Итак, представьте, что веб-приложение принимает данные от пользователя (например, в запросе GET или POST) и формирует на основе этих данных HTTP-ответ. Однако если сервер обрабатывает данные без надлежащей проверки или фильтрации, это открывает врата для злоумышленника, который может внедрить специальные символы — CR (Carriage Return) и LF (Line Feed) — чтобы разделить HTTP-ответ на два или даже больше фальшивых ответа. Это приводит к разделению ответа (Response Splitting), в результате чего злоумышленник может:
Внедрить свои собственные HTTP-заголовки: например, устанавливая фальшивые cookie или перенаправляя пользователя на другой URL.
Создавать полностью поддельные HTTP-ответы: формируя ответ, содержащий любой желаемый контент, который может быть выполнен браузером.
Организовывать более сложные атаки: такие как XSS (межсайтовый скриптинг), отравление кэша (Cache Poisoning) или захват страниц (Page Hijacking).
Пример атаки выглядит следующим образом: злоумышленник отправляет запрос к серверу, который включает последовательность «%0d%0a» (или «/r/n») — эти символы CR и LF и являются ключевыми для формирования новой строки в HTTP-заголовках. Таким образом, злоумышленник может вставить свои заголовки или даже начать новый HTTP-ответ.
Основные виды атак, основанных на HTTP Response Splitting
Отравление кэша (Cache Poisoning). В этой атаке злоумышленник нацеливается на кеш-сервер или прокси, чтобы внедрить в него фальшивый контент. Если прокси-сервер сохранит этот фальшивый HTTP-ответ, все последующие пользователи, которые обратятся к кешу за этим ресурсом, получат вредоносный контент.
Межсайтовый скриптинг (XSS). Внедрение CR и LF позволяет злоумышленнику манипулировать содержимым ответа так, чтобы выполнить вредоносный скрипт в браузере жертвы. Это может привести к краже данных пользователя, его сессий и других атак.
Захват страниц (Page Hijacking). Это более широкий сценарий, при котором злоумышленник контролирует содержание страницы, которую видит жертва. Здесь можно внедрить фишинговый контент, рекламу или перенаправления на вредоносные сайты.
Недавние уязвимости и атаки на HTTP Response Splitting
В последние месяцы стали известны серьёзные уязвимости, связанные с HTTP Response Splitting, в программном обеспечении Apache HTTP Server, одном из самых популярных веб-серверов.
CVE-2024-24795: Новая уязвимость в Apache HTTP Server
В апреле 2024 года была обнаружена уязвимость с идентификатором CVE-2024-24795. Она была найдена в нескольких модулях Apache HTTP Server и позволяла злоумышленникам внедрять вредоносные заголовки HTTP в серверные приложения, что могло привести к атакам на десинхронизацию HTTP-запросов (HTTP Desynchronization). Это, в свою очередь, открывало путь к различным атакам: от кражи информации до внедрения вредоносного ПО и дефейса веб-сайтов.
Как это работает?
Злоумышленник мог бы отправить специальный HTTP-запрос, в результате которого сервер добавлял бы фальшивый заголовок «Set-Cookie» в HTTP-ответ. Это позволяло манипулировать сервером и формировать фальшивые ответы.
Как защититься?
Apache выпустил патч для исправления этой уязвимости. Чтобы защититься, пользователям рекомендуется обновиться до версии 2.4.59 или выше и пересмотреть свои конфигурации серверов на предмет уязвимостей, связанных с манипуляциями заголовков HTTP-ответов.
CVE-2023-25690 и CVE-2023-27522: уязвимости модулей Apache
В начале 2023 года были обнаружены ещё две уязвимости в Apache HTTP Server:
CVE-2023-25690. Эта уязвимость была связана с модулем mod_proxy и позволяла злоумышленникам обходить правила доступа прокси-сервера и выполнять нежелательные запросы. Уязвимы были версии Apache HTTP Server от 2.4.0 до 2.4.55.
CVE-2023-27522. Уязвимость, связанная с модулем mod_proxy_uwsgi, позволяла злоумышленникам внедрять любые HTTP-заголовки и принуждать сервер отправлять разделённый ответ. Это могло привести к различным атакам, включая отравление кэша и межсайтовый скриптинг.
Для устранения этих уязвимостей Apache выпустил патч в версии 2.4.56. Всем пользователям рекомендуется как можно скорее обновить серверное ПО и провести проверку безопасности конфигураций модулей.
Меры по предотвращению атак HTTP Response Splitting
Чтобы снизить риск уязвимостей, связанных с HTTP Response Splitting, следует принять ряд защитных мер:
1. Валидация и очистка входных данных
Один из самых важных способов защиты — это тщательная проверка и фильтрация входных данных, которые поступают на сервер. Необходимо убрать из них все возможные символы CR (Carriage Return, «%0d») и LF (Line Feed, «%0a»). Например, можно использовать функции для очистки строк, которые удаляют или кодируют такие символы, чтобы они не могли быть использованы злоумышленником для разделения HTTP-ответов.
2. Кодирование символов в HTTP-заголовках
При отправке данных пользователя в HTTP-заголовках следует преобразовывать или кодировать специальные символы, чтобы их интерпретация была безопасной. Например, если заголовок содержит символы CR или LF, их следует экранировать или заменить на безопасные альтернативы, предотвращая их использование для создания разделённого ответа.
3. Использование актуальных версий программного обеспечения
Важно регулярно обновлять серверное ПО, включая веб-серверы, фреймворки и библиотеки. Множество уязвимостей в популярных веб-серверах, таких как Apache HTTP Server, были исправлены в более поздних версиях (например, версии 2.4.56 и 2.4.59 устраняют ряд уязвимостей HTTP Response Splitting). Регулярное обновление ПО обеспечит исправление уязвимостей, которые могли быть обнаружены в предыдущих версиях.
4. Защита от внедрения непредусмотренных символов в заголовках
При генерации HTTP-ответов и обработке заголовков старайтесь использовать встроенные безопасные методы или библиотеки для формирования и отправки ответов. Избегайте ручного формирования HTTP-заголовков, поскольку это увеличивает риск ошибок, которые могут привести к атакам типа HTTP Response Splitting.
5. Настройка конфигураций серверных модулей и прокси-серверов
Если используете прокси-серверы или такие модули, как «mod_proxy» или «mod_proxy_uwsgi» в Apache HTTP Server, нужно тщательно проверить конфигурацию. Убедитесь, что RewriteRule или ProxyPassMatch не допускают манипуляции с данными запроса, которая может привести к уязвимостям в заголовках ответа. Для предотвращения атак HTTP-десинхронизации стоит отключить или ограничить использование небезопасных правил и паттернов, которые обрабатывают входные данные.
6. Анализ логов и мониторинг активности
Важно регулярно отслеживать логи сервера и сетевой активности, чтобы выявлять подозрительные или неожиданные запросы, которые могут быть связаны с попытками атак типа HTTP Response Splitting. Если обнаружены необычные HTTP-заголовки или неоднократные попытки манипулировать HTTP-ответами, следует незамедлительно принять меры.
7. Использование Web Application Firewall (WAF)
Современные WAF-решения способны обнаруживать и блокировать попытки выполнения атак, связанных с разделением HTTP-ответов, и других угроз. Они предоставляют дополнительный уровень защиты и могут автоматически фильтровать потенциально опасные запросы.
Следуя этим рекомендациям, можно значительно снизить риск атак HTTP Response Splitting и сделать ваше веб-приложение более защищённым от попыток злоумышленников нарушить его работу или захватить контроль над контентом.
Сообщения блогов группы «Личные блоги» (www.securitylab.ru)