В различных реализациях протокола HTTP/2 выявлено 8 DoS-уязвимостей
13 августа 2019 года
Исследователи из компаний Netflix и Google выявили в различных реализациях протокола HTTP/2 восемь уязвимостей, которые позволяют вызвать отказ в обслуживании через отправку определённым образом оформленного потока сетевых запросов. Проблемы в той или иной мере затрагивают большинство HTTP-серверов с поддержкой HTTP/2 и приводят к исчерпанию доступной для рабочего процесса памяти или созданию слишком высокой нагрузки на CPU. Обновления с устранением уязвимостей уже представлены в nginx 1.16.1/1.17.3 и H2O 2.2.6, но пока недоступны для Apache httpd, HA Proxy и других продуктов (дополнение: исправление также выпущено для Netty, Go net/http2, Caddy, SwiftNIO, Envoy и продуктов Microsoft. Для Node.js исправление ожидается 15 августа).
Проблемы стали следствием внесённых в протокол HTTP/2 усложнений, связанных с применением бинарных структур, системой лимитирования потоков данных внутри соединений, механизмом приоритизации потоков и наличия ICMP-подобных управляющих сообщений, работающих на уровне соединения HTTP/2 (например, операции ping, сброса и настройки потока). Многие реализации должным образом не ограничивали поток управляющих сообщений, неэффективно организовывали работу очереди приоритетов при обработке запросов или использовали неоптимальные реализации алгоритмов управления потоком.
Большинство выявленных методов атаки сводятся к отправке на сервер определённых запросов, приводящих к генерации большого числа ответов. Если при этом клиент не читает из сокета данные и не разрывает соединение, очередь буферизации ответов на стороне сервера непрерывно заполняется. Подобное поведение создаёт нагрузку на систему управления очередью обработки сетевых соединений и в зависимости от особенностей реализации приводит к исчерпанию доступной памяти или ресурсов CPU.
Выявленные уязвимости:
- CVE-2019-9511 (Data Dribble) - атакующий запрашивает большой объём данных в несколько потоков, манипулируя размером скользящего окна и приоритетом потока, принуждая сервер помещать данные в очередь блоками по 1 байту;
- CVE-2019-9512 (Ping Flood) - атакующий непрерывно отравляет ping-сообщения через соединение HTTP/2, инициируя заполнение на другой стороне внутренней очереди отправленных ответов;
- CVE-2019-9513 (Resource Loop) - атакующий создаёт несколько потоков запросов и непрерывно меняет приоритет потоков, вызывая перемешивание дерева приоритетов;
- CVE-2019-9514 (Reset Flood) - атакующий создаёт несколько потоков
и отправляет через каждый поток некорректный запрос, вызывая отправку сервером кадров RST_STREAM, но не принимает их для заполнения очереди ответов;
- CVE-2019-9515 (Settings Flood) - атакующий отправляет поток пустых кадров "SETTINGS", в ответ на которые сервер обязан подтвердить получение каждого запроса;
- CVE-2019-9516 (0-Length Headers Leak) - атакующий отправляет поток заголовков с нулевым именем и нулевым значением, а сервер выделяет для хранения каждого заголовка буфер в памяти и не освобождает его до завершения сеанса;
- CVE-2019-9517 (Internal Data Buffering) - атакующий открывает
скользящее окно HTTP/2 для отправки сервером данных без ограничений, но при этом держит окно TCP закрытым, что не позволяет фактически записать данные в сокет. Далее атакующий отправляет запросы, требующие большого ответа;
- CVE-2019-9518 (Empty Frames Flood) - атакующий отправляет поток кадров типа DATA, HEADERS, CONTINUATION или PUSH_PROMISE, но с пустым полезным содержимым и без флага завершения потока. Сервер тратит время на обработку каждого кадра, непропорционально затраченной атакующим полосе пропускания.
Источники
правитьЛюбой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.