GHSA-g754-hx8w-x2g6

Suggest an improvement
Source
https://github.com/advisories/GHSA-g754-hx8w-x2g6
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/12/GHSA-g754-hx8w-x2g6/GHSA-g754-hx8w-x2g6.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-g754-hx8w-x2g6
Aliases
Downstream
Related
Published
2025-12-11T16:48:27Z
Modified
2025-12-11T22:13:30.311264Z
Severity
  • 5.3 (Medium) CVSS_V3 - CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L CVSS Calculator
Summary
quic-go HTTP/3 QPACK Header Expansion DoS
Details

Summary

An attacker can cause excessive memory allocation in quic-go's HTTP/3 client and server implementations by sending a QPACK-encoded HEADERS frame that decodes into a large header field section (many unique header names and/or large values). The implementation builds an http.Header (used on the http.Request and http.Response, respectively), while only enforcing limits on the size of the (QPACK-compressed) HEADERS frame, but not on the decoded header, leading to memory exhaustion.

Impact

A misbehaving or malicious peer can cause a denial-of-service (DoS) attack on quic-go's HTTP/3 servers or clients by triggering excessive memory allocation, potentially leading to crashes or exhaustion. It affects both servers and clients due to symmetric header construction.

Details

In HTTP/3, headers are compressed using QPACK (RFC 9204). quic-go's HTTP/3 server (and client) decodes the QPACK-encoded HEADERS frame into header fields, then constructs an http.Request (or response).

http3.Server.MaxHeaderBytes and http3.Transport.MaxResponseHeaderBytes, respectively, limit encoded HEADERS frame size (default: 1 MB server, 10 MB client), but not decoded size. A maliciously crafted HEADERS frame can expand to ~50x the encoded size using QPACK static table entries with long names / values.

RFC 9114 requires enforcing decoded field section size limits via SETTINGS, which quic-go did not do.

The Fix

quic-go now enforces RFC 9114 decoded field section size limits, sending SETTINGSMAXFIELDSECTIONSIZE and using incremental QPACK decoding to check the header size after each entry, aborting early on violations with HTTP 431 (on the server side) and stream reset (on the client side).

Database specific
{
    "github_reviewed": true,
    "nvd_published_at": "2025-12-11T21:15:54Z",
    "github_reviewed_at": "2025-12-11T16:48:27Z",
    "severity": "MODERATE",
    "cwe_ids": [
        "CWE-770"
    ]
}
References

Affected packages

Go / github.com/quic-go/quic-go

Package

Name
github.com/quic-go/quic-go
View open source insights on deps.dev
Purl
pkg:golang/github.com/quic-go/quic-go

Affected ranges

Type
SEMVER
Events
Introduced
0Unknown introduced version / All previous versions are affected
Fixed
0.57.0

Database specific

last_known_affected_version_range

"<= 0.56.0"