Репост из: Делаю вид что разбираюсь
Как известно все новое это хорошо забытое старое, потому начну рассказ со времен когда люди еще не ставили nginx перед апачем. И когда шутник даже через крайне узкий канал мог делать slowloris: в кучу потоков делаем большой post запрос отправляя тело по байту в минуту, а сервер вынужден из-за этого аллоцировать кучу ресурсов.
Собственно в http/2 настолько намудрили в протоколе, что переизобрели эту атаку. Для этой атаки нам понадобятся два фрейма: HEADERS и CONTINUATION. Первый посылает в упакованном виде заголовки для запроса/ответа и содержит флаг "будет ли еще", ну а второй соответственно досылает еще (если не влезли в первый пакет) и имеет аналогичный флаг. Интересно, а что же будет если просто посылать CONTINUATION фреймы с флагом "жди еще"? Правильный ответ на этот вопрос с собеса "it depends":
Самый примитивный вариант это просто выжраная память под хранение этих заголовков для будущего запроса
Вот в случае Go чуть интереснее, он, конечно, выплюнет ошибку, что достиг лимита заголовков, но цикл парсинга не остановит (который крутится до получения флага "на этом все") и проц умрет быстрее
Самый веселый вариант конечно же в Node.js — там напрограммировали рейс и если сначала послать фрейм "щас еще докину заголовков", а потом разорвать коннект то нода просто упадет с коркой
https://nowotarski.info/http2-continuation-flood-technical-details/
Собственно в http/2 настолько намудрили в протоколе, что переизобрели эту атаку. Для этой атаки нам понадобятся два фрейма: HEADERS и CONTINUATION. Первый посылает в упакованном виде заголовки для запроса/ответа и содержит флаг "будет ли еще", ну а второй соответственно досылает еще (если не влезли в первый пакет) и имеет аналогичный флаг. Интересно, а что же будет если просто посылать CONTINUATION фреймы с флагом "жди еще"? Правильный ответ на этот вопрос с собеса "it depends":
Самый примитивный вариант это просто выжраная память под хранение этих заголовков для будущего запроса
Вот в случае Go чуть интереснее, он, конечно, выплюнет ошибку, что достиг лимита заголовков, но цикл парсинга не остановит (который крутится до получения флага "на этом все") и проц умрет быстрее
Самый веселый вариант конечно же в Node.js — там напрограммировали рейс и если сначала послать фрейм "щас еще докину заголовков", а потом разорвать коннект то нода просто упадет с коркой
https://nowotarski.info/http2-continuation-flood-technical-details/