CVE-2026-44645: LiquidJS has a renderLimit DoS guard bypass via empty `{% for %}` body
(updated )
The renderLimit option — documented in docs/source/tutorials/dos.md as the mechanism that “mitigates this by limiting the time consumed by each render() call” — can be fully bypassed by a {% for %} (or {% tablerow %}) tag whose body is empty. The per-iteration time check is reached only when the body contains at least one template node, so a template like {%- 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.
References
- github.com/advisories/GHSA-8xx9-69p8-7jp3
- github.com/harttle/liquidjs/blob/v10.26.0/CHANGELOG.md
- github.com/harttle/liquidjs/commit/5b9c3469085e01c79e2d0af28e2a13f730e1793d
- github.com/harttle/liquidjs/releases/tag/v10.26.0
- github.com/harttle/liquidjs/security/advisories/GHSA-8xx9-69p8-7jp3
- nvd.nist.gov/vuln/detail/CVE-2026-44645
Code Behaviors & Features
Detect and mitigate CVE-2026-44645 with GitLab Dependency Scanning
Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Dependency Scanning using SBOM also detects vulnerabilities from proprietary advisories that this site does not include. Learn more about Dependency Scanning using SBOM →