{"id":"EUVD-2026-91058","revision":null,"records":[{"revision":"67de3cd6db624a3bb6324000fa3ad93f","observedAt":"2026-10-23T15:48:27.903+00:00","statement":{"source":"cve-program","id":"CVE-2026-96780","aliases":[],"title":"figlet is vulnerable to denial of service via unbounded loop when whitespaceBreak is used with a small width","description":"figlet.js is a FIG driver written in JavaScript that aims to implement the FIGfont specification. Prior to 1.11.3, text() and textSync() can enter an unbounded loop when whitespaceBreak is enabled and width is smaller than the rendered width of a single FIGlet character. Under these conditions, breakWord() cannot find a valid break point and returns without consuming a character, so generateFigTextLines() repeatedly processes the same input while consuming CPU and growing memory. The non-default option and attacker-controlled width must both reach an affected call. This issue is fixed in version 1.11.3.","state":0,"publishedAt":"2026-10-01T20:21:54.408+00:00","modifiedAt":"2026-10-01T20:40:30.208+00:00","affected":[{"ecosystem":"Vendor product","name":"figlet.js","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"patorjk\",\n                    \"product\": \"figlet.js\",\n                    \"versions\": [\n                        {\n                            \"version\": \"< 1.11.3\",\n                            \"status\": \"affected\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 4.0","vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N","score":8.2,"severity":"HIGH"}],"references":["https://github.com/patorjk/figlet.js/security/advisories/GHSA-62ch-8vmq-8xm7","https://github.com/patorjk/figlet.js/pull/169","https://github.com/patorjk/figlet.js/commit/cb2839d0e53aeafbd361e9587abc72e49e41cbb3"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-96780","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-96780","identifiers":["CVE-2026-96780"]},"retained":false,"historicalAffected":[]},{"revision":"ad4f749ff34145828e4d39237e6665a4","observedAt":"2026-11-11T17:06:40.686+00:00","statement":{"source":"euvd","id":"EUVD-2026-91058","aliases":["CVE-2026-96780","GHSA-62ch-8vmq-8xm7"],"title":"figlet.js is a FIG driver written in JavaScript that aims to implement the FIGfont specification. Prior to 1.11.3, text() and textSync() can enter an unbounded loop when whitespaceBreak is enabled and width is smaller than the rendered widt…","description":"figlet.js is a FIG driver written in JavaScript that aims to implement the FIGfont specification. Prior to 1.11.3, text() and textSync() can enter an unbounded loop when whitespaceBreak is enabled and width is smaller than the rendered width of a single FIGlet character. Under these conditions, breakWord() cannot find a valid break point and returns without consuming a character, so generateFigTextLines() repeatedly processes the same input while consuming CPU and growing memory. The non-default option and attacker-controlled width must both reach an affected call. This issue is fixed in version 1.11.3.","state":0,"publishedAt":null,"modifiedAt":null,"affected":[],"metrics":[{"system":"EUVD CVSS 4.0","vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N","score":8.2,"severity":null}],"references":["https://github.com/patorjk/figlet.js/security/advisories/GHSA-62ch-8vmq-8xm7","https://github.com/patorjk/figlet.js/pull/169","https://github.com/patorjk/figlet.js/commit/cb2839d0e53aeafbd361e9587abc72e49e41cbb3"],"sourceUrl":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-91058","license":"ENISA EUVD · source terms and attribution apply","enrichment":{"sourceStatus":null,"weaknesses":[],"productCriteria":[],"sourceDates":{"datePublished":"Oct 1, 2026, 8:21:54 PM","dateUpdated":"Oct 1, 2026, 8:40:30 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-91058","identifiers":["EUVD-2026-91058","CVE-2026-96780","GHSA-62ch-8vmq-8xm7"]},"retained":false,"historicalAffected":[]},{"revision":"7c3cd0e5aa284df7af3efe53e26ff891","observedAt":"2026-10-25T16:19:28.255+00:00","statement":{"source":"nvd","id":"CVE-2026-96780","aliases":[],"title":"figlet.js is a FIG driver written in JavaScript that aims to implement the FIGfont specification. Prior to 1.11.3, text() and textSync() can enter an unbounded loop when whitespaceBreak is enabled and width is smaller than the rendered widt…","description":"figlet.js is a FIG driver written in JavaScript that aims to implement the FIGfont specification. Prior to 1.11.3, text() and textSync() can enter an unbounded loop when whitespaceBreak is enabled and width is smaller than the rendered width of a single FIGlet character. Under these conditions, breakWord() cannot find a valid break point and returns without consuming a character, so generateFigTextLines() repeatedly processes the same input while consuming CPU and growing memory. The non-default option and attacker-controlled width must both reach an affected call. This issue is fixed in version 1.11.3.","state":0,"publishedAt":"2026-10-01T21:17:26.207+00:00","modifiedAt":"2026-10-02T18:47:49.947+00:00","affected":[],"metrics":[{"system":"CVSS 4.0 · security-advisories@github.com · Secondary","vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","score":8.2,"severity":"HIGH"}],"references":["https://github.com/patorjk/figlet.js/commit/cb2839d0e53aeafbd361e9587abc72e49e41cbb3","https://github.com/patorjk/figlet.js/pull/169","https://github.com/patorjk/figlet.js/security/advisories/GHSA-62ch-8vmq-8xm7"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-96780","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Deferred","weaknesses":["CWE-835"],"productCriteria":[],"sourceDates":{"published":"2026-10-01T21:17:26.207","lastModified":"2026-10-02T18:47:49.947"},"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-96780","identifiers":["CVE-2026-96780"]},"retained":false,"historicalAffected":[]},{"revision":"2284b64a064049db884dac761d14a7e4","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"GHSA-62ch-8vmq-8xm7","aliases":["CVE-2026-96780"],"title":"figlet is vulnerable to denial of service via unbounded loop when whitespaceBreak is used with a small width","description":"### Impact\nA denial-of-service (infinite loop) can occur in `text()` / `textSync()` when\n**both**:\n- `whitespaceBreak: true` is set, **and**\n- `width` is set smaller than the rendered width of a single FIGlet character.\nUnder these conditions `breakWord()` could never find a valid break point, so the\nword-wrapping loop in `generateFigTextLines()` never terminated. This pins a CPU\ncore and grows memory without bound, blocking the Node.js event loop.\n\n### Severity\nLow or Medium. Triggering requires a non-default configuration (`whitespaceBreak: true`) and\nan attacker-controlled `width` value reaching `text()`/`textSync()`. This library is typically\nused with fixed options, where this is not\nreachable. Applications that pass an untrusted `width` together with\n`whitespaceBreak` on a request path are affected.\n\n### Patches\nFixed in **figlet 1.11.3**. `breakWord()` now always makes forward progress\n(emitting an over-wide character on its own line), and FIGlet header parsing now\nrejects invalid values (e.g. zero/negative height).\n\n### Workarounds\nDo not expose `width` to untrusted input, or leave `whitespaceBreak` disabled\n(the default), or upgrade to 1.11.3.","state":0,"publishedAt":"2026-10-02T22:39:16+00:00","modifiedAt":"2026-10-02T23:01:22.7062213+00:00","affected":[{"ecosystem":"npm","name":"figlet","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"1.11.3"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V4","vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"HIGH"}],"references":["https://github.com/patorjk/figlet.js/security/advisories/GHSA-62ch-8vmq-8xm7","https://nvd.nist.gov/vuln/detail/CVE-2026-96780","https://github.com/patorjk/figlet.js/pull/169","https://github.com/patorjk/figlet.js/commit/cb2839d0e53aeafbd361e9587abc72e49e41cbb3","https://github.com/patorjk/figlet.js"],"sourceUrl":"https://github.com/advisories/GHSA-62ch-8vmq-8xm7","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-62ch-8vmq-8xm7","identifiers":["GHSA-62ch-8vmq-8xm7","CVE-2026-96780"]},"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-11T19:58:45.4661486+00:00","complete":true,"records":1779,"lastAttemptAt":"2026-11-11T19:58:45.4661486+00:00","lastSuccessAt":"2026-11-11T19:58:45.6262555+00:00","error":null,"lastVerifiedAt":"2026-11-11T19:58:45.6262565+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-de3b77103708811b6494d2ff7c979037d73ae579742cd1649a5c765137ae5083-bc2564cf749a574ebe6216cd53b2772c98ccf01e107d9e465c7cb9637c59db40","complete":true,"records":424281,"lastAttemptAt":"2026-11-11T19:56:48.005675+00:00","lastSuccessAt":"2026-11-11T19:56:47.8167322+00:00","error":null,"lastVerifiedAt":"2026-11-11T19:56:48.005675+00:00","snapshotPublishedAt":"2026-11-11T19:18:45+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-dc462e64383b443bb509cbf61bca2cb8","complete":false,"records":13759,"lastAttemptAt":"2026-11-11T20:09:03.8159657+00:00","lastSuccessAt":"2026-11-11T20:09:03.811+00:00","error":"167 identifier lookups failed; latest failures include AccessDenied (HTTP 403). Other identifiers were checked independently.","lastVerifiedAt":"2026-11-11T20:09:03.811+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13431,"expectedIdentifiers":13813,"failedIdentifiers":167},{"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-11T19:58:45.4661486+00:00","complete":true,"records":1097,"lastAttemptAt":"2026-11-11T19:58:45.4661486+00:00","lastSuccessAt":"2026-11-11T19:58:45.6274866+00:00","error":null,"lastVerifiedAt":"2026-11-11T19:58:45.6274869+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-0feae4fee9a0467f9dde710515b6c624","complete":false,"records":13753,"lastAttemptAt":"2026-11-11T19:59:11.1509472+00:00","lastSuccessAt":"2026-11-11T19:59:11.147+00:00","error":"100 identifier lookups failed; latest failures include request timeout. Other identifiers were checked independently.","lastVerifiedAt":"2026-11-11T19:59:11.147+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13713,"expectedIdentifiers":13813,"failedIdentifiers":100},{"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-3562b6c78fd1bd0f0b55daf66a0926ae24f65e462df7f6d928caad458fc696bf","complete":true,"records":9947,"lastAttemptAt":"2026-11-11T19:58:45.3029621+00:00","lastSuccessAt":"2026-11-11T04:27:43.6877707+00:00","error":null,"lastVerifiedAt":"2026-11-11T19:58:45.3029621+00:00","snapshotPublishedAt":"2026-11-11T03:32:46+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-456002455e0ab94bb92c95476d4e6d175c104cd594749982afd96c893728ecbc","complete":true,"records":2010,"lastAttemptAt":"2026-11-11T19:56:48.0811645+00:00","lastSuccessAt":"2026-11-11T02:36:58.1276999+00:00","error":null,"lastVerifiedAt":"2026-11-11T19:56:48.0811645+00:00","snapshotPublishedAt":"2026-11-11T01:17:51+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-baa8362b4daf9e5f39d5563775a55935e7b442c0735d33274a921579ce4a0d66","complete":true,"records":3093,"lastAttemptAt":"2026-11-11T19:58:45.4258391+00:00","lastSuccessAt":"2026-11-11T13:00:02.5446881+00:00","error":null,"lastVerifiedAt":"2026-11-11T19:58:45.4258391+00:00","snapshotPublishedAt":"2026-11-11T12:47:47+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-87231cdc7f9d4c655d3fcacbfa9f6f611f1797a1979bf49bac181b1f6e58d128","complete":true,"records":231686,"lastAttemptAt":"2026-11-11T19:58:45.1608584+00:00","lastSuccessAt":"2026-11-11T19:58:43.6336294+00:00","error":null,"lastVerifiedAt":"2026-11-11T19:58:45.1608584+00:00","snapshotPublishedAt":"2026-11-11T19:48:16+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}