Miggo Logo

CVE-2025-59530: quic-go: Panic occurs when queuing undecryptable packets after handshake completion

7.5

CVSS Score
3.1

Basic Information

EPSS Score
-
Published
10/10/2025
Updated
10/10/2025
KEV Status
No
Technology
TechnologyGo

Technical Details

CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Package NameEcosystemVulnerable VersionsFirst Patched Version
github.com/quic-go/quic-gogo< 0.49.10.49.1
github.com/quic-go/quic-gogo>= 0.50.0, < 0.54.10.54.1

Vulnerability Intelligence
Miggo AIMiggo AI

Miggo AIRoot Cause Analysis

The vulnerability exists in the handleHandshakeConfirmed function in connection.go. When a QUIC client receives a HANDSHAKE_DONE frame from the server, this function is called to finalize the handshake and drop the now-unnecessary handshake encryption keys. However, a malicious or misbehaving server can send this frame before the handshake is truly complete from the client's perspective. In this scenario, the client might still have packets encrypted with the initial keys in its processing queue. The vulnerable version of handleHandshakeConfirmed only dropped the handshake keys. A subsequent check in the code asserts that no packets should be queued after the handshake is confirmed, which would fail because of the remaining initial packets, causing the client process to crash. The patch fixes this by ensuring that handleHandshakeConfirmed also drops any remaining initial keys, thus preventing the assertion failure and the resulting denial of service.

Vulnerable functions

(*Conn).handleHandshakeConfirmed
connection.go
A misbehaving or malicious server can send a premature HANDSHAKE_DONE frame, which triggers the `handleHandshakeConfirmed` function. Before the patch, this function only dropped handshake keys. If initial packets were still in the queue, a subsequent assertion that no packets are queued after the handshake would fail, causing a panic. The function was vulnerable because it didn't properly handle the state transition when receiving a premature HANDSHAKE_DONE frame.

WAF Protection Rules

WAF Rule

## Summ*ry * mis****vin* or m*li*ious s*rv*r **n tri***r *n *ss*rtion in * qui*-*o *li*nt (*n* *r*s* t** pro**ss) *y s*n*in* * pr*m*tur* **N*S**K*_*ON* *r*m* *urin* t** **n*s**k*. ## Imp**t * mis****vin* or m*li*ious s*rv*r **n **us* * **ni*l-o*-s

Reasoning

T** vuln*r**ility *xists in t** `**n*l***n*s**k**on*irm**` *un*tion in `*onn**tion.*o`. W**n * QUI* *li*nt r***iv*s * `**N*S**K*_*ON*` *r*m* *rom t** s*rv*r, t*is *un*tion is **ll** to *in*liz* t** **n*s**k* *n* *rop t** now-unn***ss*ry **n*s**k* *n*