{"id":"GHSA-6889-vf6x-f3g5","revision":null,"records":[{"revision":"c0b61c43c4924c2fbd3fc858c1669b0a","observedAt":"2026-11-12T20:16:18.682+00:00","statement":{"source":"cve-program","id":"CVE-2026-125335","aliases":[],"title":"Forge: Ed25519 signature verification accepts small-order public keys","description":"Forge (also called node-forge) is a native implementation of Transport Layer Security in JavaScript. Prior to 1.4.3, ed25519.verify() decodes a public key in crypto_sign_open() without rejecting small-order points or their non-canonical encodings. With S = 0 and a small-order R value, an attacker who can choose the public key can produce signatures that verify for many messages, or all messages with the identity key, without a private key. This can defeat proof-of-possession, attribution, non-repudiation, or deduplication checks that rely on a signature being bound to the message. Keys produced by normal Ed25519 key generation are not small-order, so applications that verify only trusted or internally generated public keys are not affected. This issue is fixed in version 1.4.3.","state":0,"publishedAt":"2026-11-10T18:51:14.503+00:00","modifiedAt":"2026-11-12T18:02:13.877+00:00","affected":[{"ecosystem":"Vendor product","name":"forge","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"digitalbazaar\",\n                    \"product\": \"forge\",\n                    \"versions\": [\n                        {\n                            \"version\": \"< 1.4.3\",\n                            \"status\": \"affected\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 3.1","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","score":3.7,"severity":"LOW"}],"references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-6889-vf6x-f3g5","https://github.com/digitalbazaar/forge/pull/1169","https://github.com/digitalbazaar/forge/commit/1b77e6f20082d7484479303d0252d5f427651295","https://github.com/digitalbazaar/forge/releases/tag/v1.4.3"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-125335","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-125335","identifiers":["CVE-2026-125335"]},"retained":false,"historicalAffected":[]},{"revision":"e92176018e9f4e1ebf476432c05df762","observedAt":"2026-11-14T23:23:57.235+00:00","statement":{"source":"euvd","id":"EUVD-2026-122797","aliases":["CVE-2026-125335","GHSA-6889-vf6x-f3g5"],"title":"Forge (also called node-forge) is a native implementation of Transport Layer Security in JavaScript. Prior to 1.4.3, ed25519.verify() decodes a public key in crypto_sign_open() without rejecting small-order points or their non-canonical enc…","description":"Forge (also called node-forge) is a native implementation of Transport Layer Security in JavaScript. Prior to 1.4.3, ed25519.verify() decodes a public key in crypto_sign_open() without rejecting small-order points or their non-canonical encodings. With S = 0 and a small-order R value, an attacker who can choose the public key can produce signatures that verify for many messages, or all messages with the identity key, without a private key. This can defeat proof-of-possession, attribution, non-repudiation, or deduplication checks that rely on a signature being bound to the message. Keys produced by normal Ed25519 key generation are not small-order, so applications that verify only trusted or internally generated public keys are not affected. This issue is fixed in version 1.4.3.","state":0,"publishedAt":null,"modifiedAt":null,"affected":[],"metrics":[{"system":"EUVD CVSS 3.1","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","score":3.7,"severity":null}],"references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-6889-vf6x-f3g5","https://github.com/digitalbazaar/forge/pull/1169","https://github.com/digitalbazaar/forge/commit/1b77e6f20082d7484479303d0252d5f427651295","https://github.com/digitalbazaar/forge/releases/tag/v1.4.3"],"sourceUrl":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-122797","license":"ENISA EUVD · source terms and attribution apply","enrichment":{"sourceStatus":null,"weaknesses":[],"productCriteria":[],"sourceDates":{"datePublished":"Nov 10, 2026, 6:51:14 PM","dateUpdated":"Nov 12, 2026, 6:02:13 PM"},"relatedAdvisories":[],"note":"EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON."},"key":"euvd:EUVD-2026-122797","identifiers":["EUVD-2026-122797","CVE-2026-125335","GHSA-6889-vf6x-f3g5"]},"retained":false,"historicalAffected":[]},{"revision":"cde677f0f3ba46a583d30a73c3a54fb4","observedAt":"2026-11-12T23:19:32.776+00:00","statement":{"source":"nvd","id":"CVE-2026-125335","aliases":[],"title":"Forge (also called node-forge) is a native implementation of Transport Layer Security in JavaScript. Prior to 1.4.3, ed25519.verify() decodes a public key in crypto_sign_open() without rejecting small-order points or their non-canonical enc…","description":"Forge (also called node-forge) is a native implementation of Transport Layer Security in JavaScript. Prior to 1.4.3, ed25519.verify() decodes a public key in crypto_sign_open() without rejecting small-order points or their non-canonical encodings. With S = 0 and a small-order R value, an attacker who can choose the public key can produce signatures that verify for many messages, or all messages with the identity key, without a private key. This can defeat proof-of-possession, attribution, non-repudiation, or deduplication checks that rely on a signature being bound to the message. Keys produced by normal Ed25519 key generation are not small-order, so applications that verify only trusted or internally generated public keys are not affected. This issue is fixed in version 1.4.3.","state":0,"publishedAt":"2026-11-10T19:21:11.25+00:00","modifiedAt":"2026-11-12T19:16:54.233+00:00","affected":[],"metrics":[{"system":"CVSS 3.1 · security-advisories@github.com · Secondary","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","score":3.7,"severity":"LOW"}],"references":["https://github.com/digitalbazaar/forge/commit/1b77e6f20082d7484479303d0252d5f427651295","https://github.com/digitalbazaar/forge/pull/1169","https://github.com/digitalbazaar/forge/releases/tag/v1.4.3","https://github.com/digitalbazaar/forge/security/advisories/GHSA-6889-vf6x-f3g5"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-125335","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Undergoing Analysis","weaknesses":["CWE-347"],"productCriteria":[],"sourceDates":{"published":"2026-11-10T19:21:11.250","lastModified":"2026-11-12T19:16:54.233"},"relatedAdvisories":[],"note":"NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON."},"key":"nvd:CVE-2026-125335","identifiers":["CVE-2026-125335"]},"retained":false,"historicalAffected":[]},{"revision":"5eaf94ad98ee437095b902c67b13968b","observedAt":"2026-11-10T22:21:40.482+00:00","statement":{"source":"osv","id":"GHSA-6889-vf6x-f3g5","aliases":["CVE-2026-125335"],"title":"Forge: Ed25519 signature verification accepts small-order public keys","description":"### Summary\n`ed25519.verify()` does not reject public keys of small order, such as the identity point. Under such a key, a signature with `S = 0` and a small-order `R` verifies for many messages, or for every message with the identity key, without any private key. Fixed in node-forge 1.4.3.\n\n### Details\n`crypto_sign_open()` in `lib/ed25519.js` decodes the public key `A` with `unpackneg()`, which only checks that the point is on the curve, and then checks `R == [S]B - [k]A` with `k = SHA-512(R || A || M)`. Nothing rejects public keys of small order: the identity point, the other 7 points of order 2, 4 or 8, and their non-canonical encodings with `y >= p`.\n\nWith `S = 0`, the check becomes `R == [k](-A)`. For a small-order `A`, `[k](-A)` is one of at most 8 small-order points, so an attacker can make a valid signature by trying the small-order values of `R`. For the identity key (`01 00 … 00`), `R = identity` and `S = 0` verifies for every message. For the other small-order keys, a given message can be forged with high probability. No private key is involved. The `S < L` check added for CVE-2026-33895 (GHSA-q67f-28xg-22rw) doesn't apply, because `S = 0` is canonical.\n\nKeys produced by Ed25519 key generation (`ed25519.generateKeyPair()` or any RFC 8032 implementation) are never small-order, so signatures under them cannot be forged this way. Applications are affected when they verify signatures against a public key an attacker can choose (for example a key included with the signed data, a self-registered key, or a key in an attacker-controlled document) and rely on the signature being bound to the message: proof of possession, attribution, non-repudiation or deduplication.\n\nRFC 8032 doesn't require rejecting small-order public keys, and implementations differ. libsodium rejects them, and Node.js `crypto.verify()` (OpenSSL) rejects these signatures.\n\nThe fix rejects a public key `A` when `[8]A` is the identity point. This covers all small-order points and their non-canonical encodings.\n\n#### Patches\nFixed in node-forge 1.4.3. `ed25519.verify()` returns `false` for small-order public keys.\n\n#### Workarounds\nBefore calling `ed25519.verify()` with a public key from untrusted input, reject keys whose 32-byte encoding is one of the small-order points (the identity `01 00 … 00` and the other encodings that libsodium blocks), or only verify against keys you generated or have otherwise validated.\n\n#### Resources\n- RFC 8032, Section 5.1.7 (Ed25519 verification): https://www.rfc-editor.org/rfc/rfc8032#section-5.1.7\n- GHSA-q67f-28xg-22rw / CVE-2026-33895 (a different Ed25519 verification issue, fixed in 1.4.0): https://github.com/digitalbazaar/forge/security/advisories/GHSA-q67f-28xg-22rw\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N (3.7, Low)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N (6.3)\nCVSS 4.0 rates this Moderate because its integrity weighting is higher; the severity rating follows CVSS 3.1.\n\n#### Credits\nReported by @analisaperlengkapan.\n\n### Proof of concept\nIdentity public key `A = 01 00 … 00` (32 bytes) and signature `R = 01 00 … 00`, `S = 00 … 00` (64 bytes):\n\n    forge.ed25519.verify({message: 'admin=true', encoding: 'utf8',\n      signature: SIG, publicKey: IDENTITY});\n    // <= 1.4.2: true for any message; node:crypto.verify(): false\n    // 1.4.3: false\n\nOther small-order public keys (orders 2, 4 and 8, and non-canonical encodings) give forgeries for many messages with `S = 0` and a small-order `R`.\n\nRegression tests are in tests/unit/ed25519.js, and the reporter's PoC is in tests/pocs/ghsa-6889-vf6x-f3g5.js.\n\n### Impact\nApplications that verify Ed25519 signatures with node-forge against a public key that an attacker can choose are affected. An attacker can provide a small-order public key and then produce signatures that verify for many or all messages without a private key, defeating checks that rely on a signature being bound to its message under that key (proof of possession, attribution, non-repudiation, deduplication). Signatures under keys from honest key generation cannot be forged, and applications that only verify against their own or otherwise trusted keys are not affected.","state":0,"publishedAt":"2026-11-10T21:18:23+00:00","modifiedAt":"2026-11-10T21:30:03.9996163+00:00","affected":[{"ecosystem":"npm","name":"node-forge","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"1.4.3"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"LOW"}],"references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-6889-vf6x-f3g5","https://github.com/digitalbazaar/forge/pull/1169","https://github.com/digitalbazaar/forge/commit/1b77e6f20082d7484479303d0252d5f427651295","https://github.com/digitalbazaar/forge","https://github.com/digitalbazaar/forge/releases/tag/v1.4.3"],"sourceUrl":"https://github.com/advisories/GHSA-6889-vf6x-f3g5","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-6889-vf6x-f3g5","identifiers":["GHSA-6889-vf6x-f3g5","CVE-2026-125335"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-15T03:30:51.8285280+00:00","complete":true,"records":1781,"lastAttemptAt":"2026-11-15T03:30:51.828528+00:00","lastSuccessAt":"2026-11-15T03:30:52.0220544+00:00","error":null,"lastVerifiedAt":"2026-11-15T03:30:52.0220551+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-7de4d7559a5263003f03d9f70577ab06f92ba4178309f26fce53e22a4a959294-64506870a9a1090a8d0c5272d737568ebd51c8becfe1facb058977cac4ac83fa","complete":true,"records":425769,"lastAttemptAt":"2026-11-15T03:30:50.6159515+00:00","lastSuccessAt":"2026-11-15T03:30:50.6052211+00:00","error":null,"lastVerifiedAt":"2026-11-15T03:30:50.6159515+00:00","snapshotPublishedAt":"2026-11-15T03:29:56+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-e6ab561e8a444365a873763d64375496","complete":false,"records":13821,"lastAttemptAt":"2026-11-15T03:42:24.4547028+00:00","lastSuccessAt":"2026-11-15T03:42:23.433+00:00","error":"7 identifier lookups failed; latest failures include AccessDenied (HTTP 403). Other identifiers were checked independently.","lastVerifiedAt":"2026-11-15T03:42:23.433+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13867,"expectedIdentifiers":13874,"failedIdentifiers":7},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-15T03:30:51.8285280+00:00","complete":true,"records":1125,"lastAttemptAt":"2026-11-15T03:30:51.828528+00:00","lastSuccessAt":"2026-11-15T03:30:52.022937+00:00","error":null,"lastVerifiedAt":"2026-11-15T03:30:52.0229398+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-b4e16143cf664d0aa856e1009c943b33","complete":false,"records":13833,"lastAttemptAt":"2026-11-15T03:30:58.3499715+00:00","lastSuccessAt":"2026-11-15T02:30:50.077+00:00","error":"14 identifier lookups failed; latest failures include HttpError (HTTP 503). Other identifiers were checked independently.","lastVerifiedAt":"2026-11-15T02:30:50.077+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13860,"expectedIdentifiers":13874,"failedIdentifiers":14},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-64eea06dbd27de8464d5dbce1b78cc794cc59e2d901516ae0d3ea76e624cdae0","complete":true,"records":9955,"lastAttemptAt":"2026-11-15T03:30:51.6093294+00:00","lastSuccessAt":"2026-11-14T13:57:23.1208135+00:00","error":null,"lastVerifiedAt":"2026-11-15T03:30:51.6093294+00:00","snapshotPublishedAt":"2026-11-14T13:17:57+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-f4424d7d4861b1af1404bd15abcb83f295dcd003412a9340ca99dc8200aa148a","complete":true,"records":2014,"lastAttemptAt":"2026-11-15T03:30:51.2334746+00:00","lastSuccessAt":"2026-11-13T19:57:08.2864435+00:00","error":null,"lastVerifiedAt":"2026-11-15T03:30:51.2334746+00:00","snapshotPublishedAt":"2026-11-13T19:33:10+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-012aff9b2fb349d53e2c4bace6ca57956b6f5f9d82c1dc9fdc1c9b3c738f8977","complete":true,"records":3148,"lastAttemptAt":"2026-11-15T03:30:51.6425919+00:00","lastSuccessAt":"2026-11-14T04:57:03.8279646+00:00","error":null,"lastVerifiedAt":"2026-11-15T03:30:51.6425919+00:00","snapshotPublishedAt":"2026-11-14T03:02:50+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-deb41cb32d3b3d67de7960b1647d789a5218551d33a54a4b027ba315bcba590f","complete":true,"records":232473,"lastAttemptAt":"2026-11-15T03:30:51.414557+00:00","lastSuccessAt":"2026-11-15T01:46:53.6377511+00:00","error":null,"lastVerifiedAt":"2026-11-15T03:30:51.414557+00:00","snapshotPublishedAt":"2026-11-15T00:48:23+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}