CVE-2026-44644
MediumCVSS 6.1Exploitation Probability (EPSS)
Low risk10th percentile - higher than 10% of all known CVEs
Summary
LiquidJS, a template engine compatible with Shopify/GitHub Pages, has a vulnerability to XSS in versions 10.25.7 and below due to a flaw in the strip_html filter logic. This flaw allows bypassing HTML sanitization, enabling attackers to inject malicious code.
Risk Assessment
Organizations using vulnerable versions of LiquidJS may be exposed to XSS attacks, potentially leading to user data theft or session hijacking. There is a high risk in applications rendering attacker-controlled strings without additional HTML-escaping.
Recommendation
It is recommended to update LiquidJS to version 10.26.0 or later to mitigate this vulnerability. Additionally, implementing extra security measures such as HTML-escaping for rendered output is advisable.
Other vulnerabilities in LiquidJS
See all- CVE-2026-45618Critical
LiquidJS is a Shopify/GitHub Pages compatible template engine. Prior to version 10.26.0, it is possible to execute arbitrary code with crafted templates. Version 10.26.0 patches the issue.
- CVE-2026-69222High
In LiquidJS before 10.27.2, the join filter in src/filters/array.ts computes complexity from array length and separator length instead of the total string length. The concat filter can cheaply double arrays, and join then materializes content while charging only for element count, allowing a template to exceed memoryLimit. The array_to_sentence_string filter has a similar defect, potentially crashing the process.
- CVE-2026-61556High
In LiquidJS from 10.26.0 to 10.27.1, the strip_html filter can enter an infinite loop when the input contains '<', has at least one preceding character, and no later '>'. This blocks template rendering and can cause denial of service with input as short as 'a<'.
- CVE-2026-55575High
In LiquidJS prior to version 10.27.1, the 'pop' array filter allocates a full clone of the input array without respecting the memoryLimit budget. This allows a template render like {{ huge_array | pop }} to allocate memory outside the configured limit.
- CVE-2026-45617High
LiquidJS is a Shopify/GitHub Pages compatible template engine that in versions 10.25.7 and below contains a flawed regex in the strip_html filter. This leads to ReDoS attacks via quadratic backtracking, blocking the Node.js event loop.
- CVE-2026-45357High
In versions 10.25.7 and below of the LiquidJS template engine, a vulnerability exists related to the date filter that improperly processes width specifiers, leading to unbounded string concatenation and bypassing memory and render limits.
- CVE-2026-44646Medium
In versions 10.25.7 and below, the LiquidJS template engine incorrectly propagates the ownPropertyOnly value from the parent context, leading to a silent bypass. As a result, developers may inadvertently expose prototype-chain properties in unsafe renders.
- CVE-2026-44645Medium
In versions 10.25.7 and below of the LiquidJS template engine, the renderLimit option can be fully bypassed by using an empty {% for %} or {% tablerow %} tag. This allows for unlimited rendering time consumption, potentially leading to DoS attacks.
- CVE-2026-41311High
LiquidJS before version 10.25.7 is vulnerable to a DoS attack via circular block references in {% layout %} / {% block %}, causing memory exhaustion and Node.js process crash.
- CVE-2026-39859High
LiquidJS before version 10.25.3 has a vulnerability that allows reading arbitrary files. Although root is set to constrain access, top-level file loads do not enforce that boundary. A Liquid instance configured with an empty temporary directory as root can return the contents of arbitrary files.
Original NVD description (English source)
LiquidJS is a Shopify/GitHub Pages compatible template engine written in pure JavaScript. Versions 10.25.7 and below are vulnerable to XSS through a flaw in the strip_html filter logic. The strip_html filter is intended to remove HTML tags from a string before rendering, and is widely used as an XSS sanitizer. The implementation uses a regex whose catch-all branch (<.*?>) does not match line terminators, so any HTML tag containing a \n or \r character passes through unmodified. An attacker who can place a newline inside a tag (e.g. <img\nsrc=x\nonerror=alert(1)>) bypasses sanitization entirely, since browsers treat newlines as whitespace within a tag and execute the resulting onerror/onload/etc. handler. Exploitation is possible for applications that both render attacker-controlled strings via {{ x | strip_html }} to defend against HTML injection and do not separately HTML-escape that output (default behavior — outputEscape is unset by default). This issue has been fixed in version 10.26.0.

