QPACK amplification attacks on HTTP/3 servers

HTTP/3 servers can be overwhelmed by a single client sending compressed headers that expand into thousands of memory allocations.

Oct 20, 2026

20 cards · 2m · tap to begin

From · · 2m

QPACK amplification attacks on HTTP/3 servers

HTTP/3 servers can be overwhelmed by a single client sending compressed headers that expand into thousands of memory allocations.

In brief

HTTP/3 servers can be overwhelmed by a single client sending compressed headers that expand into thousands of memory allocations. A remote client can force HTTP/3 servers to use tens to thousands of times more memory than the original request. Originally reported by Foxio.

QPACK amplification attacks

A remote, unauthenticated client can force an HTTP/3 server to allocate tens to thousands of times more memory than it sends.

“A remote, unauthenticated client can force an HTTP/3 server to allocate tens to thousands of times more memory than it sends.”

Vulnerability impact

One connection is enough to cause an out-of-memory error or pin a default-configured server.

“One connection is enough to cause an out-of-memory error or pin a default-configured server.”

Affected implementations

Affected implementations

Seven of ten tested implementations are vulnerable to this attack.

“Seven of ten tested implementations are vulnerable to this attack.”

QPACK compression

QPACK compresses HTTP/3 headers to minimize traffic sent over the wire.

“QPACK compresses HTTP/3 headers to minimize traffic sent over the wire.”

Decoded header limits

Across affected implementations, decoded-header limits are missing, incomplete, or applied too late.

“Across affected implementations, decoded-header limits are missing, incomplete, or applied too late.”

Amplification mechanism

Amplification mechanism

A small HEADERS frame can expand into hundreds of thousands of header objects in memory.

“A small HEADERS frame can expand into hundreds of thousands of header objects in memory.”

Patched as of Oct 20, 2:00

Patches for the vulnerability were released by October 20, 2026.

“Patched as of October 20, 2026”

Fixed versions

quic-go 0.57.0, Cloudflare quiche 0.29.3, lsquic 4.9.0, Wireshark 4.6.2 / 4.4.12 are fixed.

“quic-go 0.57.0, Cloudflare quiche 0.29.3, lsquic 4.9.0, Wireshark 4.6.2 / 4.4.12”

Unpatched versions

Unpatched versions

Bun 1.4.3, h3 (hyperium), aioquic / mitmproxy remain vulnerable.

“Bun 1.4.3, h3 (hyperium), aioquic / mitmproxy”

Background

The vulnerability was discovered during research into QUIC stacks for a TLS scanner.

“During recent research into the different QUIC stacks for our active TLS scanner, JA4Scan”

Root cause

Decoded-header limits are missing, incomplete, or applied too late across affected implementations.

“Some implementations tested got at least one of these wrong: They check the compressed frame size, not the decoded size”

How it works

A client sends unique header names to create distinct entries in the receiving header map.

“The goal is to maximize the number of headers inside a single HEADERS frame.”

Example attack

A 1,000,000-byte HEADERS frame holds about 160,000 unique headers.

“A 1,000,000-byte HEADERS frame holds about 160,000 unique headers this way.”

quic-go vulnerability

quic-go limits the compressed HEADERS frame but does not enforce a decoded-header budget.

“quic-go is the Go library behind Caddy, Traefik, and cloudflared.”

Cloudflare quiche vulnerability

quiche omits the 32-byte overhead per field and pre-allocates buffers.

“quiche had two issues rolled into one CVE.”

lsquic vulnerability

lsquic has no cumulative decoded limit and unlimited HEADERS blocks.

“lsquic's vulnerability is the deepest I found.”

Bun vulnerability

Bun replaces lsquic's 64 KiB cap with no cap and has a memory leak.

“Bun has a second bug in the same function that turns the amplification into a permanent denial of service.”

aioquic / mitmproxy vulnerability

aioquic parses MAX_FIELD_SECTION_SIZE but never checks it during decoding.

“aioquic is the Python HTTP/3 library used by mitmproxy and hypercorn.”

h3 vulnerability

h3 decodes all headers into a vector and panics when the limit is exceeded.

“h3 is the Rust HTTP/3 library from the hyperium project.”

Conclusion

The protocol provides a way to account for decoded header size but the receiving code must enforce it.

“The protocol already provides a way to account for decoded header size, but the receiving code has to enforce it.”

At a glance

A remote client can force HTTP/3 servers to use tens to thousands of times more memory than the original request.

Read the original on Foxio

React

Sign in to react and comment.

Comments (0)

Life is short. Keep it sweet. Respect others' opinions and be kind!

    Recommended next

    More decks on qpack and related topics.