Skip to main content

figlet.js CVE-2026-96780

| EUVDEUVD-2026-91058 HIGH
Loop with Unreachable Exit Condition (Infinite Loop) (CWE-835)
2026-10-01 GitHub_M GHSA-62ch-8vmq-8xm7
8.2
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach figlet endpoint with whitespaceBreak enabled
  2. Delivery
    Submit tiny attacker-controlled width value
  3. Exploit
    breakWord() finds no valid break point
  4. Execution
    generateFigTextLines() loops without consuming input
  5. Impact
    CPU/memory exhaustion denies service

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Loop termination conditions
MITRE ATT&CK

1 technique across 1 tactic: Impact

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Two concrete prerequisites must both be met in the consuming application: (1) the non-default whitespaceBreak option must be explicitly enabled on the text()/textSync() call, and (2) an attacker must control (or influence) the width parameter and set it smaller than the rendered width of a single FIGlet character in the chosen font. Exploitation is LIMITED by the fact that whitespaceBreak is off by default and width is frequently a fixed server-side constant; applications that hardcode width or never enable whitespaceBreak are not exploitable. No authentication or user interaction is required by the library itself (PR:N/UI:N), but the AT:P metric reflects this required configuration/input condition.

Impact

This is a CWE-835 uncontrolled-loop denial-of-service flaw in figlet.js with a vendor CVSS 4.0 base score of 8.2 (AV:N/AC:L/AT:P/PR:N/UI:N) whose only impact is availability (VA:H); confidentiality and integrity are explicitly N, so there is no code execution or data exposure. The headline 8.2 overstates real-world priority because the AT:P (attack requirements present) metric and the description both make clear exploitation is conditional: the non-default whitespaceBreak option must be enabled AND an attacker-controlled width smaller than a single FIGlet character's rendered width must both reach the vulnerable text()/textSync() call. No EPSS score, SSVC decision, KEV listing, or POC was provided in the input - there is no public exploit identified at time of analysis and no evidence of active exploitation. Signals are internally consistent (network DoS gated by a specific configuration), so this is a genuine but situational availability issue rather than a broadly exploitable critical: realistic risk is limited to services that expose figlet rendering with attacker-influenced width and whitespaceBreak turned on. Patch is confirmed available (v1.11.3), lowering residual risk for maintained deployments.

Exploit ScenarioDerived

A web service or API that renders user-supplied text with figlet.js enables the non-default whitespaceBreak option and passes an attacker-controlled width value. The attacker submits a request specifying width=1 (smaller than any single character), causing breakWord() to never find a valid break point so generateFigTextLines() loops indefinitely, pinning CPU and growing memory until the Node.js process is exhausted. No public exploit code was identified, but the fix PR includes trivial reproducer test cases (e.g. text('AB', {width:1, whitespaceBreak:true})).

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 01, 2026

Unbounded CPU and memory consumption in figlet.js versions prior to 1.11.3 allows remote, unauthenticated attackers to exhaust server resources by driving text() or textSync() into a non-terminating loop. Exploitation requires two conditions in the consuming application: the non-default whitespaceBreak option must be enabled, and the attacker must control or influence the width parameter and set it narrower than the rendered width of a single FIGlet character - the root cause is CWE-835, where breakWord() cannot find a valid break point, returns without consuming any character, and generateFigTextLines() reprocesses the same input indefinitely. Impact is availability-only (CVSS 3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H; vendor CVSS 4.0 base 8.2 with VA:H and VC/VI:N), with no code execution, file access, or data exposure; exploitability is limited because whitespaceBreak is off by default and width is often hardcoded server-side. No public exploit code has been identified at time of analysis, and there is no evidence of active exploitation (no CISA KEV listing).

RemediationAI

Upgrade figlet.js to 1.11.3 or later - vendor-released patch: 1.11.3, per advisory GHSA-62ch-8vmq-8xm7 (fix PR #169 / commit cb2839d0e53aeafbd361e9587abc72e49e41cbb3). Because both prerequisites must be present, the fastest compensating control is to stop enabling the non-default whitespaceBreak option in any code path that processes untrusted text; this completely removes the vulnerable code path, at the cost of losing whitespace-preferring line breaks in rendered banners. Where whitespaceBreak must stay on, never pass a user-supplied width directly - clamp or hardcode width to a value at least as large as the widest glyph in the configured font (narrow widths are exactly the trigger), and validate/reject values below that floor, accepting that very narrow layouts are no longer supported. Additionally, run rendering inside a worker thread or subprocess with a hard execution timeout and memory cap so a looping call is killed rather than blocking the Node.js event loop, applying request timeouts and per-client rate limiting at the API gateway as a further backstop; these are defence-in-depth measures and do not substitute for the upgrade. Note that the same 1.11.3 release also rejects malformed FIGlet font headers with negative or zero height, baseline, maxLength, or comment-line counts, so any pipeline loading third-party .flf fonts should be updated as well.

Affected VersionsENISA

figlet.js < 1.11.3

Affected Packages

npm figlet fix: 1.11.3
euvd figlet_js fix: 1.11.3

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in npm, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

figlet.js (the patorjk/node-figlet package, CPE cpe:2.3:a:patorjk:figlet.js) is a JavaScript implementation of the FIGfont specification that renders ASCII/Unicode banner text. The flaw is an uncontrolled loop (CWE-835) in the word-wrapping pipeline: when a caller enables the non-default whitespaceBreak option together with a width smaller than the rendered width of a single FIGlet character in the selected font, breakWord() cannot locate a legal break point and returns without consuming a character from the input. generateFigTextLines() then loops over the same unconsumed input, burning CPU and growing memory until the process is exhausted - a particularly severe availability issue in Node.js because rendering runs on the single-threaded event loop, so a single request can stall the entire process rather than just one connection. The upstream fix in version 1.11.3 (PR #169, commit cb2839d0e53aeafbd361e9587abc72e49e41cbb3) adds a guard that emits the first character on its own line when no break point fits within opts.width, guaranteeing forward progress. The same commit hardens font parsing by rejecting FIGlet headers with non-positive height, negative baseline, negative maxLength, or negative comment-line counts, preventing related malformed-header conditions.

Know when Figlet Js 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

Vendor (GitHub_M) PRIMARY 8.2 HIGH
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
vuln.today AI 5.9 MEDIUM

Network-reachable DoS but gated by non-default whitespaceBreak plus an attacker-controlled undersized width, so AC:H; only availability is affected, C/I:N.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Oct 01, 2026 - 21:17 EUVD
CVE Published
Oct 01, 2026 - 20:21 cve.org
HIGH 8.2

DescriptionCVE.org

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.

Technical POC Analysis

CWE-835 (Loop with Unreachable Exit Condition).

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

figlet.js, a text-rendering library embedded in several of our JavaScript services, contains a resource-exhaustion flaw that can send a rendering call into a non-terminating loop, consuming CPU and memory until the affected process or host stops responding to legitimate traffic. Exploitation is restricted to unauthenticated attackers who hit a deployment that has enabled the non-default whitespaceBreak option and that lets client input influence the width parameter - no public exploit identified at time of analysis - so exposure is narrower than the headline severity suggests, but any internet-facing service meeting both conditions can be taken offline without credentials. Leadership should treat this as a service-availability and uptime risk and drive it through our standard dependency-patching process rather than as an application redesign.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.4%
Top 68% exploitable
Prevalence
Medium
popular npm ASCII-art library, broad dev/CLI use but rarely parsing untrusted input
Threat Intel
1
1 source
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
Medium
Technical Impact
Partial

Priority Score

41
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +41
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy