
Легковесные HTTP/2 зонды для контролируемой проверки векторов DoS CVE-2019-9511 (Data Dribble) и CVE-2019-9513 (Priority Churn) в авторизованных средах.
Репозиторий со скриптами контролируемой валидации поведения, связанного с CVE CVE-2019-9511 и CVE-2019-9513, обе касаются векторов отказа в обслуживании в реализациях HTTP/2.
Скрипты созданы для поддержки технических проверок в авторизованных средах, позволяя наблюдать, договаривается ли сервер об HTTP/2 и отвечает ли на определенные шаблоны, связанные с Data Dribble и Priority Churn, без выполнения атаки типа "отказ в обслуживании".
Цель — подтвердить вектор легким и безопасным способом, с низким объемом запросов и без цели сделать среду недоступной.
| CVE | Имя | Скрипт | Описание |
|---|
CVE-2019-9511 | HTTP/2 Data Dribble | data_dribble_probe.py | Проверяет поведение управления потоком HTTP/2, высвобождая малые объемы данных контролируемым образом. |
CVE-2019-9513 | HTTP/2 Priority Churn / Resource Loop | priority_churn_probe.py | Проверяет поведение обработки фреймов PRIORITY с низкой интенсивностью. |
CVE-2019-9511, известная как HTTP/2 Data Dribble, затрагивает некоторые реализации HTTP/2, которые неэффективно обрабатывают манипуляции с окном потока и постепенную доставку данных.
В этом сценарии атакующий может запрашивать данные у сервера и манипулировать управлением потоком, чтобы ответ оставался открытым и доставлялся небольшими блоками, например пакетами по 1 байту. В зависимости от реализации такое поведение может вызвать чрезмерное потребление CPU, памяти или ресурсов соединения, что приводит к риску отказа в обслуживании.
В этом репозитории соответствующий скрипт:
data_dribble_probe.py
Цель скрипта — проверить поведение легким способом, без создания агрессивной нагрузки и без попыток вызвать недоступность.
Ссылки:
CVE-2019-9513, известная как HTTP/2 Priority Churn или Resource Loop, затрагивает некоторые реализации HTTP/2, которые дорого обрабатывают непрерывные изменения в дереве приоритетов потоков.
В этом сценарии атакующий может создать несколько потоков и многократно изменять приоритет между ними, вызывая "перемешивание" дерева приоритетов. В зависимости от реализации такое поведение может вызвать чрезмерное потребление CPU и привести к отказу в обслуживании.
В этом репозитории соответствующий скрипт:
priority_churn_probe.py
Цель скрипта — проверить, принимает ли сервер и обрабатывает ли фреймы PRIORITY, используя низкую интенсивность и не выполняя DoS-атаку.
Ссылки:
CVE CVE-2019-9511 и CVE-2019-9513 не привязаны к одной конкретной версии веб-сервера, например только nginx, Apache или Tomcat.
Они затрагивают определенные реализации HTTP/2 в различных продуктах, библиотеках, прокси, балансировщиках и серверах. Поэтому проверка должна учитывать, какой компонент ведет переговоры и обрабатывает HTTP/2 в анализируемой среде.
Примеры компонентов, которые могут быть задействованы:
nginx
Apache HTTP Server
Envoy
HAProxy
Tomcat
Jetty
Node.js
Go net/http2
nghttp2
CDN
WAF
Load Balancer
Ingress Controller Kubernetes
Первое техническое условие — подтвердить, что сервис договаривается об HTTP/2 через ALPN. Если сервис не договаривается о h2, эти скрипты неприменимы.
Подтверждение уязвимости по версии должно основываться на официальном предупреждении производителя идентифицированного компонента.
Перед запуском скриптов проверьте, договаривается ли цель об HTTP/2 через ALPN.
Используйте только домен в команде, без https://.
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
Также можно использовать с плейсхолдером:
openssl s_client -alpn h2 -connect <HOST>:443 </dev/null 2>/dev/null | grep -i "ALPN"
Ожидаемый вывод:
ALPN protocol: h2
Если вывод показывает h2, сервис договаривается об HTTP/2, и скрипты могут быть применимы.
Если ответа нет или согласован другой протокол, например http/1.1, скрипты для этой конечной точки неприменимы.
| Скрипт | Связанная CVE | Цель | Когда использовать |
|---|---|---|---|
data_dribble_probe.py | CVE-2019-9511 | Проверить поведение, связанное с Data Dribble, используя управление окном для высвобождения малых блоков данных | Использовать, когда сервер поддерживает HTTP/2 и есть необходимость проверить поведение при доставке DATA-фреймов с уменьшенным окном. |
priority_churn_probe.py | CVE-2019-9513 | Проверить поведение, связанное с Priority Churn, используя фреймы PRIORITY с низкой интенсивностью | Использовать, когда сервер поддерживает HTTP/2 и есть необходимость проверить, обрабатывает ли он изменения приоритетов потоков. |
Наиболее логичный порядок использования скриптов:
1. Предварительная проверка HTTP/2 с openssl
↓
2. priority_churn_probe.py
↓
3. data_dribble_probe.py
Сначала используйте команду с openssl, чтобы подтвердить, что цель договаривается об HTTP/2. Затем используйте priority_churn_probe.py для проверки, принимает ли сервер и обрабатывает ли фреймы приоритета. После этого используйте data_dribble_probe.py для наблюдения за поведением сервера при уменьшенном окне потока, высвобождая малые объемы данных контролируемым образом.
Оба скрипта являются легкими пробами. Они не предназначены для вызова недоступности, а для получения технического подтверждения наблюдаемого поведения.
priority_churn_probe.py — это легкая PoC для проверки поведения, связанного с CVE-2019-9513, известной как HTTP/2 Priority Churn.
Скрипт устанавливает соединение HTTP/2 через TLS, открывает небольшие HTTP-потоки и отправляет изменения приоритета через фреймы PRIORITY. Затем измеряет задержку до и после отправки этих фреймов, чтобы наблюдать, есть ли вариация в обработке.
PING;PRIORITY с низкой интенсивностью;Используйте этот скрипт, когда необходимо проверить, принимает ли HTTP/2 сервер и обрабатывает ли фреймы приоритета, связанные с вектором Priority Churn, без выполнения агрессивного DoS-теста.
Он подходит для контролируемой проверки в рамках пентестов, анализа подверженности HTTP/2 и технического подтверждения уязвимого или потенциально чувствительного поведения.
Скрипт принимает значения через аргументы командной строки:
--host
--port
--paths
--shuffles
| Параметр | Описание |
|---|---|
--host | FQDN разрешенной цели. Не включать https://. |
--port | TLS-порт, на котором доступен сервис HTTP/2. По умолчанию: 443. |
--paths | Список простых путей для открытия HTTP/2 потоков. |
--shuffles | Количество циклов изменения приоритета. Держать низким для безопасного теста. |
Используйте легкие, общедоступные пути с низким воздействием, например:
/
/robots.txt
/favicon.ico
/health
/login
Избегайте путей, которые выполняют тяжелые операции, сложные запросы, генерацию отчетов, загрузку, расширенный поиск или любые функции, создающие нагрузку на бэкенд.
python3 priority_churn_probe.py --host exemplo.com.br --port 443 --paths / /robots.txt /favicon.ico --shuffles 10
Пример вывода:
[OK] PING antes: 45.20 ms; após churn: 52.80 ms; shuffles=10
Sinal 9513: PRIORITY frames aceitos e processados; aumento sutil pós-churn evidencia o vetor (sem DoS).
Если скрипт смог договориться об HTTP/2, открыть потоки и отправить фреймы PRIORITY, это указывает на то, что сервер обрабатывает такое поведение.
Небольшое увеличение задержки после перемешивания может использоваться как техническое подтверждение существования вектора, но не должно интерпретироваться само по себе как доказательство серьезного воздействия. Окончательная классификация зависит от контекста, версии сервера, архитектуры, смягчающих факторов, WAF/CDN и конфигурации HTTP/2.
data_dribble_probe.py — это легкая PoC для проверки поведения, связанного с CVE-2019-9511, известной как HTTP/2 Data Dribble.
Скрипт устанавливает соединение HTTP/2 через TLS, открывает один поток и манипулирует окном управления потоком, чтобы высвобождать малые объемы данных, имитируя поведение постепенной доставки DATA-фреймов.
Используйте этот скрипт, когда необходимо проверить, отвечает ли HTTP/2 сервер на шаблон уменьшенного управления потоком, связанный с вектором Data Dribble, без выполнения агрессивной нагрузки.
Он подходит для контролируемого технического подтверждения, особенно когда автоматизированные инструменты указывают на возможную подверженность, и нужно вручную проверить с меньшим операционным риском.
Скрипт принимает значения через аргументы командной строки:
--host
--path
--port
--bytes
| Параметр | Описание |
|---|---|
--host | FQDN разрешенной цели. Не включать https://. |
--path | Путь, который будет запрошен в тесте. |
--port | TLS-порт, на котором доступен сервис HTTP/2. По умолчанию: 443. |
--bytes | Общее количество байтов, высвобождаемых во время теста. Держать низким для безопасной проверки. |
Используйте простой, статический путь с низкой стоимостью для сервера, например:
/
/robots.txt
/favicon.ico
/health
/login
Избегайте конечных точек, которые выполняют запросы к базе данных, тяжелую аутентификацию, асинхронную обработку, генерацию документов или вызовы внутренних систем.
python3 data_dribble_probe.py --host exemplo.com.br --path / --port 443 --bytes 12
Пример вывода:
[OK] HTTP/2 negociado; DATA frames recebidos: 12; bytes liberados: 12; tempo(ms): 1450
Sinal 9511: múltiplos DATA minúsculos entregues sob janela=1 (prova do caminho 'dribble' sem stress).
Если скрипт договаривается об HTTP/2 и получает маленькие DATA-фреймы по мере высвобождения окна потока, это указывает на то, что сервер обрабатывает такой шаблон управления потоком.
Это поведение может использоваться как техническое подтверждение вектора, но критичность должна оцениваться с учетом реального контекста среды: используемый сервер, версия, лимиты соединений, балансировщик, CDN, WAF, тайм-ауты и защита от злоупотреблений.
Скрипты требуют Python 3 и библиотеку h2.
python3
pip
h2
ssl
socket
argparse
Библиотеки ssl, socket, time, argparse и select входят в стандартную библиотеку Python.
Основная внешняя зависимость:
h2
Прямая установка:
python3 -m pip install h2
Установка с использованием виртуального окружения:
python3 -m venv venv
source venv/bin/activate
pip install h2
Проверьте установку:
python3 -c "import h2; print('h2 instalado com sucesso')"
Скрипты зависят от договоренности об HTTP/2 через ALPN.
Перед запуском подтвердите, что сервер поддерживает HTTP/2:
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
Ожидаемый вывод:
ALPN protocol: h2
Если сервер не договаривается о h2, скрипты неприменимы.
--hostНе указывайте https:// в параметре --host.
Правильно:
--host exemplo.com.br
Неправильно:
--host https://exemplo.com.br
Предпочитайте простые пути:
/
/robots.txt
/favicon.ico
/health
Избегайте чувствительных или тяжелых конечных точек:
/relatorios
/export
/search
/upload
/api/processamento
Цель — проверить поведение HTTP/2, а не нагружать бэкенд.
Используйте консервативные значения:
Для priority_churn_probe.py:
--shuffles 10
Для data_dribble_probe.py:
--bytes 12
Не увеличивайте эти значения в рабочей среде без явного разрешения.
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
python3 priority_churn_probe.py --host exemplo.com.br --port 443 --paths / /robots.txt /favicon.ico --shuffles 10
python3 data_dribble_probe.py --host exemplo.com.br --path / --port 443 --bytes 12
Для снижения рисков, связанных с HTTP/2 DoS-атаками, рекомендуется поддерживать веб-серверы, прокси, балансировщики и библиотеки HTTP/2 в актуальном состоянии, применять лимиты соединений, настраивать соответствующие тайм-ауты, ограничивать количество одновременных потоков, ограничивать злоупотребление HTTP/2 фреймами, отслеживать аномалии задержек и оценивать отключение HTTP/2 на сервисах, которым этот протокол не нужен.
Также рекомендуется проверять защиту на таких уровнях, как CDN, WAF, обратный прокси, ingress controller и балансировщик нагрузки, поскольку часто реальная подверженность зависит больше от граничного устройства, чем от конечного приложения.
Подтверждение исправления должно основываться на компоненте, который фактически завершает и обрабатывает HTTP/2 в среде: веб-сервер, прокси, балансировщик, CDN или ingress controller.
Эти скрипты должны использоваться только в авторизованных средах.
Хотя они написаны для легкого выполнения, они напрямую взаимодействуют с механизмами HTTP/2, связанными с DoS-векторами. Поэтому использование должно соответствовать формальным рамкам теста, правилам взаимодействия и операционным ограничениям, определенным с ответственным за среду.
Перед запуском в рабочей среде подтвердите:
Использование этих скриптов против систем без разрешения запрещено.
Цель этого репозитория — исключительно поддержка законных действий в области безопасности, таких как авторизованный пентест, контролируемая проверка уязвимостей, лабораторная работа, техническое изучение и безопасная демонстрация риска.