Security Vulnerability Report
中文
CVE-2026-33894 CVSS 7.5 HIGH

CVE-2026-33894

Published: 2026-03-27 21:17:26
Last Modified: 2026-04-17 21:16:42

Description

Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Prior to version 1.4.0, RSASSA PKCS#1 v1.5 signature verification accepts forged signatures for low public exponent keys (e=3). Attackers can forge signatures by stuffing “garbage” bytes within the ASN structure in order to construct a signature that passes verification, enabling Bleichenbacher style forgery. This issue is similar to CVE-2022-24771, but adds bytes in an addition field within the ASN structure, rather than outside of it. Additionally, forge does not validate that signatures include a minimum of 8 bytes of padding as defined by the specification, providing attackers additional space to construct Bleichenbacher forgeries. Version 1.4.0 patches the issue.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:digitalbazaar:forge:*:*:*:*:*:node.js:*:* - VULNERABLE
node-forge < 1.4.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
const forge = require('node-forge'); // Simulate a vulnerable environment check console.log('Testing node-forge version for CVE-2026-33894...'); // Conceptual PoC for demonstrating the verification flaw // In a real exploit, 'sig' would be a mathematically forged blob for e=3 keys function verifySignatureWithLowExponent publicKey, message, forgedSignature) { const md = forge.md.sha1.create(); md.update(message, 'utf8'); // The vulnerable verification logic in node-forge < 1.4.0 // would accept malformed ASN.1 structures with extra garbage bytes try { const isValid = publicKey.verify(md.digest().getBytes(), forgedSignature); if (isValid) { console.log('[+] Signature verified successfully! (Vulnerable)'); } else { console.log('[-] Signature verification failed.'); } return isValid; } catch (e) { console.log('Error during verification: ' + e.message); } } // Note: Generating the actual 'forgedSignature' bytes requires // solving the cubic root equation for the specific padding structure, // which is feasible due to the low exponent (e=3) and weak padding checks.

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-33894", "sourceIdentifier": "[email protected]", "published": "2026-03-27T21:17:25.983", "lastModified": "2026-04-17T21:16:42.030", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Forge (also called `node-forge`) is a native implementation of Transport Layer Security in JavaScript. Prior to version 1.4.0, RSASSA PKCS#1 v1.5 signature verification accepts forged signatures for low public exponent keys (e=3). Attackers can forge signatures by stuffing “garbage” bytes within the ASN structure in order to construct a signature that passes verification, enabling Bleichenbacher style forgery. This issue is similar to CVE-2022-24771, but adds bytes in an addition field within the ASN structure, rather than outside of it. Additionally, forge does not validate that signatures include a minimum of 8 bytes of padding as defined by the specification, providing attackers additional space to construct Bleichenbacher forgeries. Version 1.4.0 patches the issue."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N", "baseScore": 7.5, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "HIGH", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-20"}, {"lang": "en", "value": "CWE-347"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:digitalbazaar:forge:*:*:*:*:*:node.js:*:*", "versionEndExcluding": "1.4.0", "matchCriteriaId": "824A6B69-D102-48A0-B8F2-24DEC4D749DD"}]}]}], "references": [{"url": "https://datatracker.ietf.org/doc/html/rfc2313#section-8", "source": "[email protected]", "tags": ["Third Party Advisory"]}, {"url": "https://github.com/digitalbazaar/forge/security/advisories/GHSA-ppp5-5v6c-4jwp", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://github.com/digitalbazaar/forge/security/advisories/GHSA-ppp5-5v6c-4jwp", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://mailarchive.ietf.org/arch/msg/openpgp/5rnE9ZRN1AokBVj3VqblGlP63QE", "source": "[email protected]", "tags": ["Third Party Advisory"]}, {"url": "https://www.rfc-editor.org/rfc/rfc8017.html", "source": "[email protected]", "tags": ["Third Party Advisory"]}]}}