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



GHSA-V53P-9FQP-M79J

GHSA-V53P-9FQP-M79J: Regular Expression Denial of Service (ReDoS) in Nodemailer addressparser

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 30, 2026·6 min read·15 visits

Executive Summary (TL;DR)

A ReDoS vulnerability in Nodemailer before 10.0.6 allows unauthenticated attackers to cause a remote denial of service by sending crafted email headers that block the single-threaded Node.js event loop.

A Regular Expression Denial of Service (ReDoS) vulnerability exists in Nodemailer's addressparser fallback engine before version 10.0.6. Under specific malformed inputs with excessive word boundaries, the parser exhibits quadratic backtracking, leading to high CPU utilization and event loop blockage.

Vulnerability Overview

The vulnerability tracked under GHSA-V53P-9FQP-M79J resides in the fallback address parsing component of the popular Node.js email delivery library, Nodemailer. When strict parsing of email headers fails, the application switches to a fallback engine designed to scan unstructured text and recover potential email strings. This behavior exposes a significant attack surface because email headers often contain untrusted input supplied directly by external sources.

The vulnerable component, addressparser, uses an inefficient fallback regular expression to locate potential email formats. When processing specific malicious strings, the engine's backtracking limits are exceeded, triggering catastrophic backtracking. This causes a Regular Expression Denial of Service (ReDoS) that completely blocks the execution flow.

Because Node.js operates on a single-threaded event loop, blocking CPU execution for several seconds directly halts all concurrent processing. An unauthenticated attacker can exploit this behavior remotely to deny service to the entire application. The underlying weakness is classified under CWE-1333 (Inefficient Algorithmic Complexity) and CWE-400 (Uncontrolled Resource Consumption).

Root Cause Analysis

The root cause of the vulnerability lies in the implementation of the loose fallback search algorithm within src/addressparser/index.ts. When evaluating input, the parser executes the regular expression /\s*\b[^@\s]+@[^\s]+\b\s*/ globally across unstructured sections of email headers. The lack of an anchor (such as ^ or $) or a sticky flag (/y) forces the engine to evaluate possible matches from multiple starting positions within the string.

When the input contains sequences of non-whitespace characters separated by word boundaries but missing the @ symbol, the engine is forced into a quadratic execution path. Consider an input containing repeating characters with word boundaries, such as [x][x][x]...[x]. The regular expression engine matches the word boundary \b, greedily consumes the string using [^@\s]+, and scans to the very end of the line.

Upon failing to locate the literal @ character at the end of the line, the engine must backtrack. It drops one character at a time and attempts to match the remaining terms, failing repeatedly. Once the engine exhausts all backtracking permutations for the first starting index, it increments the index to the next word boundary and repeats the entire greedy scan and backtracking cycle. This sequence creates an $O(N^2)$ time complexity, transforming an input of only 273 kilobytes into a CPU loop that blocks execution for up to 43 seconds.

Code-Level Analysis

A comparison of the codebase before and after the patch illustrates the transition from an unbounded regular expression search to a deterministic linear-time pre-scanner. In the vulnerable version, the library relied on a simple string replacement pattern with an unconstrained regular expression:

// Vulnerable implementation in src/addressparser/index.ts
data.text[i] = data.text[i]
    .replace(/\s*\b[^@\s]+@[^\s]+\b\s*/, (match: string) => {
        // Extracts and processes matching address strings
    });

The patch, committed under SHA 437d7fc47403df176bc39271641541b7a9bce102, replaces this pattern entirely. The developer introduced a manual index searcher, _looseAddressStart, which scans the string character-by-character to locate a candidate offset in strictly $O(N)$ linear time. The regular expression itself is modified to use the sticky flag (/y), preventing arbitrary forward scanning.

// Patched implementation in src/addressparser/index.ts
const LOOSE_TEXT_ADDR = /\s*\b[^@\s]+@[^\s]+\b\s*/y; // Note the sticky flag
 
const part: string = data.text[i];
let remainder = part;
 
const at = _looseAddressStart(part); // O(N) pre-scanner determines candidate start
if (at >= 0) {
    LOOSE_TEXT_ADDR.lastIndex = at; // Restrict search to exact offset
    const match = LOOSE_TEXT_ADDR.exec(part);
    if (match) {
        data.address = [match[0].trim()];
        extracted = true;
        remainder = part.slice(0, at) + ' ' + part.slice(at + match[0].length);
    }
}
data.text[i] = remainder.trim();

By implementing _looseAddressStart, the parser avoids activating the regular expression engine unless a valid candidate offset is verified. If the pre-scanner fails to find a valid @ candidate bounded by appropriate characters, the search aborts early without triggering the expensive backtracking engine. This completely mitigates the quadratic vulnerability.

Exploitation & Proof-of-Concept

To trigger the vulnerability, an attacker must submit a specifically formatted payload to an application endpoint that processes email headers through the addressparser module. The exploit payload relies on generating a large quantity of word boundaries without containing a valid email delimiter @. This forces the regex parser to exhaustively evaluate backtracking configurations at each boundary location.

The most reliable payload configuration involves repeating the sequence [x] multiple times to construct an extremely dense array of word boundaries. For example, generating a string containing 40,000 instances of [x] creates a payload of approximately 120 kilobytes. When this payload is sent through an unstructured email header field, it triggers immediate CPU saturation.

The exploitation does not require authentication and can be delivered via any input vectors that map directly to mail components such as To, From, or Cc. In typical production systems, receiving an inbound email message with these malformed headers causes the mail processor thread to hang indefinitely. This blocks any subsequent network requests and degrades the overall application availability.

Impact & Security Assessment

The security impact of GHSA-V53P-9FQP-M79J is significant due to the single-threaded nature of the Node.js runtime environment. When a CPU-bound operation like quadratic backtracking occurs, the event loop is entirely blocked, and the application cannot process incoming HTTP requests, database updates, or basic system events. This creates a highly effective denial-of-service condition with minimal resource expenditure by the attacker.

We assign this vulnerability a CVSS v3.1 base score of 7.5 (High), reflecting the vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H. The attack vector is network-based, the complexity is low, and no specialized privileges or user interactions are required to trigger the condition. The overall integrity and confidentiality of the host environment remain intact, as the exploit does not permit unauthorized read or write access.

Because Nodemailer is a fundamental dependency utilized across thousands of production Node.js applications, the downstream exposure is substantial. While no active exploitation has been documented in wild campaigns, the availability of stable proof-of-concept scripts increases the probability of opportunistic exploitation against exposed email ingestion gateways.

Remediation & Patch Verification

Remediating this vulnerability requires upgrading the nodemailer package to version 10.0.6 or later. The update completely replaces the vulnerable regex backtracking pattern with the deterministic linear pre-scanner. Development teams should audit their project lockfiles to verify that transitive dependencies do not pull in vulnerable legacy versions of the package.

If immediate patching is not feasible due to deployment freezes, security teams should implement input validation controls at the network perimeter. Configuring a Web Application Firewall (WAF) or API gateway to enforce length restrictions on incoming email header fields provides effective temporary mitigation. A strict limit of 4096 bytes on structured headers will disrupt the execution of the quadratic exploit payload.

Additionally, developers can implement a runtime input pre-filtering mechanism to intercept large unstructured blocks before they are evaluated by the parser. Stripping out excessive special character patterns or rejecting inputs with high frequencies of non-alphanumeric transitions can reduce the risk of denial of service. However, these temporary workarounds should not replace the official package upgrade.

Fix Analysis (1)

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Affected Systems

NodemailerNode.js applications processing emails

Affected Versions Detail

Product
Affected Versions
Fixed Version
nodemailer
nodemailer
< 10.0.610.0.6
AttributeDetail
CWE IDCWE-1333
Attack VectorNetwork (AV:N)
CVSS Score7.5 (High)
ImpactRemote Denial of Service (DoS)
Exploit StatusProof-of-Concept (PoC)
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499.003Endpoint Denial of Service: Application Complexity Exploitation
Impact
CWE-1333
Inefficient Algorithmic Complexity

The product uses a regular expression that can be made to perform extremely inefficient backtracking when processing certain inputs.

Known Exploits & Detection

GitHub AdvisoryDocumented vulnerability disclosure with structural ReDoS payload patterns and benchmark stats.

Vulnerability Timeline

Vulnerability identified in Nodemailer's loose fallback address parser
2026-09-11
Commit 437d7fc47403df176bc39271641541b7a9bce102 pushed to GitHub resolving the issue
2026-09-11
Official release tag v10.0.6 published containing the fix
2026-09-11
GitHub Advisory Database entry published under identifier GHSA-V53P-9FQP-M79J
2026-09-11

References & Sources

  • [1]GitHub Advisory Database: GHSA-V53P-9FQP-M79J
  • [2]Nodemailer Release v10.0.6
  • [3]Official Fix Commit

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 13 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 14 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 15 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 16 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 17 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 18 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