{"id":"CVE-2026-125336","kind":"vulnerability","aliases":["CVE-2026-125336"],"related":[],"title":"node-forge: certificate chain check skips name constraints, allowing impersonation","description":"Forge (also called node-forge) is a native implementation of Transport Layer Security in JavaScript. Prior to 1.4.3, pki.verifyCertificateChain() in lib/x509.js does not decode or enforce the X.509 nameConstraints extension while validating certificate paths. A name-constrained certificate authority with a non-critical extension can therefore issue a leaf certificate with a subjectAltName dNSName or subject commonName outside a permitted subtree or inside an excluded subtree, and node-forge accepts the chain. Exploitation requires a name-constrained CA that chains to a trusted root and either its private key or the ability to obtain an out-of-scope certificate, allowing impersonation of names outside the delegated namespace, including against forge.tls clients. Chains without nameConstraints are not affected, and affected versions safely reject critical nameConstraints as unsupported rather than accepting them. This issue is fixed in version 1.4.3.","summary":"node-forge's certificate chain verification ignores the X.509 nameConstraints extension when the constraint is non-critical. A holder of a name-constrained CA can issue a leaf certificate for names outside the allowed namespace, and node-forge accepts it, including in forge.tls clients.","severity":"high","cvss":7.4,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["node-forge","node.js","package","tls","x509"],"not_affected_if":["no-forge-tls-or-chain-verification","no-name-constrained-cas","version-1.4.3-or-later"],"how_to_check":"- Check the installed node-forge version with `npm ls node-forge` and look for any version below `1.4.3`.\n- Search lockfiles and dependency trees for node-forge, since it is often pulled in transitively.\n- Look for use of `forge.tls` or `pki.verifyCertificateChain` in your code.","fix":"- node-forge: move to `1.4.3` or later.","status":"open","published_at":"2026-11-10T19:21:11+00:00","first_seen_at":"2026-11-10T19:25:15+00:00","triaged_at":"2026-11-10T19:47:39+00:00","updated_at":"2026-11-10T19:47:39+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-10T19:47:39Z","model":"claude-haiku-5-5","output":{"fix":"- node-forge: move to `1.4.3` or later.","reach":"network","title":"node-forge: certificate chain check skips name constraints, allowing impersonation","impact":"high","summary":"node-forge's certificate chain verification ignores the X.509 nameConstraints extension when the constraint is non-critical. A holder of a name-constrained CA can issue a leaf certificate for names outside the allowed namespace, and node-forge accepts it, including in forge.tls clients.","audience":"developers","category":"package","nicknames":[],"who_cares":["node.js","node-forge","tls","x509"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"attacker impersonates names outside the delegated namespace to clients","analyst_note":"","how_to_check":"- Check the installed node-forge version with `npm ls node-forge` and look for any version below `1.4.3`.\n- Search lockfiles and dependency trees for node-forge, since it is often pulled in transitively.\n- Look for use of `forge.tls` or `pki.verifyCertificateChain` in your code.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["version-1.4.3-or-later","no-name-constrained-cas","no-forge-tls-or-chain-verification"],"who_is_affected":"Applications that use node-forge to verify certificate chains, especially forge.tls clients, are exposed when the chain includes a CA with non-critical nameConstraints. Exploitation needs a name-constrained CA that chains to a trusted root and either its private key or a way to obtain an out-of-scope certificate. Chains without nameConstraints are not affected, and affected versions reject critical nameConstraints.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.000794,"input_tokens":4817,"output_tokens":624,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-125336':14A,17A '-2026':13A,16A '1.4.3':91C,215C 'abil':169C 'accept':67B,146C,207C 'affect':195C,197C 'allow':10A,61B,178C 'also':74C 'author':113C 'ca':51B,155C 'call':75C 'certif':4A,29B,56B,106C,112C,125C,177C 'chain':5A,30B,148C,157C,190C 'check':6A 'client':72B,189C 'commonnam':132C 'constrain':50B,111C,154C 'constraint':9A,39B 'critic':43B,118C,201C 'cve':12A,15A 'decod':97C 'deleg':184C 'dnsname':129C 'either':163C 'enforc':99C 'exclud':140C 'exploit':149C 'extens':36B,103C,119C 'fix':212C 'forg':3A,20B,27B,66B,73C,78C,145C 'forge.tls':71B,188C 'holder':45B 'ignor':32B 'imperson':11A,179C 'implement':82C 'includ':69B,186C 'insid':138C 'issu':53B,122C,210C 'javascript':88C 'key':166C 'layer':85C 'leaf':55B,124C 'lib/x509.js':94C 'name':8A,49B,58B,110C,153C,181C 'name-constrain':48B,109C,152C 'nameconstraint':35B,102C,192C,202C 'namespac':62B,185C 'nativ':81C 'node':2A,19B,26B,65B,77C,144C 'node-forg':1A,18B,25B,64B,76C,143C 'node.js':21B 'non':42B,117C 'non-crit':41B,116C 'obtain':171C 'out-of-scop':173C 'outsid':59B,133C,182C 'packag':22B 'path':107C 'permit':135C 'pki.verifycertificatechain':92C 'prior':89C 'privat':165C 'rather':205C 'reject':200C 'requir':150C 'root':161C 'safe':199C 'scope':176C 'secur':86C 'skip':7A 'subject':131C 'subjectaltnam':128C 'subtre':136C,141C 'therefor':121C 'tls':23B 'transport':84C 'trust':160C 'unsupport':204C 'valid':105C 'verif':31B 'version':198C,214C 'without':191C 'x.509':34B,101C 'x509':24B","nicknames":[],"mitigations":[],"who_affected":"Applications that use node-forge to verify certificate chains, especially forge.tls clients, are exposed when the chain includes a CA with non-critical nameConstraints. Exploitation needs a name-constrained CA that chains to a trusted root and either its private key or a way to obtain an out-of-scope certificate. Chains without nameConstraints are not affected, and affected versions reject critical nameConstraints.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["high","nodeforge","nodejs","package","tls","x509"],"campaign_type":null,"search_a":"'-125336':14A,17A '-2026':13A,16A 'allow':10A 'certif':4A 'chain':5A 'check':6A 'constraint':9A 'cve':12A,15A 'forg':3A 'imperson':11A 'name':8A 'node':2A 'node-forg':1A 'skip':7A","search_b":"'accept':67B 'allow':61B 'ca':51B 'certif':29B,56B 'chain':30B 'client':72B 'constrain':50B 'constraint':39B 'critic':43B 'extens':36B 'forg':20B,27B,66B 'forge.tls':71B 'holder':45B 'ignor':32B 'includ':69B 'issu':53B 'leaf':55B 'name':49B,58B 'name-constrain':48B 'nameconstraint':35B 'namespac':62B 'node':19B,26B,65B 'node-forg':18B,25B,64B 'node.js':21B 'non':42B 'non-crit':41B 'outsid':59B 'packag':22B 'tls':23B 'verif':31B 'x.509':34B 'x509':24B","search_c":"'1.4.3':91C,215C 'abil':169C 'accept':146C,207C 'affect':195C,197C 'allow':178C 'also':74C 'author':113C 'ca':155C 'call':75C 'certif':106C,112C,125C,177C 'chain':148C,157C,190C 'client':189C 'commonnam':132C 'constrain':111C,154C 'critic':118C,201C 'decod':97C 'deleg':184C 'dnsname':129C 'either':163C 'enforc':99C 'exclud':140C 'exploit':149C 'extens':103C,119C 'fix':212C 'forg':73C,78C,145C 'forge.tls':188C 'imperson':179C 'implement':82C 'includ':186C 'insid':138C 'issu':122C,210C 'javascript':88C 'key':166C 'layer':85C 'leaf':124C 'lib/x509.js':94C 'name':110C,153C,181C 'name-constrain':109C,152C 'nameconstraint':102C,192C,202C 'namespac':185C 'nativ':81C 'node':77C,144C 'node-forg':76C,143C 'non':117C 'non-crit':116C 'obtain':171C 'out-of-scop':173C 'outsid':133C,182C 'path':107C 'permit':135C 'pki.verifycertificatechain':92C 'prior':89C 'privat':165C 'rather':205C 'reject':200C 'requir':150C 'root':161C 'safe':199C 'scope':176C 'secur':86C 'subject':131C 'subjectaltnam':128C 'subtre':136C,141C 'therefor':121C 'transport':84C 'trust':160C 'unsupport':204C 'valid':105C 'version':198C,214C 'without':191C 'x.509':101C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-04T01:08:33+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-125336","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-125336","severity":null,"published_at":"2026-11-10T19:21:11+00:00","modified_at":"2026-11-10T19:21:11+00:00","first_seen_at":"2026-11-10T19:25:15+00:00","fetched_at":"2026-11-10T19:25:15+00:00","note":null}],"documents":[{"id":117508,"url":"https://github.com/digitalbazaar/forge/commit/6b23eae8beac316b6867bdb0e7ad7c2c959a97f6","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":117509,"url":"https://github.com/digitalbazaar/forge/commit/862aa5f630bdf40b0dfda408d6ac357bf35a7d6b","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":117497,"url":"https://github.com/digitalbazaar/forge/releases/tag/v1.4.3","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":117511,"url":"https://github.com/digitalbazaar/forge/security/advisories/GHSA-3cc4-3294-vgjf","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-11-04T01:08:33+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}