Jun 16, 2026·6 min read·2 visits
A cryptographic flaw in Netty's default QUIC Connection ID generator leaks secret Stateless Reset Tokens into unencrypted packet headers, allowing on-path attackers to inject spoofed resets and terminate active client sessions.
CVE-2026-50009 is a cryptographic design vulnerability in the Netty network application framework. Prior to version 4.2.15.Final, the framework's QUIC protocol implementation fails to cryptographically segregate the generated Connection IDs and the associated Stateless Reset Tokens. An on-path network attacker who sniffs traffic during a Connection ID rotation can extract secret token material from cleartext headers, enabling them to inject spoofed reset packets and terminate active connections.
CVE-2026-50009 describes a cryptographic design flaw in the Netty network application framework. The vulnerability specifically affects the QUIC transport protocol implementation when configured with default HMAC-based Connection ID (CID) and stateless reset token generators. Under specific network conditions, the 16-byte Stateless Reset Token is exposed directly on the network path.
In the QUIC protocol, a stateless reset token must remain secret to prevent unauthorized connection teardowns. The flaw in Netty prior to version 4.2.15.Final permits an on-path attacker to observe rotated CID headers and reconstruct or extract the associated Stateless Reset Token. With this token, the attacker can construct a spoofed Stateless Reset packet to terminate the session.
The vulnerability is classified under CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) and CWE-330 (Use of Insufficiently Random Values). It presents a vector for targeted Denial of Service (DoS) attacks against active QUIC sessions. The vulnerability has been resolved in Netty version 4.2.15.Final.
The root cause of CVE-2026-50009 lies in the cryptographic generation logic of the Connection IDs and Stateless Reset Tokens. In a secure QUIC implementation, these two values must be cryptographically independent. This independence is typically achieved by using distinct cryptographic keys or separate Key Derivation Function (KDF) paths.
Prior to version 4.2.15.Final, Netty's default HMAC-based CID and stateless reset token generator did not maintain this cryptographic segregation. The implementation reuse of the underlying HMAC state or overlapping input parameters resulted in a direct cryptographic relationship between the two outputs.
Specifically, when a source Connection ID rotation occurs, key material representing the active Stateless Reset Token is embedded within the cleartext bytes of the newly rotated Connection ID. Because QUIC packet public headers are transmitted unencrypted to facilitate routing, an observer on the network path can easily capture these headers. This on-path observer can then extract the exposed bytes and compute the associated 16-byte Stateless Reset Token.
The vulnerable implementation failed to isolate the key derivation paths for Connection IDs and Stateless Reset Tokens. Below is a conceptual representation of the vulnerable generation logic contrasted with the corrected implementation.
In the vulnerable implementation, the same HMAC context is reused without adequate differentiation:
// VULNERABLE
public byte[] generateResetToken(byte[] connectionId) {
// Both CID and token share the same key and derivation path
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey);
byte[] output = mac.doFinal(connectionId);
// The first 16 bytes are used as the token, while subsequent rotations leak state
return Arrays.copyOf(output, 16);
}The fix implemented in Netty 4.2.15.Final introduces strict separation using separate HKDF info labels or independent keys. This ensures that the generated Connection ID does not leak information regarding the stateless reset token:
// PATCHED
public byte[] generateResetToken(byte[] connectionId) {
Mac mac = Mac.getInstance("HmacSHA256");
// Separate key or distinct domain separation prefix is utilized
mac.init(tokenDerivationKey);
mac.update(RESET_TOKEN_PREFIX);
byte[] output = mac.doFinal(connectionId);
return Arrays.copyOf(output, 16);
}This modification ensures that the output is cryptographically decoupled from the public Connection ID, preventing an observer from deriving the secret token from sniffed packet headers.
Exploitation of CVE-2026-50009 requires the attacker to occupy an on-path position, enabling them to sniff and inject network traffic between the target client and the Netty server. An off-path attacker cannot exploit this vulnerability because they cannot intercept the unencrypted QUIC headers containing the rotated Connection ID.
To execute the attack, the adversary first monitors the connection to detect a Connection ID rotation event. Upon identifying the rotation, the attacker extracts the destination Connection ID from the cleartext QUIC header. Using the mathematical relationship present in the vulnerable HMAC generation algorithm, the attacker extracts the bytes of the active Stateless Reset Token.
Once the token is derived, the attacker constructs a standard QUIC Stateless Reset packet. This packet contains a short header and terminates with the 16-byte Stateless Reset Token. The attacker then transmits this packet to the client, spoofing the source IP address of the Netty server. The client validates the token and immediately terminates the active connection.
The primary impact of CVE-2026-50009 is a targeted Denial of Service (DoS) against individual active QUIC sessions. An attacker can forcefully terminate connections of monitored users without needing credentials or authentication. The vulnerability does not allow an attacker to decrypt the application payloads or execute arbitrary code.
The Common Vulnerability Scoring System (CVSS) v3.1 score is 4.8 (Medium). The vector string is CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:L. This reflects the high complexity of the attack, which requires on-path sniffing, balanced against the low confidentiality impact (disclosure of the reset token) and low availability impact (termination of individual sessions rather than server-wide crashes).
According to the Exploit Prediction Scoring System (EPSS), the probability of exploitation is currently low. There are no active exploitation campaigns or public weaponized proof-of-concepts recorded in the CISA Known Exploited Vulnerabilities catalog.
The most effective remediation is upgrading the Netty dependency to version 4.2.15.Final or later. This release addresses the vulnerability by enforcing cryptographic independence between Connection IDs and Stateless Reset Tokens using domain separation.
If upgrading is not immediately possible, administrators must implement workarounds. The primary workaround is to configure the Netty QUIC engine to use custom generators instead of the default HMAC-based CID and stateless reset token generators. The custom generator should derive Connection IDs and Stateless Reset Tokens from separate keys or distinct HKDF context parameters.
Additionally, network operators can implement anti-spoofing filters, such as BCP 38, at network boundaries. These filters can help prevent the injection of spoofed UDP packets containing the stateless reset token if they originate from outside the legitimate network path.
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:L| Product | Affected Versions | Fixed Version |
|---|---|---|
Netty Netty | >= 4.2.0.Final, < 4.2.15.Final | 4.2.15.Final |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-200, CWE-330 |
| Attack Vector | Network (AV:N) |
| CVSS Score | 4.8 (Medium) |
| EPSS Score | 0.00204 (10.32% percentile) |
| Impact | Connection Denial of Service (DoS) |
| Exploit Status | none |
| KEV Status | Not Listed |
Exposure of Sensitive Information to an Unauthorized Actor / Use of Insufficiently Random Values
A state persistence vulnerability exists in Tornado's CurlAsyncHTTPClient component where pooled pycurl.Curl handles are reused across asynchronous requests without a complete state reset. Consequently, sensitive per-request configurations, such as client TLS certificates or proxy basic authentication credentials, persist on the shared handle. This behavior leads to subsequent requests leaking these credentials to unauthorized remote servers.
CVE-2026-48748 is a denial-of-service vulnerability in Netty's HTTP/3 codec (netty-codec-http3) occurring when QPACK dynamic tables are enabled but the blocked streams limit is not explicitly configured. A bug in limit checking and a memory leak in stream tracking allow unauthenticated remote attackers to exhaust the JVM heap memory and crash the server.
A critical hostname verification bypass vulnerability exists in the Netty network application framework when configured as a TLS client. When a developer registers a custom plain X509TrustManager, Netty wraps it inside an X509TrustManagerWrapper to adapt it to the X509ExtendedTrustManager API. However, this wrapper discards the SSLEngine context, bypassing critical hostname checks. Because the wrapper is identified as an X509ExtendedTrustManager, standard cryptographic engines and Netty's OpenSSL wrappers do not re-wrap it, failing to execute any hostname validation. Consequently, clients silently accept certificates for any host, enabling unauthenticated Man-in-the-Middle (MitM) attacks.
An uncontrolled resource pre-allocation flaw in the Netty Redis codec module allows remote unauthenticated attackers to cause a denial of service (OutOfMemoryError) by sending a crafted Redis Serialization Protocol (RESP) array header.
CVE-2026-50020 is a medium-severity HTTP Request Smuggling/Response Smuggling vulnerability (CWE-444) within the Netty asynchronous network application framework. The flaw resides in Netty's HTTP codec implementation, specifically the HttpObjectDecoder class, which silently consumes arbitrary ISO control bytes preceding the first request line.
CVE-2026-50560 describes a vulnerability in Netty's HTTP/2 codec implementation. When acting as an intermediary (such as a reverse proxy, API gateway, or edge server), Netty can be forced into an application-level Denial-of-Service condition. The attack is triggered by negotiating a restrictive SETTINGS_MAX_HEADER_LIST_SIZE from the client, causing Netty to process incoming requests fully, but subsequently crash or abort during outbound response serialization. This results in an asymmetrical consumption of resources on backend systems and thread starvation within the Netty event loop.