The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

В различных реализациях протокола HTTP/2 выявлено 8 DoS-уязвимостей

13.08.2019 22:41

Исследователи из компаний 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, но с пустым полезным содержимым и без флага завершения потока. Сервер тратит время на обработку каждого кадра, непропорционально затраченной атакующим полосе пропускания.


  1. Главная ссылка к новости (https://blog.cloudflare.com/on...)
  2. OpenNews: DoS-уязвимость в mod_http2 из состава http-сервера Apache
  3. OpenNews: Серия уязвимостей в реализациях HTTP/2
  4. OpenNews: HTTP поверх протокола QUIC будет стандартизирован как HTTP/3
  5. OpenNews: HTTP/2.0 получил статус предложенного стандарта
  6. OpenNews: Атака на системы фронтэнд-бэкенд, позволяющая вклиниться в сторонние запросы
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/51279-http2
Ключевые слова: http2, nginx, h2o, apache
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (55) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.3, Аноним (3), 03:22, 14/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +22 +/
    >Многие реализации должным образом не ограничивали поток управляющих сообщений, неэффективно организовывали работу очереди приоритетов при обработке запросов или использовали неоптимальные реализации алгоритмов управления потоком

    Вся суть современного IT: некогда оптимизировать, некогда тестировать, тяп-ляп и в продакшен!

     
     
  • 2.4, Аноним (4), 05:18, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +6 +/
    То ли дело деды программировали. Всякие рекурсивные днсы, рипы и прочее до сих пор аукается.

    Да и в самом http тоже всякого добра хватает, например, передача всех кук на каждый запрос, невозможность заменить gzip сжатие на что-то более адекватное и т.п.

     
     
  • 3.5, Аноним (5), 05:58, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +10 +/
    Не всех кук, а только относящихся к текущему домену и пути. Деды не виноваты, что современные веб-девелоперы всегда ставят '/' в качестве пути для всех кук. Со сжатием то же самое - не вина дедов, что браузеры только gzip поддерживают.
     
     
  • 4.34, Аноним (34), 12:36, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ограничение количества пересылаемых кук по путям, лишь немного ослабляют и оттягивают проблему.

    Если браузер и так постоянно держит с сервером keep-alive соединение, то нафига на каждый гет пересылать все авторизационные куки?

     
     
  • 5.35, Аноним (35), 12:56, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    В сравнении с мегабайтами джаваскрипта на чаждый чих -- все эти куки посто пыль.
     
  • 5.38, Аноним (5), 13:43, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Потому что путь нового гет может отличаться, соответственно и набор кук может быть иным. Потому что даже при том же пути набор и значение кук может измениться (яваскриптом или прямыми действиями пользователя).
    И потому, что предназначение кук - вовсе не передача данных, используйте инструмент по назначению и всё будет нормально.
     
  • 5.46, Аноним (46), 18:06, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Потому что HTTP - это stateless протокол, а keep-alive соединение - просто оптимизация. Сервер, с которым установлено соедиение, с большой вероятностью не обрабатывает запрос сам, а передает дальше, и твои запросы в рамках одного подключения могут обрабатываться разными процесссами, возможно на разных машинах. Если фронтенд (реверс-прокси) сам бы хранил все куки для твоего соединения, то для обслуживания сотен тысяч одновременных соденинений (nginx без проблем тянет такие цифры) потребовалось бы дохрена памяти. При этом нет никакой гарантии, что фронтенд поддерживает keep-alive соединение именно с тобой, а не с проксей, через которую ты ходишь в интернет - в последнем случае твоими куками мог бы воспользоваться другой пользователь прокси.
     
  • 3.8, anonnn (?), 08:24, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    что за бред с gzip? можно хоть zip, хоть бротли заюзать
    походите по крупным сайтам, там поголовно почти везде brotli вместо gzip
     
     
  • 4.32, Аноним (34), 12:29, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Изначально гугловцы так и сделали. Потом оказалось, что в мире слишком много проксей, которые или криво сконфигурированы или в принципе аппаратные и не могут быть перенастроены, которые, встречая не гзипнутый трафик, гзипуют его и перезатирают хедеры.

    В итоге, на клиент приходит каша из сжатого дважды трафика и неверными хедерами.

    Помучавшись с этим, гугловцы откатили поддержку других типов сжатий из http, оставив его только для https.

     
     
  • 5.48, letsmac (ok), 00:25, 15/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Аппаратный прокси? Это как? Или просто железка с устаревшей прошивкой?
     
     
  • 6.54, Аноним (54), 12:55, 16/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Или просто железка с устаревшей прошивкой

    Не просто "железка с устаревшей прошивкой", а неподдерживаемая, но еще работающая "железка с устаревшей прошивкой", новой прошивки для которой скорее всего никогда уже не будет, но заменить которую стоит много американских денег :(

     
     
  • 7.55, letsmac (ok), 14:48, 19/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >>но заменить которую стоит много американских денег :(

    Поминусуют конечно - но это просто косяк в изначальной концепции. Кто-то купил в архитектуру "странную" железку без контракта на апдейт/техсаппорт и потом все страдают. Типичный случай.

     
  • 3.9, Andrey Mitrofanov_N0 (??), 08:32, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    >невозможность заменить gzip сжатие на что-то более
    > адекватное и т.п.

    Это когда 99% http-трафика http://techrights.org/2019/08/10/making-the-web-light/
    - ненужный мусор?

    Да! Есть такая проблема.  В http, ога.

     
  • 3.41, ы (?), 14:38, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Если бы http разрабатывался по современным нормам (кратко: бизнес не ждёт, агиль быстрее!1), проблем было бы на порядок больше. Если бы он вообще удался, ведь в моде ещё и federated.
     
  • 3.56, Урри (?), 14:53, 19/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Весь веб через жoпу сделан.
    Например, вебсокеты разрабатывали какие-то недоделанные студенты - там если rfc почитать, то можно все лицо себе фейспалмом разбить.

    Например: при аутентификации надо взять какую-нибудь случайную строку и сделать из нее base64, который уже пересылается на сервер. И, внимание, после всех манипуляций проверка идет по этой строке - никто обратно base64 не декодирует.
    Внимание, вопрос: почему тогда не написали "сгенерируйте строку из символов 1-9a-z="? Все просто - потому, что "уяк, уяк и в продакшен", так как даже не потрудились вычитать текст "стандарта" после того как, очевидно, удалили лишнюю проверку строки.
    А таких примеров - масса. Я когда писал демон вебсокет<->сокет, два месяца на веб глядеть не мог, так тошнило от этой криворукости.

    Или вот GUID (требование RFC - "сгенерируйте GUID"), который именно гуид - но, внимание, нигде нету требования что-то из него вытаскивать или проверять. Он используется просто как текстовая строка!!!
    Я спокойно юзал слово "your-*ucking-monkeys" вместо гуида, и оно работало везде.

    Так что ни разу не удивлен, да. Скорее странно что раньше не раскопали.

     
  • 2.15, Аноним (15), 11:06, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Пока ты писал свой идеальный код под Дос, вышел windows 10
     
     
  • 3.24, пох. (?), 11:53, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    а нельзя ли его затолкать туда, откуда он "вышел", и чопик, чопик вбить в эту задницу индусскую - чтоб больше не выходил?

    И вернуть семерку, которая, хотя бы, не менялась каждый день.

     
     
  • 4.29, Andrey Mitrofanov_N0 (??), 12:06, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > а нельзя ли его затолкать туда, откуда он "вышел", и чопик, чопик
    > вбить в эту задницу индусскую - чтоб больше не выходил?
    > И вернуть семерку, которая, хотя бы, не менялась каждый день.

    Конечно, нельзя.  _Ты_ же уже за _это_ заплатил.

    Или ты против Рынка???  :-O

     
     
  • 5.30, пох. (?), 12:20, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    в смысле? Я-то как раз за семерку им платил - за десятку и жаба душила бы, и, в общем не нужно низачем - везде где пользуюсь, она досталась бесплатно без смс.

     
     
  • 6.33, Andrey Mitrofanov_N0 (??), 12:35, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >она досталась бесплатно без смс.

    Уговорил.  Не заплатил.  Зато как славно отрабатываешь :-p

     
  • 4.43, Аноним (43), 14:59, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Жаба гадюку... Аксиома Эскобара прямо какая-тою
     
  • 2.18, Аноним (18), 11:30, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не вали на разработчиков. Такой переусложнённый протокол невозможно реализовать, не накосячив.
     
     
  • 3.19, Andrey Mitrofanov_N0 (??), 11:41, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Не вали на разработчиков. Такой переусложнённый протокол невозможно реализовать, не накосячив.

    АНБ закладки уровня протокола.   Норм, чо.

     
  • 3.25, пох. (?), 11:54, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    и зачем они рвались его реализовывать? Иначе гугель выкинет за борт?
     
  • 3.40, Аноним (40), 13:49, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Они специально его переусложнили. А теперь виноваты кто угодно кроме них. А те кто решили переусложненный протокол реализовавать сообщники.
     
     
  • 4.53, Аноним (53), 02:31, 16/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Когда rfc приняли, уже поздно, приходится делать что есть.

    А приняли, потому что Гугл пропихнул.

    В той же рассылке nginx критики протокола было много. Но он решает насущную проблему с оверхедом на хендшейки, соответственно экономит проц, соответственно экономит деньги, так что куда деваться.

     
  • 2.20, Нанобот (ok), 11:43, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >Вся суть современного IT: некогда оптимизировать, некогда тестировать, тяп-ляп и в продакшен!

    звучит как ворчание старого пердуна

     
     
  • 3.22, Andrey Mitrofanov_N0 (??), 11:50, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >>Вся суть современного IT: некогда оптимизировать, некогда тестировать, тяп-ляп и в продакшен!
    > звучит как ворчание старого пердуна

    не перж*ж молодого девляпяпса - и ладно

     
     
  • 4.44, Аноним (43), 15:12, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Вали на гофер и не газифицируй больше наш мелкий водоём.
     
  • 2.51, KonstantinB (ok), 17:47, 15/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Вот не надо. В nginx http/2 тестировали ОЧЕНЬ долго.

    Просто это очень переусложненный протокол, сложность просто катастрофическая. Вот до такого способа DoS-а только что догадались, а ведь протокол существует уже давно.

     

  • 1.1, Аноним (1), 23:58, 13/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Шерето! Для хипсторов, в общем. Пусть побетатестят для нас, а мы потом как-нибудь заюзаем.
     
  • 1.2, axredneck (?), 00:22, 14/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +25 +/
    > CVE-2019-9512 (Ping Flood)

    Люблю их музыку

     
     
  • 2.6, EuPhobos (ok), 06:23, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +13 +/
    >> CVE-2019-9512 (Ping Flood)
    > Люблю их музыку

    Особенно хорош их альбом "fire Wall"

     
     
  • 3.7, Аноним (7), 07:47, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +17 +/
    All in all you just another port in the firewall.
     
     
  • 4.11, Кредит (?), 09:35, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Отлично разогнали мужики!
     
  • 4.47, macfaq (?), 21:46, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Строчку "we don't need no education" можно не переписывать.
     

  • 1.10, Аноним (10), 09:31, 14/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Netty уже поправили: https://netty.io/news/2019/08/13/4-1-39-Final.html
     
     
  • 2.12, Аноним (12), 09:41, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Envoy, Golang тоже пофиксили
     

  • 1.13, Аноним (13), 09:54, 14/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > атакующий открывает скользящее окно HTTP/2 для отправки сервером данных без ограничений, но при этом держит окно TCP закрытым

    Бугагагага. Ибо нефиг тащить в протокол уровня приложения функции протокола транспортного уровня.

     
     
  • 2.14, Fyjybv755 (?), 10:53, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А то, что там уже давно реализованы функции сеансового уровня (TLS), вас не смущает?
     
     
  • 3.17, Аноним (18), 11:25, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Это хотя бы можно оправдать потребностью в обратной совместимости.
     
     
  • 4.26, пох. (?), 11:55, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    наоборот же ж - это ничем оправдать нельзя, и никакой совместимости там в помине нет.

    обратная совместимость - в starttls.

     
  • 2.21, Нанобот (ok), 11:50, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    разделение на уровни условно и придумано самими человеками с целью упрощения понимания/описания сложных систем. и хотя от него больше пользы, чем вреда, но фанатичная вера в непоколебимость этих  разделений ни к чему хорошему не приведёт
     
     
  • 3.37, Аноним (13), 13:23, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Разделение имеет своим обоснования. Опровергнуть их аргументами кроме "фанатичной веры", как видно, Вам нечем.
    Что же касается данного случая, прививка генов бульдога носорогу привела к необходимости принимать дополнительные меры по синхронизации потока на уровнях HTTP и TCP.
     
     
  • 4.50, letsmac (ok), 00:33, 15/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >>необходимости принимать дополнительные меры по синхронизации потока на уровнях HTTP и TCP.

    Как HTTP к TCP относиться? Они вроде как разного уровня.

     
     
  • 5.52, Аноним (52), 22:17, 15/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Вот именно. Разного уровня, а в http встроили функционал, за который который отвечает TCP. В результате:
    > CVE-2019-9517 (Internal Data Buffering) - атакующий открывает скользящее окно HTTP/2 для отправки сервером данных без ограничений, но при этом держит окно TCP закрытым, что не позволяет фактически записать данные в сокет
     
  • 2.49, letsmac (ok), 00:27, 15/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Согласен процентов на 80. Если бы сделали udp с удержанием соединения - это потребовало бы намного больше затрат. На ipv6 уже лет 20 переходят.
     

  • 1.16, Матаноним (?), 11:19, 14/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Потому что HTTP/2 - это как systemD от мира протоколов. Осталось protobuf и gRPC прямо в стандарт вхреначить, чтоб уж полный комплект. Чорт, теперь точно вхреначат.
     
     
  • 2.27, пох. (?), 11:56, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    погодите, они разьве еще не в quiRk ?
     
  • 2.28, Andrey Mitrofanov_N0 (??), 11:57, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Потому что HTTP/2 - это как systemD от мира протоколов.

    Гугль продавил на хайпе свою реализацию переусложнённого непознаваемого хлама, заражающегои и поражающего всё, к чему прикасается, не пригодную для кооперативной, совместной разработки, в кач-ве стандарта и монополии?

    Нет, совсем не похоже на s-d.  Роль Микрософта не раскрыта.

     
     
  • 3.31, пох. (?), 12:24, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Гугль продавил на хайпе свою реализацию переусложнённого непознаваемого хлама,

    ну, вообще-то, как ни странно - да. С мордокнижкой на пару - поскольку решает проблемы в основном нового-модного-централизованного инета с тремя сайтами для всех.

    Пока еще не монополия, но ждем-с выпиливания 1.x из браузера под каким-нибудь высосанным из пальца предлогом.

    > Роль Микрософта не раскрыта.

    а в штаны...systemd нам - это тоже microsoft нас...л ?

     
     
  • 4.36, Andrey Mitrofanov_N0 (??), 13:10, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >> Роль Микрософта не раскрыта.
    > а в штаны...systemd нам - это тоже microsoft нас...л ?

    Вам-то?  Вы сами-то  не следили за штанишками, когда "бисплатно биз смс"?   Ну, ничего-ничего-ничего: один расс не зюстем-двас.

     

  • 1.39, Аноним (40), 13:47, 14/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Опубликовали фичи которые они и так знали.
     
  • 1.42, Ivan_83 (ok), 14:46, 14/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Вот что бывает когда страдают фигнёй.
    Полгаю там каждый год теперь будут находить по паре критических багов в реализациях ещё лет 10, как было с остальными бинарными протоколами.
     
     
  • 2.45, пох. (?), 17:04, 14/08/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    не надейся - это устаревший никому не нужный подход.
    через год все уже забудут этот http2 и его проблемы, поскольку будут заняты переходом с немодного, надоевшего, и вот, кстати, уязвимость quic на quic5


    А для открытий ссылок http:// - используйте ftp клиенты, файловый менеджер - короче, для чтения текста в интернете используйте что угодно, кроме браузеров, браузеры, они для другого.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру