Skip to main content

LiquidJS CVE-2026-61556

| EUVDEUVD-2026-63089 HIGH
Loop with Unreachable Exit Condition (Infinite Loop) (CWE-835)
2026-08-19 GitHub_M GHSA-m7fp-h3p4-hr49
8.7
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Identify network-accessible LiquidJS template endpoint
  2. Delivery
    Craft input string with unclosed '<' (e.g. 'a<')
  3. Exploit
    Submit to strip_html filter
  4. Execution
    Trigger infinite loop in html.ts
  5. Persist
    Block rendering thread indefinitely
  6. Impact
    Deny service to legitimate users

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

Exploitation requires the target application to use LiquidJS version 10.26.0 through 10.27.0 and to render templates that include user-controlled or externally supplied strings passed through the strip_html filter. The trigger condition is any string containing a '<' character preceded by at least one other character and lacking any subsequent '>' - a two-character input such as 'a<' is sufficient. Applications that do not pass untrusted input through strip_html, that sanitize or reject malformed angle-bracket sequences before template rendering, or that enforce per-request rendering timeouts are not at practical risk. The CVSS 4.0 vector (PR:N/UI:N) confirms that no authentication or user interaction is required when the rendering endpoint is network-accessible.

Impact

The CVSS 4.0 score of 8.7 with AV:N/AC:L/AT:N/PR:N/UI:N accurately captures the exploitation ease - the attack is fully automatable, requiring only a two-character string to trigger an infinite loop in any exposed rendering endpoint. EPSS data is absent from the available intelligence, so exploitation probability cannot be quantified beyond the CVSS signal. No CISA KEV listing is recorded, and no independently confirmed external POC exists beyond the reproduction test cases included in patch PR #917, indicating that widespread opportunistic exploitation has not yet been observed. The impact is strictly an availability loss with no confidentiality or integrity consequences, which limits blast radius to service disruption; systems that validate or sanitize template input before rendering, or that run LiquidJS in isolated worker threads with timeouts, substantially reduce practical risk. The single-character fix already shipped in 10.27.1 makes remediation low-effort and low-risk, arguing for prompt patching over complex mitigations.

Exploit ScenarioDerived

An attacker submits a crafted Liquid template string such as {{ "a<" | strip_html }} to a web application that renders user-supplied templates with LiquidJS 10.26.0-10.27.0. The strip_html filter enters an infinite loop, blocking the Node.js event loop or dedicated rendering thread. Repeated concurrent submissions of this trivial payload exhaust server capacity and deny service to legitimate users.

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

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

Alert me

AnalysisAIv1 – Aug 19, 2026

Infinite-loop denial of service in LiquidJS affects the strip_html filter across versions 10.26.0 through 10.27.0, allowing any caller who can supply template input to permanently block rendering with a string as short as two characters. The CVSS 4.0 score of 8.7 (AV:N/AC:L/PR:N/UI:N/VA:H) reflects that no authentication or special configuration is needed when the rendering endpoint accepts external input. The issue is fixed in version 10.27.1 via a one-character patch; no public exploit code beyond the patch test cases has been confirmed, and no CISA KEV listing is recorded.

RemediationAI

Upgrade LiquidJS to version 10.27.1 or later, which resolves the issue via the fix in commit 5c3522f33928aae66f0fe85c36e1d9015c768fe2 (PR #917); the release is available at https://github.com/harttle/liquidjs/releases/tag/v10.27.1 and the security advisory at https://github.com/harttle/liquidjs/security/advisories/GHSA-m7fp-h3p4-hr49. If immediate upgrading is not feasible, the most targeted compensating control is to validate or reject user-supplied strings containing a '<' character without a corresponding '>' before they reach the strip_html filter - this eliminates the triggering condition with minimal application impact. A second option is to wrap LiquidJS rendering in a per-request timeout (e.g., via a worker thread with an abort signal), which bounds the DoS window at the cost of added latency overhead and potential false-positive timeouts on legitimately complex templates. Disabling the strip_html filter entirely is a third option if the feature is not business-critical, removing the attack surface at the cost of that filtering capability.

Affected VersionsENISA

liquidjs 10.26.0, < 10.27.1

Affected Packages

npm liquidjs fix: 10.27.1

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

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

Technical ContextAI · show details

LiquidJS (CPE: cpe:2.3:a:harttle:liquidjs:*:*:*:*:*:*:*:*) is a pure-JavaScript template engine compatible with Shopify Liquid and GitHub Pages. The flaw (CWE-835: Loop with Unreachable Exit Condition) resides in the strip_html filter in src/filters/html.ts. When the filter encounters a '<' character with no subsequent '>', it advances the internal 'lt' pointer past the unclosed tag while the loop index 'i' remains unchanged. The stall guard condition 'i === lt' never triggers an exit because i is strictly less than lt at that point, so the loop reprocesses the same state indefinitely. The PR #917 fix (commit 5c3522f) changes the guard from strict equality to 'i <= lt', enabling the function to exit cleanly and return the remaining string slice. The PR diff also adds documentation clarifying that strip_html is a string scanner, not an HTML5 parser or sanitizer.

Know when Liquidjs 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.7 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
vuln.today AI 7.5 HIGH

Network-reachable with no authentication or interaction needed; infinite loop yields high availability impact only, with no scope change or confidentiality/integrity effects.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/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
None
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
Aug 19, 2026 - 22:04 EUVD
CVE Published
Aug 19, 2026 - 20:49 cve.org
HIGH 8.7

DescriptionCVE.org

LiquidJS is a Shopify / GitHub Pages compatible template engine in pure JavaScript. From 10.26.0 until 10.27.1, the strip_html filter in src/filters/html.ts can enter an infinite loop when an input string contains <, includes at least one preceding character, and has no later >. In strip_html, the search for the next opener advances lt while the loop index remains unchanged when the closer search returns -1, and the equality-only stall guard does not exit because the loop index is less than lt. Reprocessing the same state indefinitely blocks template rendering and can cause denial of service with an input as short as a<. This issue is fixed in version 10.27.1.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 14 npm packages depend on liquidjs (7 direct, 7 indirect)

Ecosystem-wide dependent count for version 10.26.0.

Executive ViewAI

Why It Matters

LiquidJS, a template rendering library used in web applications, contains a denial-of-service vulnerability affecting versions 10.26.0-10.27.0 that permanently blocks rendering with minimal input. Any system using LiquidJS to process user-supplied templates can be completely disabled by an external attacker. Organizations must urgently identify affected deployments and prioritize remediation to restore service availability.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.3%
Top 76% exploitable
Prevalence
Medium
popular JavaScript template engine across Shopify and Node.js ecosystems
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
5 sources
Confidence: Medium

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 Yes
EPSS 0.3%
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· derived
Out-of-Cycle
Exploitation· derived
Poc
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
High

Priority Score

64
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: +20
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