Skip to main content

node-forge CVE-2026-119187

| EUVDEUVD-2026-113364 HIGH
Uncontrolled Recursion (CWE-674)
2026-10-29 GitHub_M GHSA-hqq3-7jhf-c5jx
7.5
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Open TCP connection to forge TLS endpoint
  2. Delivery
    Send one chunk of thousands of tiny heartbeat records
  3. Exploit
    Each record recurses process→_update→handler on the stack
  4. Execution
    Call stack exhausted, RangeError thrown
  5. Impact
    Uncaught 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

forge < 1.4.1

Affected Packages

npm node-forge fix: 1.4.1
euvd forge fix: 1.4.1

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

Vendor (GitHub_M) PRIMARY 7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
vuln.today AI 7.5 HIGH

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).

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Lifecycle Timeline

2
Patch available
Oct 29, 2026 - 20:18 EUVD
CVE Published
Oct 29, 2026 - 19:19 cve.org
HIGH 7.5

DescriptionCVE.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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 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

Why It Matters

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.

Business Impact: High
Compensating Controls

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

EPSS Score
0.4%
Top 65% exploitable
Prevalence
Medium
node-forge is a popular npm library, but its server-side TLS feature is uncommonly used
Threat Intel
1
1 source
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
High

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

More in Forge

View all
CVE-2025-12816 HIGH POC
8.6 Nov 25

An interpretation-conflict (CWE-436) vulnerability in node-forge versions 1.3.1 and earlier enables unauthenticated atta

CVE-2020-7720 HIGH POC
7.3 Sep 01

The package node-forge before 0.10.0 is vulnerable to Prototype Pollution via the util.setPath function. Rated high seve

CVE-2026-85393 HIGH
8.7 Sep 03

RSA PKCS#1 v1.5 signature forgery in node-forge through v1.4.0 enables unauthenticated network attackers to craft signat

CVE-2025-66031 HIGH
8.7 Nov 26

Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated high severi

CVE-2026-118779 HIGH
7.5 Oct 29

Regular expression denial of service in node-forge's pem.decode() allows remote, unauthenticated attackers to block the

CVE-2026-119191 HIGH
7.5 Oct 29

Denial of service in node-forge (Forge) 1.3.2 through 1.4.0 lets remote, unauthenticated attackers exhaust CPU time and

CVE-2026-119188 HIGH
7.5 Oct 29

Denial of service in node-forge's JavaScript TLS implementation: a connection created with forge.tls.createConnection()

CVE-2026-118782 HIGH
7.5 Oct 29

PKCS#12 MAC forgery and constant-key password-based decryption in node-forge 1.4.0 and earlier let anyone who does not k

CVE-2022-24772 HIGH
7.5 Mar 18

Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated high severi

CVE-2022-24771 HIGH
7.5 Mar 18

Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated high severi

CVE-2026-119190 HIGH
7.4 Oct 29

Certificate chain validation in node-forge (Forge) through version 1.4.0 can be bypassed because the parser maps the dep

CVE-2025-66030 MEDIUM
6.3 Nov 26

Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated medium seve

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy