Уязвимость в протоколе HTTP/2, применённая в крупнейшей DDoS-атаке

Компания Google зафиксировала крупнейшую DDoS-атаку на свою инфраструктуру, интенсивность которой составила 398 миллионов запросов в секунду. Для сравнения новая атака в 7 раз превосходит по интенсивности прошлую рекордную DDoS-атаку, в которой злоумышленникам удалось сформировать поток из 47 миллионов запросов в секунду. Помимо Google с атакой также столкнулись компании Amazon и Сloudflare. Возможность совершения новой атаки связана с выявлением в протоколе HTTP/2 уязвимости (CVE-2023-44487), позволяющей при минимальной нагрузке на клиента направлять огромный поток запросов на сервер.

Новая техника атаки получила название “Rapid Reset” и вызвана тем, что предоставляемые в HTTP/2 средства мультиплексирования каналов связи дают возможность сформировать поток запросов в рамках уже установленного соединения, без открытия новых сетевых соединений и не дожидаясь подтверждения получения пакетов.

По аналогии с ранее применявшимися методами проведения атак на HTTP/2, в новой атаке также создавалось большое число потоков в рамках одного соединения. Ключевым отличием новой атаки стало то, что вместо ожидания ответа следом за каждым отправленным запросом направлялся кадр с флагом RST_STREAM, сразу отменяющим запрос. Отмена запроса на ранней стадии позволяла избавиться от обратного трафика в сторону клиента и обойти присутствующие на HTTP-серверах ограничения на максимально возможное число потоков, одновременно отрытых в рамках одного соединения по HTTP/2. Таким образом объём направляемых на HTTP-сервер запросов перестал зависеть от задержек между отправкой запроса и получением ответа (RTT, round-trip time) и упирался только в пропускную способность канала связи.


Так как для проведения атаки на стороне клиента достаточно просто отправлять запросы, не получая ответов, атака может быть проведена с минимальными накладными расходами. Например, зафиксированная компанией Сloudflare атака в 201 млн запросов в секунду была проведена при помощи относительно небольшого ботнета в 20 тысяч компьютеров. На стороне сервера затраты на обработку поступающих запросов существенно выше, несмотря на их отмену, так как необходимо выполнять такие операции, как выделение структур данных под новые потоки, разбор запроса, распаковка заголовка и сопоставление URL с ресурсом. При атаке на обратные прокси, запрос может быть перенаправлен на бэкенд до обработки кадра RST_STREAM.

Атака может быть совершена только на уязвимые серверы с поддержкой HTTP/2 (скрипт для проверки проявления уязвимости в серверах). Подверженность уязвимости и наличие исправлений для HTTP-серверов и прокси:

  • nginx (анонс, пояснение, что уязвимость в полной мере не проявляется в nginx в конфигурации по умолчанию, так как атака упрётся в лимит на число запросов на соединение (т.e. после каждых 1000 запросов соединение будет сбрасываться). В исправлении добавлена дополнительная защита по ограничению интенсивности запросов через директиву “limit_req”).
  • В HAProxy эффективная защита от превышения лимита на число потоков HTTP/2 была добавлена ещё в 2018 году и действует начиная с версии 1.9-dev.
  • Apache httpd (создаётся определённая нагрузка на httpd, но она не распространяется на бэкенды и ограничивается действующими с 2016 года лимитами на соединения клиентов).
  • caddy
  • envoy
  • golang (проблема устранена в выпусках Go 1.21.3 и 1.20.10).
  • h2o (патч).
  • hyper (уязвимость не проявляется).
  • jetty (исправлено в 12.0.2, 11.0.17, 10.0.17 и 9.4.53.v20231009).
  • netty
  • nghttp2 (исправлено в версии 1.57.0).
  • Node.js
  • proxygen
  • swift-nio-http2 (исправлено в версии 1.28.0).
  • Apache Tomcat (исправлено в версиях 11.0.0-M12, 10.1.14, 9.0.81, 8.5.94).
  • Apache Traffic Server (исправлено в ветке 9.2.x).

Release. Ссылка here.