CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-92081

CVE-2026-92081: Denial of Service via Uncaught Exception on HTTP/2 Response Trailers in Fastify

Alon Barad
Alon Barad
Software Engineer

Oct 1, 2026·7 min read·15 visits

Executive Summary (TL;DR)

Unauthenticated remote HTTP/2 requests to Fastify endpoints utilizing response trailers trigger an uncaught validation exception in Node.js, immediately crashing the server.

A protocol validation vulnerability exists in Fastify before version 5.12.5. When serving requests over HTTP/2, Fastify unconditionally injects the forbidden Transfer-Encoding header when response trailers are used, triggering an uncaught exception in Node.js and crashing the process.

Vulnerability Overview

Fastify is an optimized web framework for the Node.js runtime environment. The framework relies on a highly structured request-response lifecycle to parse incoming payloads, execute middleware, run route handlers, and serialize outgoing responses. This architecture exposes an attack surface when specific HTTP protocol extensions are processed under mismatched transport configurations.

The vulnerability is classified under CWE-248 (Uncaught Exception) and is tracked as CVE-2026-92081. The flaw manifests when a route handler utilizes response trailers (via the reply.trailer() API) and is accessed over an active HTTP/2 connection. Under these specific circumstances, Fastify attempts to apply transport rules optimized for HTTP/1.1 to the HTTP/2 stream, leading to a fatal runtime execution failure.

The resulting impact is a complete denial of service. Because the exception is generated outside the primary execution context of the route handler, Fastify's standard request-lifecycle error catch blocks fail to intercept it. The error propagates directly to the top-level event loop of Node.js, causing the entire process to crash and forcing all active client connections to disconnect.

Root Cause Analysis

To understand the root cause of the vulnerability, the differences in trailer implementation between HTTP/1.1 and HTTP/2 must be examined. In HTTP/1.1, response trailers are headers sent after the response body payload has been fully transmitted. Because the receiver must know when the body ends and the trailers begin, HTTP/1.1 strictly mandates the use of Chunked Transfer Encoding. Fastify historically satisfied this protocol requirement by unconditionally injecting the Transfer-Encoding: chunked header into the response whenever a trailer was registered.

HTTP/2 diverges entirely from this model. It operates on a binary framing layer where headers, payload data, and trailing headers are encapsulated within dedicated frames, specifically HEADERS and DATA frames. Because the binary framing layer natively handles data boundaries, HTTP/2 does not support and explicitly forbids connection-specific headers, including Transfer-Encoding, as documented in Section 8.1.2.2 of RFC 7540 and RFC 9113.

When a client issues an HTTP/2 request to an endpoint with configured trailers, the vulnerable Fastify server processes the response and executes its end-of-send lifecycle hook. It evaluates the presence of trailers and writes Transfer-Encoding: chunked to the response headers. During the subsequent serialization process, Node.js's native http2 module inspects the outgoing headers. Upon detecting the prohibited Transfer-Encoding header, the runtime throws a synchronous ERR_HTTP2_INVALID_CONNECTION_HEADERS error.

This exception occurs during the low-level stream flush phase, which is decoupled from the synchronous execution flow of the route handler's async state machine. Consequently, the exception bypasses Fastify's internal error-routing mechanisms and bubbles up as an unhandled exception. In Node.js, an uncaught exception on the event loop triggers process termination, resulting in a denial of service.

Code-Level Analysis and Patch Review

The vulnerability is localized within the core response-finalization sequence of Fastify inside lib/reply.js. Prior to the patch, the onSendEnd function evaluated the registry of trailers and mutated the response headers without verifying the active protocol version of the underlying connection.

Below is the vulnerable logic inside lib/reply.js:

function onSendEnd (reply, payload) {
  // ...
  if (header !== '') {
    // The framework unconditionally sets chunked encoding for HTTP/1.1 trailer compatibility
    reply.header('Transfer-Encoding', 'chunked')
    reply.header('Trailer', header.trim())
  } else {
    reply[kReplyTrailers] = null
  }
  // ...
}

The fix, introduced in commit ad06a4c3fe8a944a904f38068249b18b8f552e90, introduces a protocol check using the internal helper function isHttp2Reply(reply). This utility identifies whether the active reply instance is bound to an HTTP/2 stream.

Below is the patched logic implementing the safety condition:

function onSendEnd (reply, payload) {
  // ...
  if (header !== '') {
    // HTTP/1 must use chunked encoding for trailers. HTTP/2 forbids
    // the transfer-encoding header and handles trailers natively.
    if (!isHttp2Reply(reply)) {
      reply.header('Transfer-Encoding', 'chunked')
    }
    reply.header('Trailer', header.trim())
  } else {
    reply[kReplyTrailers] = null
  }
  // ...
}

By restricting the insertion of Transfer-Encoding to non-HTTP/2 replies, the framework ensures compliance with RFC 7540 and RFC 9113. The native Node.js HTTP/2 serialization layer receives only valid headers, neutralizing the condition that triggered the runtime exception.

Exploitation Methodology

Exploitation of CVE-2026-92081 is direct and requires no authentication. The attacker must target a Fastify instance that has HTTP/2 enabled and exposes at least one route containing a call to the reply.trailer() method.

The attack vector consists of a single, standard HTTP/2 request directed to the vulnerable route. Because the error is triggered purely by the header generation on the server side, the client does not need to send a malformed payload or high-frequency requests. The payload serialization on the server automatically initiates the crash sequence upon processing the request.

The following sequence diagram outlines the progression of the attack:

When the client initiates the request, Fastify executes the route handler and schedules the trailer evaluation. Upon completion of the handler, Fastify invokes onSendEnd and appends Transfer-Encoding: chunked. When the serializing layer of the Node.js http2 module processes the headers, it encounters the invalid token, terminates the stream, and throws a validation error. The exception escapes to the process level, causing the daemon to exit immediately.

Impact Assessment

The CVSS score for this vulnerability is 5.9 (Medium) with the vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H. The attack complexity is rated as high because the vulnerability depends on specific configuration parameters: the server must actively support HTTP/2 and must expose a route using trailers.

While the attack complexity is classified as high due to these prerequisites, the severity of successful exploitation is elevated. An attacker can repeatedly send the trigger request to keep the service in a perpetual restart loop. This disrupts service delivery for all clients, drops all in-flight requests on the affected instance, and neutralizes load-balancing configurations that route traffic to the affected node.

There is no risk of confidentiality loss or integrity compromise, as the flaw does not facilitate arbitrary code execution, file system access, or memory disclosure. The impact is confined to system availability. If the process manager (such as pm2 or Kubernetes pod controller) is configured to automatically restart crashed processes, the continuous termination of the process can lead to container throttling, increased CPU utilization, and eventual deployment lockout.

Remediation and Defenses

The primary remediation for this vulnerability is upgrading Fastify to version 5.12.5 or later. This release incorporates the protocol check that prevents the injection of Transfer-Encoding on HTTP/2 connection streams.

For deployments where an immediate upgrade is not feasible, developers can apply workarounds within their application code. One approach is to wrap the execution of response trailers with a check on the request's HTTP version. If the connection utilizes HTTP/2, the registration of the trailer should be bypassed:

fastify.get('/vulnerable-route', (request, reply) => {
  // Apply trailers only if the connection is HTTP/1.1
  if (request.raw.httpVersion.startsWith('1.')) {
    reply.trailer('x-checksum', async () => 'computed-hash')
  }
  return { status: 'success' }
})

Alternatively, if HTTP/2 functionality is not explicitly required by the business logic, the feature can be disabled globally during the instantiation of the Fastify server by setting the http2 parameter to false:

const fastify = require('fastify')({ http2: false })

Security teams should also review their process manager configurations to ensure that aggressive restart strategies do not lead to resource exhaustion during active denial-of-service attempts. Implementing rate-limiting rules at the reverse proxy or Web Application Firewall (WAF) layer can help limit exposure by dropping suspicious HTTP/2 connections before they reach the backend Node.js application.

Official Patches

FastifyFix commit preventing Transfer-Encoding on HTTP/2 connections

Fix Analysis (1)

Technical Appendix

CVSS Score
5.9/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
EPSS Probability
0.41%
Top 67% most exploited

Affected Systems

Fastify

Affected Versions Detail

Product
Affected Versions
Fixed Version
Fastify
Fastify
< 5.12.55.12.5
AttributeDetail
CWE IDCWE-248
Attack VectorNetwork
CVSS Score5.9
Exploit Statuspoc
KEV StatusNot Listed
ImpactDenial of Service (DoS)

MITRE ATT&CK Mapping

T1499.004Endpoint Denial of Service: Application Denial of Service
Impact
CWE-248
Uncaught Exception

The application encounters an exception during runtime that is not handled, causing the runtime environment to terminate the process.

Known Exploits & Detection

GitHub Security AdvisoryReproduction script and advisory details outlining vulnerability flow.

Vulnerability Timeline

Vulnerability patched and Fastify version 5.12.5 released.
2026-09-16
GitHub Advisory GHSA-4mh8-r7rc-xpvc published.
2026-09-16
CVE-2026-92081 published in the National Vulnerability Database.
2026-09-16

References & Sources

  • [1]GHSA-4mh8-r7rc-xpvc
  • [2]Fastify Patch Commit ad06a4c
  • [3]Fastify Release v5.12.5
  • [4]NVD CVE-2026-92081
  • [5]CVE.org CVE-2026-92081

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 15 hours ago•CVE-2026-128087
3.7

CVE-2026-128087: Premature Key Exchange Callback Invocation Prior to Host Key Verification in russh

CVE-2026-128087 (GHSA-9264-jvgf-6w2f) is an incorrect behavior order (CWE-696) and improper authorization (CWE-863) vulnerability in the russh Rust SSH library, affecting versions 0.55.0 through 0.65.0. During the initial SSH key exchange (KEX) handshake, the client state machine invokes the client::Handler::kex_done() callback—providing the negotiated raw shared secret bytes—prior to validating the remote server's host key or certificate via check_server_key(). Consequently, an untrusted or rogue SSH server can complete cryptographic key agreement and force a connecting client to execute side-effecting application logic inside kex_done() before the server's identity is checked and rejected.

Amit Schendel
Amit Schendel
4 views•10 min read
•about 16 hours ago•CVE-2026-128082
7.5

CVE-2026-128082: Uncontrolled Recursion and Denial of Service in AutoMapper via Constructor Parameter Mapping

CVE-2026-128082 (GHSA-6vhm-j9h7-f9gh) is an uncontrolled recursion vulnerability (CWE-674) in AutoMapper, a convention-based object-object mapper for .NET. When mapping nested or self-referential types into destination models that rely on parameterized constructors, C# positional records, or recursive ConstructUsing expressions, AutoMapper evaluates child constructor arguments prior to incrementing the parent's recursion depth counter. This ordering flaw bypasses both explicit MaxDepth limits and the default depth limit of 64. An unauthenticated remote attacker can supply deeply nested input payloads to affected endpoints, exhausting the thread call stack and triggering an uncatchable System.StackOverflowException that terminates the hosting .NET process.

Amit Schendel
Amit Schendel
7 views•11 min read
•about 17 hours ago•CVE-2026-128080
5.8

CVE-2026-128080: Sensitive Query Parameter Disclosure on Incoming Server Spans in OpenTelemetry JavaScript (@opentelemetry/instrumentation-http)

An information exposure vulnerability in the @opentelemetry/instrumentation-http package for OpenTelemetry JavaScript versions 0.204.0 prior to 0.222.0 causes incoming HTTP server spans to record raw, unredacted query string parameters under the url.query attribute. While outgoing client spans applied built-in and user-configured query parameter redaction, incoming server spans bypassed this sanitization completely, resulting in the transmission of sensitive credentials such as pre-signed cloud URLs and API tokens to external observability backends.

Alon Barad
Alon Barad
6 views•10 min read
•about 18 hours ago•CVE-2026-128089
7.5

CVE-2026-128089: Uncontrolled Resource Consumption in dnspython WKS Record Parser

CVE-2026-128089 is an uncontrolled resource consumption vulnerability in the dnspython toolkit for Python, affecting all versions prior to 2.9.2. When parsing Well-Known Service (WKS) records from text via dns.rdtypes.IN.WKS.WKS.from_text(), the parser fails to validate that numeric service port identifiers fall within the RFC 1035 valid range of 0 through 65535. An attacker capable of supplying untrusted zone files or RDATA text strings containing an arbitrarily large service port integer can force the parser to allocate an unbounded bitmap array using an inefficient linear append loop, resulting in severe CPU exhaustion, application hangs, or Out-Of-Memory (OOM) process termination.

Amit Schendel
Amit Schendel
6 views•10 min read
•about 19 hours ago•CVE-2026-126347
3.1

CVE-2026-126347: Open Redirect via Triple-Slash Redirect Paths in Tornado RedirectHandler

CVE-2026-126347 (GHSA-5cjw-f85j-cv6r) is an open redirect vulnerability (CWE-601) in Tornado, an asynchronous Python networking library and web framework. The flaw resides in tornado.web.RedirectHandler when dynamic URL redirection templates incorporate unvalidated user input. Due to a parser differential between RFC 3986 (used by Python's urllib.parse.urlsplit) and the WHATWG URL Standard (used by modern web browsers), inputs containing three or more leading slashes bypass Tornado 6.6.0's validation logic, allowing unauthenticated attackers to redirect users to arbitrary external domains.

Alon Barad
Alon Barad
7 views•11 min read
•about 20 hours ago•CVE-2026-128123
5.9

CVE-2026-128123: Uncaught Exception and Denial of Service in SvelteKit @sveltejs/adapter-node

A Denial of Service (DoS) vulnerability exists in @sveltejs/adapter-node versions 5.5.7 and 6.0.0-next.0 through 6.0.0. When a SvelteKit server route returns a direct response from a fetch() call with a Content-Type of text/event-stream, the Node.js adapter attempts to mutate the response headers to disable proxy buffering. Because headers returned directly by the WHATWG Fetch API carry an immutable guard, this mutation throws an unhandled TypeError, terminating the underlying Node.js process and denying service to all active and subsequent clients.

Alon Barad
Alon Barad
5 views•9 min read