Read the docs
TI-2026-27640 Aliases CVE-2026-35525GHSA-56p5-8mhr-2fph

LiquidJS has a root restriction bypass for partial and layout loading through symlinked templates

Priority HIGH 69CWE-61Published · Updated

Key facts

Attack vector
Network
Privileges required
None
User interaction
None
Attack complexity
Low
Attack requirements
Present
Impact type
Information disclosure
Confidentiality · integrity · availability
High · None · None
Fix status
Fixed

Attack profile from CVSS 4.0 · CNA. Fix status from CNA and GitHub. Impact type from CWE-61 and the CVSS impact.

Summary

LiquidJS is a Shopify / GitHub Pages compatible template engine in pure JavaScript. Prior to 10.25.3, for {% include %}, {% render %}, and {% layout %}, LiquidJS checks whether the candidate path is inside the configured partials or layouts roots before reading it. That check is path-based, not realpath-based. Because of that, a file like partials/link.liquid passes the directory containment check as long as its pathname is under the allowed root. If link.liquid is actually a symlink to a file outside the allowed root, the filesystem follows the symlink when the file is opened and LiquidJS renders the external target. So the restriction is applied to the path string that was requested, not to the file that is actually read. This matters in environments where an attacker can place templates or otherwise influence files under a trusted template root, including uploaded themes, extracted archives, mounted content, or repository-controlled template trees. This vulnerability is fixed in 10.25.3.

Why it matters now

Exploitation Proof of concept CISA SSVC · not in CISA KEV
EPSS 0.00403 34th percentileScored 2026-11-07
Public exploit Yes 1 exploit referenceTagged by NVD
Fix Fixed liquidjs (harttle): 10.25.3liquidjs (npm): 10.25.3

SSVC decision points

CISA ADP · SSVC 2.0.3

Exploitation
Poc
Automatable
No
Technical impact
Partial

The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.

Affected products

VendorProductAffected versionsFixed inStatusSource
harttleliquidjsbefore 10.25.310.25.3Patch availableCNA
—liquidjs (npm)before 10.25.310.25.3Patch availableGHSA-56p5-8mhr-2fph
  • liquidjs Vendorharttle Affected before 10.25.3 Fixed in 10.25.3 Patch available CNA
  • liquidjs (npm) Vendor— Affected before 10.25.3 Fixed in 10.25.3 Patch available GHSA-56p5-8mhr-2fph

CPE configurations NVD · 1

CPEVersionsRoleVendor
cpe:2.3:a:liquidjs:liquidjs:*:*:*:*:*:node.js:*:*before 10.25.3Vulnerableharttle
  • cpe:2.3:a:liquidjs:liquidjs:*:*:*:*:*:node.js:*:* Versions before 10.25.3 Vulnerable ·harttle

Remediation

  • Fix · CNA liquidjs (harttle) Fixed in 10.25.3
  • Fix · GHSA-56p5-8mhr-2fph liquidjs (npm) Fixed in 10.25.3 Advisory →

Timeline

  1. 2026-10-02 Threatist record created from CVE-2026-35525
  2. 2026-10-03 Alias added: GHSA-56p5-8mhr-2fph

References

  • TI-2026-29912 LiquidJS is vulnerable to Denial of Service via circular block reference in layout CVSS 3.1HIGH 7.5
  • TI-2026-28394 Information disclosure in harttle liquidjs CVSS 3.1HIGH 7.5
  • TI-2026-25698 LiquidJS has Exponential Memory Amplification through its replace_first Filter $& Pattern CVSS 3.1HIGH 7.5
  • TI-2026-25696 LiquidJS: memoryLimit Bypass through Negative Range Values Leads to Process Crash CVSS 3.1HIGH 7.5
  • TI-2022-09484 Information exposure in liquidjs CVSS 3.1MEDIUM 5.3
  • TI-2026-26466 LiquidJS has a Memory Limit Bypass via Quadratic Amplification in `replace` Filter CVSS 3.1MEDIUM 5.3
See all 8 →

Sources