Jun 15, 2026·6 min read·21 visits
An unauthenticated remote attacker can cause a Denial-of-Service condition in Netty-based HTTP/2 servers by negotiating a very low max header list size. This forces server-side exceptions and stream resets during outbound serialization, evading standard client-driven reset detection mechanics.
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.
The vulnerability exists in the netty-codec-http2 module, which is responsible for handling HTTP/2 frame parsing, state management, and stream multiplexing within the Netty framework.
In HTTP/2 deployments, Netty frequently serves as the edge protocol engine, receiving requests from untrusted external clients and routing them to internal backend services. This architecture creates an attack surface where an adversary can manipulate protocol-level settings to alter how Netty serializes and writes outbound data back to the client.
This specific security flaw is categorized under CWE-770 (Allocation of Resources Without Limits or Throttling). An attacker can exploit this weakness by establishing a multiplexed connection and instructing Netty to apply restrictive header list limits. The resulting system state leads to repeated processing failures, connection teardowns, and resource exhaustion.
Under the HTTP/2 specification (RFC 9113), the SETTINGS_MAX_HEADER_LIST_SIZE parameter allows a receiver to inform its peer of the maximum size of header list (in octets) it is prepared to accept. The peer is required to respect this limit when constructing response headers for the negotiated stream.
In vulnerable versions of Netty, a logic and sequencing error exists in how the outbound codec enforces this limit. When a client transmits a custom, highly restrictive SETTINGS_MAX_HEADER_LIST_SIZE value, Netty accepts the setting and updates its internal stream metadata. However, it does not validate or reject the request early based on this limit. Instead, the request is fully processed and forwarded to the upstream origin or application handler.
When the backend origin responds, Netty attempts to write the response headers back to the client. During the outbound serialization phase, the codec checks the outgoing header list size against the client's negotiated limit. Because the response headers exceed the artificially low limit set by the client, Netty's frame writer throws an unhandled local write exception. Rather than handling this mismatch gracefully, the exception triggers a stream reset or terminates the connection abruptly.
This behavior is structurally distinct from the HTTP/2 Rapid Reset vulnerability (CVE-2023-44487). In a Rapid Reset attack, the client explicitly transmits RST_STREAM frames immediately after sending headers to drive up CPU cycles. In CVE-2026-50560, the client never sends a reset frame. Instead, the server-side proxy performs the resource-intensive request processing and backend forwarding, only to fail internally when serializing the response, forcing the server itself to initiate the teardown.
The vulnerability stems from the processing flow in Netty's HTTP/2 outbound frame writer. In vulnerable versions, the frame writer lacks defensive validation during incoming request processing to ensure the backend response can actually be transmitted back to the client.
// Conceptual depiction of the vulnerable frame writing sequence
public final class Http2OutboundFrameWriter {
public ChannelFuture writeHeaders(ChannelHandlerContext ctx, int streamId,
Http2Headers headers, int padding,
boolean endStream, ChannelPromise promise) {
// Get the client's configured max header list size
long maxHeaderListSize = connection.local().maxHeaderListSize();
long headerSize = calculateHeaderSize(headers);
if (headerSize > maxHeaderListSize) {
// Vulnerable behavior: Throws an exception deep in the outbound pipeline
// instead of dropping or refusing the request at ingestion time
Http2Exception ex = connectionError(PROTOCOL_ERROR,
"Header list size %d exceeds maximum allowed %d", headerSize, maxHeaderListSize);
promise.setFailure(ex);
throw ex;
}
return serializeAndSend(ctx, streamId, headers, padding, endStream, promise);
}
}In the patched versions, Netty improves the handling of these limits to prevent write-phase exceptions from terminating the pipeline. Additionally, proper validation and early-rejection mechanics are introduced to ensure that clients cannot force downstream resource consumption for requests that cannot be successfully answered.
To exploit this vulnerability, an attacker must establish an HTTP/2 connection with a target Netty server. The attack does not require authentication or specific network placement beyond the ability to reach the listening port.
First, the attacker transmits a SETTINGS frame specifying an extremely small SETTINGS_MAX_HEADER_LIST_SIZE (for example, 16 bytes). This frame forces the Netty server to apply this limit to all subsequent outbound responses on that connection.
Second, the attacker pipeline-sends standard requests over multiplexed streams. Because the requests themselves do not violate any ingress limits, Netty accepts them, instantiates internal stream buffers, and forwards the requests to the backend application server.
Third, as the backend application processes these requests, it consumes database connections, CPU cycles, and memory. When the backend returns standard responses (which naturally exceed the 16-byte header limit), Netty's write exception occurs. Netty discards the state and tears down the stream. The attacker can repeat this cycle continuously, causing resource exhaustion on backend servers without ever receiving or processing responses on the client side.
This technique has significant evasion potential. Security monitoring systems configured to flag high rates of client-initiated RST_STREAM frames will not detect this activity, as all stream resets are initiated internally by the server due to serialization failures.
The primary impact of CVE-2026-50560 is application-level Denial of Service (DoS). By forcing Netty to process requests that can never be completed, an attacker can saturate backend worker pools, exhaust memory allocations, and consume available network sockets.
Furthermore, because Netty's event-loop threads (EventLoopGroup) handle multiple multiplexed connections simultaneously, repeated local exceptions on these threads can lead to thread starvation. This affects not only the attacker's connection but also degrades or completely blocks legitimate traffic sharing the same EventLoop instances.
No confidentiality or integrity loss is associated with this vulnerability. However, the availability impact is rated as Low to Medium on standard metrics due to the temporary nature of the resource exhaustion, which can typically be recovered by terminating the affected Netty process or enforcing connection timeouts.
The most effective remediation is upgrading Netty dependencies to patched versions. For deployments on the 4.1.x branch, upgrade to 4.1.135.Final or later. For deployments on the 4.2.x branch, upgrade to 4.2.15.Final or later.
If upgrading is not immediately feasible, operators should implement temporary controls at the network perimeter. Configure fronting load balancers, such as NGINX, Envoy, or Cloudflare, to enforce minimum allowable values for SETTINGS_MAX_HEADER_LIST_SIZE and reject connections that negotiate values below standard operating thresholds (typically 4096 or 8192 bytes).
Additionally, implement strict connection rate-limiting and stream concurrency limits to mitigate the impact of pipelined multiplexing attacks.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L| Product | Affected Versions | Fixed Version |
|---|---|---|
Netty Netty Project | >= 4.1.0.Final, < 4.1.135.Final | 4.1.135.Final |
Netty Netty Project | >= 4.2.0.Final, < 4.2.15.Final | 4.2.15.Final |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-770 |
| Attack Vector | Network (Remote) |
| CVSS v4.0 Score | 6.9 (Medium) |
| EPSS Score | 0.00302 |
| Impact | Denial of Service (DoS) |
| Exploit Status | none |
| KEV Status | Not Listed |
The software allocates resource keys or sizes requested by an untrusted actor without verifying limits, leading to potential resource exhaustion.
CVE-2026-67427 is a capability bypass vulnerability in the Flyto2 Core workflow execution kernel. Due to a logical inconsistency in how dynamic parameters are resolved, the system evaluates environment variables via template interpolation prior to executing capability filter validation. This permits unprivileged workflow definitions to completely bypass denylist restrictions on the `env.get` module, exfiltrating critical host configurations, API tokens, and credentials via allowed communication channels.
An insecure credential forwarding vulnerability in Flyto2 Core prior to version 2.26.6 allows attackers to exfiltrate operator API keys. This occurs because the system forwards environment-derived API keys to user-controlled custom endpoints, bypassing SSRF guards designed only for private target validation.
A critical remote code execution (RCE) vulnerability exists in AWS Amplify Studio's code-generation library (@aws-amplify/codegen-ui). An authenticated attacker with permissions to create or modify component schemas can inject malicious JavaScript code into those schemas. When the Amplify CLI or the build environment processes these schemas, the unvalidated expressions are executed within the host Node.js environment, leading to full system compromise.
CVE-2026-67426 is a critical vulnerability in Flyto2 Core prior to version 2.26.7. The standalone flyto-verification service binds to all interfaces (0.0.0.0) on port 8344 and exposes an unauthenticated POST /run endpoint. This endpoint accepts an arbitrary client-controlled callback URL and makes an outbound POST request containing the sensitive internal runner secret in the headers. Attackers can exploit this to retrieve the FLYTO_RUNNER_SECRET and perform Server-Side Request Forgery (SSRF) against internal network targets.
CVE-2026-66066 (popularly known as 'KindaRails2Shell') is a critical security vulnerability in the Active Storage component of Ruby on Rails. The vulnerability arises from an insecure default integration with the libvips image processing library via the ruby-vips gem. Under default configurations, Active Storage fails to restrict untrusted format loaders within libvips, allowing remote, unauthenticated attackers to upload malformed files that leverage external dataset features to read local server files. By extracting cryptographic secrets such as SECRET_KEY_BASE from the leaked file contents, attackers can forge signed Marshal serialization payloads to achieve remote code execution.
An SSRF validation bypass exists in dssrf-js (v1.0.3 and prior) due to an improper string normalization sequence inside is_url_safe. Before validating the host using Node's WHATWG parser, the helper strips the '@' symbol. This corrupts the parser's authority resolution, while the application's client requests the original, un-sanitized string containing internal IP targets.