Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit CSR with forged deprecated-OID basicConstraints
-
DeliveryTrusted CA copies extension into issued cert
-
ExploitChain verification reads forged cA TRUE
-
ExecutionCert accepted as CA by node-forge
-
PersistSign leaf certs for arbitrary names
-
ImpactImpersonate TLS peer and intercept traffic
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V12 - Secure Communication Certificate validation
|
| Exploitation Conditions | Exploitation requires that the victim application verify certificate chains with forge.pki.verifyCertificateChain() (including TLS peer verification via forge.tls) on a vulnerable version (<= 1.4.0). The attacker must obtain, from a CA already trusted by that application, a certificate carrying an attacker-supplied deprecated-OID extension (2.5.29.10 or 2.5.29.13) encoding basicConstraints cA TRUE, placed before the genuine 2.5.29.19 cA:FALSE extension - in practice this means the CA copies extensions from certificate signing requests (e.g. openssl x509 -req -copy_extensions copy/copyall with basicConstraints=CA:FALSE and no keyUsage). Key limiting factors: the attack fails if the issuing CA adds a keyUsage extension without keyCertSign (node-forge then rejects the chain), and it depends entirely on the trusted CA's willingness to copy unrecognized/unvetted extensions, so CAs that strip or do not copy CSR extensions are not exploitable. No limitation from user interaction or victim-side authentication applies (PR:N/UI:N), but the CA-cooperation requirement is the dominant constraint. |
| Impact | This is a genuine but conditionally-gated certificate-validation flaw, not a trivially exploitable remote bug. The CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N, 7.4 High) correctly captures the tension: network-reachable and requiring no attacker privileges against the victim (PR:N), but high attack complexity (AC:H) because exploitation depends on a trusted CA being induced to issue the malicious certificate. The vendor's informational CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:N, 9.1) scores higher only because 4.0 moves the precondition into the separate Attack Requirements metric (AT:P) rather than inflating complexity; the advisory explicitly states the official rating follows 3.1. No EPSS score and no KEV status were provided in the input, so there is no evidence of active exploitation - the vuln.today Decision label is 'this_week' (prioritized, but not act_now/emergency). A working proof-of-concept exists (the fix commit adds the reporter's PoC as tests/pocs/ghsa-5x38-2vff-x55p.js plus regression tests), which raises practical risk above a theoretical finding. Net: a real priority for anyone whose application verifies TLS/X.509 chains with node-forge, but the hard dependency on a cooperating/misconfigured CA that copies CSR extensions keeps real-world exploitation targeted rather than mass-scannable. |
| Exploit ScenarioDerived | An attacker submits a CSR to a CA trusted by the victim application that copies unrecognized extensions from requests (e.g. OpenSSL with -copy_extensions copy), embedding a deprecated-OID (2.5.29.10 or 2.5.29.13) basicConstraints extension with cA TRUE before the genuine cA:FALSE extension and omitting keyUsage. node-forge's verifyCertificateChain() reads the first 'basicConstraints'-named extension and accepts the end-entity cert as a CA, so the attacker uses its key to mint certificates for any hostname and impersonate TLS servers or clients to intercept traffic. A working PoC is published in the advisory and committed as a regression test, so the technique is fully documented. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 29, 2026
Certificate chain validation in node-forge (Forge) through version 1.4.0 can be bypassed because the parser maps the deprecated extension OIDs 2.5.29.10 and 2.5.29.13 to the same 'basicConstraints' name as the RFC 5280 OID 2.5.29.19, and forge.pki.verifyCertificateChain() looked the extension up by name, returning the first match. An attacker who obtains a certificate from a trusted CA that copies request extensions can prepend a forged deprecated-OID basicConstraints with cA TRUE ahead of the genuine cA FALSE extension, have the certificate treated as a CA, and then issue certificates for arbitrary names - enabling server or client impersonation in forge.tls and any application using the library's PKI verification. The flaw is remotely reachable without authentication or user interaction (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N, 7.4 High), with the high attack complexity reflecting the reliance on a cooperating trusted CA; no CISA KEV entry is present in the provided data, but a proof-of-concept is published in the upstream repository's test suite (tests/pocs/ghsa-5x38-2vff-x55p.js).
RemediationAI
Upgrade node-forge to 1.4.1 or later, which is the release where verifyCertificateChain() resolves basicConstraints strictly by OID 2.5.29.19 (commit 58c06bc251856b409c30ecb35a93f5f6c9bbc84a; release notes at https://github.com/digitalbazaar/forge/releases/tag/v1.4.1, advisory at https://github.com/digitalbazaar/forge/security/advisories/GHSA-5x38-2vff-x55p). The vendor states there are no workarounds inside node-forge itself; applications that pass an options.verify callback to pki.verifyCertificateChain() (or verify to forge.tls.createConnection()) can compensate by rejecting any chain in which a non-leaf certificate lacks a 2.5.29.19 extension with cA TRUE, for example via cert.getExtension({id: '2.5.29.19'}) - trade-off: this reimplements part of the validation logic and must be maintained until the library is upgraded, and callbacks that mis-handle errors or throw differently can change existing trust decisions. On the issuing side, CA operators can reduce exposure by not copying unrecognized extensions from certificate signing requests, and CAs that add a keyUsage extension without keyCertSign cause node-forge to reject such chains - trade-off: relying on CA-side behavior is outside the application's control and cannot be verified for every trust anchor in a store.
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 implements X.509/TLS in JavaScript. In lib/oids.js the table maps the legacy extension OIDs 2.5.29.10 and 2.5.29.13 to the name 'basicConstraints', identical to the RFC 5280 extension id-ce 19 (2.5.29.19). Because certificateExtensionFromAsn1() in lib/x509.js decodes extensions by name, all three OIDs are decoded into the same cA and pathLenConstraint fields, and cert.getExtension('basicConstraints') returns the first extension whose name matches. The vulnerable verifyCertificateChain() used that name-based lookup, so a certificate carrying a deprecated-OID extension with cA TRUE ahead of the genuine 2.5.29.19 cA FALSE extension passed the CA check, and the same ordering could mask a CA certificate's pathLenConstraint; a deprecated-OID extension on its own also satisfied the presence check introduced for CVE-2026-33896 (GHSA-2328-f5f3-gj25, fixed in 1.4.0). This is a certificate validation failure (CWE-295) rooted in ambiguous interpretation of the same data (CWE-436): RFC 5280 section 4.2.1.9 defines basicConstraints only as OID 2.5.29.19, and the path validation steps in section 6.1.4 apply to that extension alone. The fix narrows the verification lookup to cert.getExtension({id: '2.5.29.19'}); certificate parsing, the OID table and name-based getExtension calls are deliberately left unchanged. Exploitability hinges on the issuing CA copying unrecognized extensions from a CSR (for example openssl x509 -req -copy_extensions copy with basicConstraints=CA:FALSE and no keyUsage); if the CA injects a keyUsage extension without keyCertSign, node-forge rejects the chain.
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:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Network-reachable chain verification with no victim privileges (PR:N), but AC:H because success depends on a trusted CA copying attacker extensions; impersonation breaks confidentiality and integrity, not availability.
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, node-forge parsed deprecated extension OIDs 2.5.29.10 and 2.5.29.13 as basicConstraints, and pki.verifyCertificateChain() used the first extension with that name. Exploitation requires a CA trusted by the application to issue a certificate carrying an attacker-supplied deprecated-OID extension, commonly because the CA copies extensions from a certificate signing request. By placing a permissive deprecated extension before the genuine 2.5.29.19 basicConstraints extension, the certificate holder could have the certificate accepted as a CA and issue certificates for arbitrary names, enabling server or client impersonation. If the issuing CA adds a keyUsage extension without keyCertSign, node-forge rejects the chain. 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-295 (Improper Certificate Validation), with a secondary interpretation conflict (CWE-436) between the OID table and the path validation logic.
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 flaw in node-forge, a widely used JavaScript library for TLS and certificate handling, allows attackers to bypass certificate validation and impersonate trusted servers or clients. This puts any organization relying on node-forge for secure communications at risk of man-in-the-middle attacks, potentially leading to data breaches or unauthorized access to sensitive systems. Leadership should prioritize remediation because the vulnerability affects mission-critical encryption and trust mechanisms, and no vendor patch is currently available.
No vendor-released patch identified at time of analysis. Interim mitigations: implement certificate pinning or custom validation to ignore deprecated OIDs 2.5.29.10 and 2.5.29.13; enforce strict certificate policies; monitor for suspicious certificate chains; restrict use of node-forge in high-risk environments until a patch is available.
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
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
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()
Call stack exhaustion in node-forge's TLS record processing (all versions through 1.4.0) allows a remote peer to crash o
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
Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Rated medium seve
EUVD-2026-113347
GHSA-5x38-2vff-x55p
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB