MEDIUM 6.5

CVE-2026-44645: LiquidJS renderLimit Bypass DoS Vulnerability

LiquidJS, a JavaScript template engine compatible with Shopify and GitHub Pages, contains a denial-of-service vulnerability in versions 10.25.7 and below. The vulnerability allows an attacker with the ability to write templates to bypass the renderLimit protection mechanism—a feature designed to prevent templates from consuming excessive CPU time. By crafting a template with an empty for loop or tablerow block, an attacker can force a single render operation to consume far more time than the configured limit allows, potentially freezing application threads and disrupting service availability. This is particularly dangerous in multi-tenant environments where untrusted users can author templates.

Source data · NVD / CISA · public domain

CVSS
3.1 · 6.5 MEDIUM · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Weaknesses (CWE)
CWE-400
Affected products
0 configuration(s)
Published / Modified
2026-06-17 / 2026-06-22

NVD description (verbatim)

LiquidJS is a Shopify/GitHub Pages compatible template engine written in pure JavaScript. In versions 10.25.7 and below, the renderLimit option can be fully bypassed by a {% for %} (or {% tablerow %}) tag whose body is empty. The renderLimit option is documented in docs/source/tutorials/dos.md as the mechanism that "mitigates this by limiting the time consumed by each render() call." The per-iteration time check is reached only when the body contains at least one template node, so a template such as {%- for i in (1..N) -%}{%- endfor -%} iterates the full collection without ever consulting renderLimit. With a configured renderLimit of 50 ms, a single parseAndRenderSync call has been observed to consume 2.26 seconds (~45× over the limit) and scales linearly with N up to memoryLimit, allowing a low-privileged template author to wedge an event-loop thread for an attacker-chosen duration. Deployments that rely on a finite renderLimit for DoS protection (common in multi-tenant template-authoring environments) can still be forced by a single crafted template to monopolize a Node.js event-loop worker for attacker-controlled time, potentially stalling in-flight requests, with availability impact only. This issue has been fixed in version 10.26.0.

4 reference(s) · View on NVD →

SEC.co analysis · AI-assisted, reviewed against source

Technical summary

The vulnerability stems from an incomplete implementation of the renderLimit check in LiquidJS's loop handling. The renderLimit option is meant to enforce a per-render timeout by checking elapsed time on each loop iteration; however, this check is only performed when the loop body contains at least one template node. An empty loop body—created using syntax such as {%- for i in (1..N) -%}{%- endfor -%}—allows iteration over the full collection without triggering the per-iteration time check. A template author can construct an arbitrarily large loop range that iterates until hitting the memoryLimit, with no interruption from renderLimit. Testing showed a renderLimit of 50 ms being exceeded by ~45× (2.26 seconds observed) in a single parseAndRenderSync call, scaling linearly with loop count. The unprotected event-loop monopolization directly violates the documented DoS mitigation contract.

Business impact

For organizations using LiquidJS in multi-tenant or user-generated-template scenarios—such as SaaS platforms, dynamic content engines, or template-as-a-service offerings—this vulnerability creates a straightforward denial-of-service vector. A low-privileged template author can submit a single malicious template that stalls Node.js worker threads for seconds at a time, cascading availability degradation across in-flight requests handled by affected workers. The impact is amplified in containerized or resource-constrained deployments where event-loop stalling directly translates to request timeouts and service latency spikes. While confidentiality and integrity are unaffected, availability loss in production environments can damage user trust and SLA compliance.

Affected systems

LiquidJS versions 10.25.7 and earlier are vulnerable. The vulnerability is introduced whenever renderLimit is relied upon as a security control in applications that accept untrusted template input. This includes: Shopify theme builders, GitHub Pages-like static site generators that accept user templates, multi-tenant SaaS platforms using LiquidJS for dynamic rendering, and any application architecture that assumes renderLimit enforces a time-based DoS bound. Applications using LiquidJS but not relying on renderLimit for DoS protection, or those that validate and sanitize templates before execution, have reduced exposure. Version 10.26.0 and later contain the fix.

Exploitability

Exploitability is high for affected deployments because the attack requires only the ability to author or submit a template—a capability that multi-tenant platforms must provide to users by design. No authentication bypass, network tricks, or race conditions are needed. The malicious template is trivially simple (an empty loop over a large range) and is immediately effective on a single render call. However, the vulnerability requires an attacker to have template-authoring privileges; external unauthenticated attack is not possible unless the application publicly accepts template submissions. The vulnerability is not listed on CISA's KEV catalog as of the publication date.

Remediation

Upgrade LiquidJS to version 10.26.0 or later, which correctly implements the per-iteration renderLimit check even for empty loop bodies. For organizations unable to upgrade immediately, implement compensating controls: enforce strict template authoring policies and code review, set aggressive memoryLimit values to reduce the iteration ceiling, use worker thread pool limits to isolate template rendering from critical request handlers, and consider sandboxing template execution in separate processes with independent resource quotas. Monitor event-loop lag and request latency for signs of exploitation.

Patch guidance

Apply the upgrade to LiquidJS 10.26.0 or later in your package.json and run npm update (or equivalent). Verify the version constraint in your build artifacts and test with your application's template workloads to confirm the fix does not introduce performance regressions. If using a monorepo or internal fork, ensure all downstream consumers are updated. For teams with frozen dependency schedules, prioritize this upgrade in the next maintenance window, as the fix is backward compatible.

Detection guidance

Monitor Node.js event-loop lag and worker thread saturation during template rendering operations. Anomalies include sustained high CPU usage from a single parseAndRenderSync call or parseAndRender promise, request queue buildup without clear traffic spikes, and logs showing render operations exceeding the configured renderLimit threshold. Audit template repositories and user submissions for suspicious constructs: empty loops with large iteration ranges, loops using unbounded variables, or nested empty loops. Log and alert on templates that trigger renderLimit timeouts or warnings, as these indicate intentional or accidental resource exhaustion attempts. In multi-tenant systems, correlate render-time anomalies with specific users or accounts.

Why prioritize this

Despite a MEDIUM CVSS score, this vulnerability should be prioritized for rapid remediation in multi-tenant or user-generated-content environments because it directly undermines documented DoS protections and allows low-privileged attackers to reliably degrade availability. The exploit is trivial, requires no special conditions, and scales with attacker intent. Organizations that explicitly marketed or documented renderLimit as a security feature face elevated reputational and SLA risk if not remediated quickly. Single-tenant or tightly controlled template environments can schedule this as a routine update.

Risk score, explained

The CVSS 3.1 score of 6.5 (MEDIUM) reflects a network-accessible vulnerability with low attack complexity and low privilege requirements, but scoped impact limited to availability (no confidentiality or integrity loss). The score appropriately captures the severity of uncontrolled resource consumption, but context matters: in multi-tenant architectures where template authoring is a core feature and renderLimit is a stated security control, the real-world risk exceeds the base score. Conversely, applications using LiquidJS for static content rendering or as a supplementary feature may face lower practical risk.

Frequently asked questions

Do I need to upgrade if I don't use renderLimit?

If your application does not rely on renderLimit as a DoS protection mechanism—for example, you validate templates, execute them in isolated processes, or only trust template authors—the vulnerability's practical impact is reduced. However, an empty loop can still consume CPU and memory. Upgrade for defense-in-depth and to remove the exploit vector entirely.

Can this vulnerability be exploited remotely?

Only if your application accepts template submissions from unauthenticated or untrusted users over the network. If template authoring is restricted to authenticated, privileged users or internal developers, the attack surface is smaller. Multi-tenant SaaS platforms are at highest risk.

What's the difference between the fix and just increasing memoryLimit?

Increasing memoryLimit does not fix the vulnerability—it only raises the ceiling an attacker can exploit. The fix correctly enforces the renderLimit time-check on every iteration, regardless of loop body content, ensuring templates cannot run longer than the configured timeout regardless of iteration count or memory available.

Are there other attack patterns I should monitor for?

Yes. Watch for nested or chained empty loops, excessively deep or complex template structures designed to maximize iterations per unit of rendered output, and use of LiquidJS in contexts where templates are generated or modified dynamically by untrusted code. Audit any templates that previously hit renderLimit or timeout warnings.

This analysis is provided for informational purposes to help security teams assess and remediate CVE-2026-44645. The vulnerability details, affected versions, and patch information are sourced from the official CVE record and LiquidJS project announcements. Organizations should verify patch applicability against their specific dependency versions and test in non-production environments before deployment. This writeup does not constitute legal advice, security guarantee, or endorsement of any third-party tools or services. SEC.co makes no warranty regarding the completeness or accuracy of this analysis beyond the stated source data. Always refer to the official vendor advisory and security documentation for authoritative guidance. Source: NVD (public-domain), retrieved 2026-07-27. Analysis generated by SEC.co (claude-haiku-4-5).