Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessOpen TCP connection to forge TLS endpoint
-
DeliverySend one chunk of thousands of tiny heartbeat records
-
ExploitEach record recurses process→_update→handler on the stack
-
ExecutionCall stack exhausted, RangeError thrown
-
ImpactUncaught exception terminates Node.js process, all connections dropped
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Recursion depth limits
|
| Exploitation Conditions | Exploitable only against applications that use node-forge's own TLS stack - connections from forge.tls.createConnection(), including forge.tls.wrapSocket() and the forge.http / forge.xhr TLS connections - where received data is passed to process(). No authentication, no valid handshake, and no extension negotiation are required because heartbeat records are dispatched in every state; a single chunk under 20 KB (~2,300 records on Node.js 24) is sufficient. The decisive limiting factor for real-world impact is the host environment and wiring: in Node.js applications using the documented socket 'data' handler the uncaught exception crashes the whole process (dropping all served connections), whereas in browsers the impact is limited to the single attacked connection. The documented workaround is to wrap every connection.process() call in try/catch and, on exception, call connection.close() and destroy the socket; the vendor states the only complete fix is upgrading to 1.4.1. |
| Impact | This is a genuinely credible but bounded denial-of-service issue. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, 7.5 High) is internally consistent with the mechanism described: a remote, unauthenticated peer can send one sub-20 KB chunk of ~2,300+ tiny records over the network with no user interaction and no valid handshake, since heartbeat records are dispatched in every state before handshake negotiation. The impact is confined to availability (C:N/I:N), which matches a call-stack-exhaustion DoS. No EPSS score and no CISA KEV status were supplied, so there is no evidence of active exploitation - exploitation status is 'no public exploit identified in a KEV/active-exploitation sense,' but the vendor GHSA advisory (GHSA-hqq3-7jhf-c5jx) includes a detailed, working proof-of-concept and regression tests, so a public PoC reference exists even though it is distributed as advisory text rather than a packaged weaponized exploit. The vuln.today decision label is 'this_week' (not act_now/emergency), aligning with a high-severity availability bug that is easy to trigger but not confirmed as actively exploited. The main caveat is reach: the flaw only affects applications that use node-forge's own TLS implementation (forge.tls.createConnection and its wrappers) wired to a socket data handler - most Node.js deployments use native TLS, so the real-world exposed surface is narrower than the 7.5 score alone implies. Signals are consistent; no CVSS-versus-description conflict was found. |
| Exploit ScenarioDerived | A Node.js server uses forge.tls.createConnection() and calls connection.process(data) from a socket 'data' event, as in the documented usage. An attacker who can open a TCP connection sends a single ~40 KB chunk of thousands of 8-byte heartbeat records before any handshake; process() recurses once per record and throws RangeError: Maximum call stack size exceeded. Because the exception is uncaught in the documented wiring, the Node.js process crashes, dropping every connection it serves, and repeated chunks keep it down. A working PoC is published in the vendor advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 29, 2026
Call stack exhaustion in node-forge's TLS record processing (all versions through 1.4.0) allows a remote peer to crash or degrade applications that run forge.tls.createConnection() by sending a single chunk of thousands of tiny TLS records. Because heartbeat records are dispatched in every connection state, no authentication, valid handshake, or extension negotiation is needed - roughly 2,300 eight-byte records (under 20 KB) is enough on Node.js 24 because each record consumes another stack frame and eventually throws an uncaught RangeError. In Node.js applications wired to a socket 'data' handler, that exception terminates the whole process and drops every connection it serves, while browser-side use is limited to the single attacked connection; no confidentiality or integrity impact exists. A public proof-of-concept input (5,000 repeated heartbeat records) is documented in the vendor advisory, no CISA KEV entry or other active-exploitation reporting is present in the data, and the vendor fix is node-forge 1.4.1, which processes records iteratively.
RemediationAI
Upgrade node-forge to 1.4.1, the vendor-released fixed version, which replaces recursive record handling with a loop so stack depth no longer scales with record count; the vendor states that updating is the only complete fix, and details plus regression tests are in GHSA-hqq3-7jhf-c5jx (https://github.com/digitalbazaar/forge/security/advisories/GHSA-hqq3-7jhf-c5jx), the fix commit 817e2ce0d0f6d8a25bc9c2670615c38a9ffdc51c and the release tag https://github.com/digitalbazaar/forge/releases/tag/v1.4.1. If upgrading cannot be done immediately, the vendor-documented workaround is to wrap every call to connection.process() in try/catch and, on catching an exception, call connection.close() and destroy the underlying socket; this prevents the uncaught RangeError from taking down a Node.js process, but the trade-off is that the attacked connection is deliberately lost and, if the exception is caught without closing the connection, the connection is left partially processed and must be discarded rather than reused. Because a peer needs only a sub-20 KB chunk of heartbeat records and no handshake to trigger the recursion, reconnection and retry logic will not mitigate the condition - repeated chunks can keep a vulnerable Node.js process down - so the upgrade path should be prioritized for any service exposing node-forge TLS to untrusted peers. Note that the same fix commit also covers the related recursive-record paths (fragmented handshake messages, repeated HelloRequest messages, bulk application data records).
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in npm, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
node-forge is a pure-JavaScript implementation of TLS/SSL plus a broad crypto toolkit, widely used as the npm package node-forge (CPE cpe:2.3:a:digitalbazaar:forge). The flaw is CWE-674 (uncontrolled recursion) in lib/tls.js: c.process() buffers input and reads one record, hands it to _update(), which dispatches on record type via the ctTable handler map, and each handler - tls.handleHeartbeat, tls.handleApplicationData, tls.handleHandshake for fragmented messages, tls.handleHelloRequest and the other handshake handlers - finishes by calling c.process() again to continue with the next buffered record or the next message in the same record. Every record therefore pushes process → _update → handler onto the JavaScript call stack, and stack depth grows linearly with record count. Because ctTable maps heartbeat records to a handler in every client and server state, heartbeat records are accepted before any handshake, which is why no valid protocol flow is required to reach the recursion; fragmented handshake messages and repeated HelloRequest messages are alternate routes with the same effect. node-forge normally reports TLS protocol errors through the error callback rather than throwing, so applications do not typically guard process() with try/catch, and the resulting RangeError escapes uncaught. The patch moves record reading into a helper (_processRecord) and runs it inside a while loop in c.process(), using _processing/_processNext flags so a handler's re-entrant call without data merely signals the loop to continue; calls carrying new data are still handled immediately, preserving callback ordering and return values.
Know when Forge gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Remote, unauthenticated, low-complexity trigger via heartbeat records accepted before handshake in default use (AV:N/AC:L/PR:N/UI:N); availability-only impact from process crash (A:H, C:N/I:N).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Forge (also called node-forge) is a native implementation of Transport Layer Security in JavaScript. Prior to 1.4.1, the affected implementation used forge.tls.createConnection(), TLS record processing, process() to process the relevant input or security decision. node-forge processed received TLS records recursively, consuming one JavaScript stack frame per record in a single input chunk. A remote peer could send thousands of small records together and exhaust the call stack, causing an uncaught exception and denial of service. This issue is fixed in version 1.4.1.
Blast Radius
ecosystem impact- 6 npm packages depend on node-forge (3 direct, 3 indirect)
Ecosystem-wide dependent count for version 1.4.1.
Technical POC Analysis
CWE-674 (Uncontrolled Recursion).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A high-severity vulnerability in the node-forge TLS library (all versions up to 1.4.0) enables an unauthenticated remote attacker to crash Node.js servers by sending a small burst of malformed TLS records. This affects any Node.js application that uses forge.tls.createConnection() - including internal services, APIs, or integrations - and a single attack can terminate the process and disrupt all connections. Leadership should care because this is a trivial-to-exploit denial-of-service that could cause service outages and business disruption, though there is no risk of data theft or tampering.
Since no vendor patch is available, implement interim mitigations: enforce rate limiting on incoming TLS connections to limit the number of small records per second, use network firewalls or load balancers to drop abnormal traffic patterns, isolate vulnerable services in separate processes or containers to limit blast radius, and consider replacing node-forge with Node.js's built-in TLS module for critical services. Monitor for crashes and abnormal connection behavior to detect exploitation attempts.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
An interpretation-conflict (CWE-436) vulnerability in node-forge versions 1.3.1 and earlier enables unauthenticated atta
The package node-forge before 0.10.0 is vulnerable to Prototype Pollution via the util.setPath function. Rated high seve
RSA PKCS#1 v1.5 signature forgery in node-forge through v1.4.0 enables unauthenticated network attackers to craft signat
Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated high severi
Regular expression denial of service in node-forge's pem.decode() allows remote, unauthenticated attackers to block the
Denial of service in node-forge (Forge) 1.3.2 through 1.4.0 lets remote, unauthenticated attackers exhaust CPU time and
Denial of service in node-forge's JavaScript TLS implementation: a connection created with forge.tls.createConnection()
PKCS#12 MAC forgery and constant-key password-based decryption in node-forge 1.4.0 and earlier let anyone who does not k
Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated high severi
Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated high severi
Certificate chain validation in node-forge (Forge) through version 1.4.0 can be bypassed because the parser maps the dep
Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated medium seve
EUVD-2026-113364
GHSA-hqq3-7jhf-c5jx
NVD
CVE.org
EPSS
Exploit-DB