Компания Google зафиксировала крупнейшую DDoS-атаку на свою инфраструктуру, интенсивность которой составила 398 миллионов запросов в секунду. Новая атака в 7 раз превосходит по интенсивности прошлую рекордную DDoS-атаку, в которой злоумышленникам удалось сформировать поток из 47 миллионов запросов в секунду. Для сравнения весь трафик во всём Web оценивается на уровне 1-3 миллиардов запросов в секунду. Помимо Google с атакой также столкнулись компании Amazon и Сloudflare. Возможность совершения новой атаки связана с выявлением в протоколе HTTP/2 уязвимости (CVE-2023-44487), позволяющей при минимальной нагрузке на клиента направлять огромный поток запросов на сервер.
Новая техника атаки получила название "Rapid Reset" и пользуется тем, что предоставляемые в HTTP/2 средства мультиплексирования каналов связи дают возможность сформировать поток запросов в рамках уже установленного соединения, без открытия новых сетевых соединений и не дожидаясь подтверждения получения пакетов. Уязвимость рассматривается как следствие недоработки протокола HTTP/2, в спецификации которого сказано, что при попытке открытия слишком большого числа потоков, следует аннулировать только потоки, превышающие лимит, но не закрывать всё сетевое соединение.
По аналогии с ранее применявшимися методами проведения атак на HTTP/2, в новой атаке также создаётся большое число потоков в рамках одного соединения. Ключевым отличием новой атаки стало то, что вместо ожидания ответа следом за каждым отправленным запросом направляется кадр с флагом RST_STREAM, сразу отменяющим запрос. Отмена запроса на ранней стадии позволяет избавиться от обратного трафика в сторону клиента и обойти присутствующие на HTTP-серверах ограничения на максимально возможное число потоков, одновременно отрытых в рамках одного соединения по HTTP/2. Таким образом, в новой атаке объём направляемых на HTTP-сервер запросов перестаёт зависеть от задержек между отправкой запроса и получением ответа (RTT, round-trip time) и упирается только в пропускную способность канала связи.
Так как для проведения атаки на стороне клиента достаточно просто отправлять запросы, не получая ответов, атака может быть проведена с минимальными накладными расходами. Например, зафиксированная компанией Сloudflare атака в 201 млн запросов в секунду была проведена при помощи относительно небольшого ботнета в 20 тысяч компьютеров. На стороне сервера затраты на обработку поступающих запросов существенно выше, несмотря на их отмену, так как необходимо выполнять такие операции, как выделение структур данных под новые потоки, разбор запроса, распаковка заголовка и сопоставление URL с ресурсом. При атаке на обратные прокси, атака может распространиться на бэкенды, так как прокси может успеть перенаправить запрос на бэкенд до обработки кадра RST_STREAM.
Атака может быть совершена только на уязвимые серверы с поддержкой HTTP/2 (скрипт для проверки проявления уязвимости в серверах, инструментарий для совершения атаки). Для HTTP/3 атаки пока не зафиксированы и возможность их совершения полностью не проанализирована, но представители Google рекомендуют разработчикам серверов добавить в реализации HTTP/3 меры защиты, похожие на реализованные для блокирования атаки на HTTP/2.
Подверженность уязвимости и наличие исправлений для HTTP-серверов и прокси:
nginx (анонс, пояснение, что уязвимость в полной мере не проявляется в nginx в конфигурации по умолчанию, так как атака упрётся в лимит на число запросов на соединение (т.e. после каждых 1000 запросов соединение будет сбрасываться). В исправлении добавлена дополнительная защита по ограничению интенсивности запросов через директиву "limit_req").
В HAProxy эффективная защита от превышения лимита на число потоков HTTP/2 была добавлена ещё в 2018 году и действует начиная с версии 1.9-dev.
Apache httpd (создаётся определённая нагрузка на httpd, но она не распространяется на бэкенды и ограничивается действующими с 2016 года лимитами на соединения клиентов).
mod_h2 для Apache httpd.
caddy
envoy
golang (проблема устранена в выпусках Go 1.21.3 и 1.20.10).
h2o (патч).
grpc-go
hyper (уязвимость не проявляется).
jetty (исправлено в 12.0.2, 11.0.17, 10.0.17 и 9.4.53.v20231009).
netty
nghttp2 (исправлено в версии 1.57.0).
Facebook proxygen
.NET и ASP.NET Core (уязвимости подвержен http-сервер ASP.NET Core Kestrel).
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).
https://opennet.ru/59901-ddos