Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit or modify ciphertext input
-
DeliverySupply malformed PKCS#7 padding block
-
Exploitnode-forge unpad accepts invalid padding
-
ExecutionUp to four plaintext blocks silently removed
-
ImpactApplication treats truncated data as valid
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V2 - Validation and Business Logic Input validation, allowlisting
|
| Exploitation Conditions | Exploitation requires an application that (1) uses node-forge 1.4.0 or earlier to decrypt attacker-influenced data in CBC or ECB mode (including PKCS#7 EncryptedData/EnvelopedData, PKCS#12, and encrypted private keys) and (2) relies on a successful decipher.finish() as evidence that padding - and therefore the data - is valid. The attacker must be able to modify or supply the ciphertext. Limiting factors: impact is integrity-only (no confidentiality or availability), the vulnerable code path is PKCS#7 unpadding, and because CBC/ECB without a MAC are already malleable the extra capability gained is small; AC:H reflects that the attacker needs ciphertext control and the resulting effect is bounded to silently removing up to four plaintext blocks. The fix does not defend against padding-oracle attacks, so authenticating ciphertext (HMAC) or using AES-GCM remains necessary per the vendor. |
| Impact | This is a genuinely low-priority issue, and the multiple signals agree rather than conflict. The CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N = 3.7 Low) describes a network-reachable but high-complexity flaw with no confidentiality or availability impact and only Low integrity impact. The vuln.today decision label is 'monitor', the GitHub/vendor severity is LOW, and the vendor itself stresses that CBC and ECB without a MAC are already malleable, so the additional capability this bug grants an attacker is small. No EPSS score and no KEV listing were provided; the input gives no evidence of active exploitation. A proof-of-concept does exist in the vendor's GHSA advisory (a working node-forge snippet plus Wycheproof-derived test vectors), but PoC availability is a distinct signal from exploitation and should not be read as in-the-wild use. The one nuance worth flagging: the vendor also computed a CVSS 4.0 vector of 6.3 (Moderate) because 4.0 weights integrity more heavily, while the authoritative rating follows CVSS 3.1 at Low - so the apparent '3.7 vs 6.3' gap is a scoring-framework difference, not a dispute about impact. Net: a real correctness/integrity defect worth patching on a normal cadence, not an emergency. |
| Exploit ScenarioDerived | An application uses node-forge to decrypt attacker-supplied AES or DES data in CBC or ECB mode and treats a successful decipher.finish() as proof the data was well-formed. An attacker who can modify or submit ciphertext sends a block with malformed PKCS#7 padding (for example a zero count, an oversized count, or mismatched padding bytes); node-forge 1.4.0 accepts it and silently strips up to four trailing plaintext blocks, so the application processes truncated/malformed data as valid. A working proof-of-concept is published in the vendor's GHSA advisory; exploitation complexity is high (AC:H) and impact is limited to integrity. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 29, 2026
CBC and ECB decryption in node-forge 1.4.0 and earlier accepts malformed PKCS#7 padding, so an application that treats a successful decipher.finish() as proof of valid data can accept tampered ciphertext with up to four blocks of trailing plaintext silently removed. Affected are npm users of the digitalbazaar/forge package who decrypt attacker-influenced data in CBC or ECB mode, including PKCS#7 EncryptedData/EnvelopedData, PKCS#12 and encrypted private keys; impact is integrity-only (CVSS 3.1 3.7, AC:H, no confidentiality or availability effect) because CBC/ECB without a MAC are already malleable. The flaw is fixed in 1.4.1, and the vendor advisory publishes a short proof-of-concept decrypt snippet showing a Wycheproof invalid vector returning true on 1.4.0 and false on 1.4.1; it demonstrates the padding acceptance but gives no remote attack path, so no active exploitation is indicated by the available data.
RemediationAI
Vendor-released patch: node-forge 1.4.1 - upgrade to it, as the fix now requires a padding count between 1 and the block size and checks every padding byte (see https://github.com/digitalbazaar/forge/releases/tag/v1.4.1 and the GHSA at https://github.com/digitalbazaar/forge/security/advisories/GHSA-2vgq-wchc-25w7). Where upgrading cannot be done immediately, the advisory's 1.4.0 workaround is to set decipher.mode.unpad = false before finish() and validate the padding in application code yourself; the trade-off is that you take over all padding error handling and must not reintroduce the same last-byte-only check. Independently of the patch, authenticate CBC/ECB ciphertext (for example with an HMAC) before decrypting it or move to AES-GCM, since the vendor states this fix does not protect against padding-oracle attacks and unauthenticated CBC/ECB never provides integrity. Teams upgrading should also expect a compatibility break: data using ANSI X.923, ISO 10126 or XML Encryption padding no longer decrypts with default unpadding and must be handled with unpad = false plus application-side padding removal.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in 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 and related crypto primitives. The bug lives in modes.cbc.prototype.unpad() and modes.ecb.prototype.unpad() in lib/cipherModes.js: the routines read the last decrypted byte as the PKCS#7 padding count, rejected it only when it exceeded blockSize << 2 (64 bytes for AES, 32 for DES), and then dropped that many bytes. They did not reject a count of zero or a count larger than one block, and did not verify that every padding byte equals the count as RFC 5652 section 6.3 requires - the root cause class is CWE-20 (improper input validation), which the advisory additionally maps to CWE-354 (improper validation of integrity check value). Against the Wycheproof AES-CBC-PKCS5 vectors, 69 of 144 invalid vectors decrypted successfully on 1.4.0. Because oversized counts were honoured, up to four blocks of plaintext could be truncated; the concrete accepted cases include a final block ending in 03 02 01 04 (four bytes removed), a zero count, and a 0x20 count on a 16-byte block (32 bytes removed). The vendor stresses that this fix does not address padding-oracle attacks: unauthenticated CBC/ECB remains malleable, so ciphertext must be MACed (e.g. HMAC) or AES-GCM used. A notable behavioural side effect is that ANSI X.923, ISO 10126 and XML Encryption padding, which previously 'worked' because only the last byte was read, now fail with default unpadding.
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:N/I:L/A:N
Network-delivered ciphertext (AV:N) with no auth (PR:N); AC:H because attacker needs ciphertext control and the malleability gain is small; integrity-only, so C:N/A:N and I:L.
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 decipher.finish(), CBC and ECB modes, PKCS#7 padding to process the relevant input or security decision. node-forge validated only the final byte of PKCS#7 padding during CBC and ECB decryption and accepted zero, oversized, or mismatched padding bytes. Malformed ciphertext could consequently be accepted and up to four plaintext blocks could be silently removed, causing an integrity failure in applications that treated successful decryption as proof of valid padding. This issue is fixed in version 1.4.1.
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
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
Certificate chain validation in node-forge (Forge) through version 1.4.0 can be bypassed because the parser maps the dep
EUVD-2026-113333
NVD
CVE.org
EPSS
GitHub
Exploit-DB