LiquidJS: Memory and render limit bypass via unbounded width padding in `date` filter (strftime)
Key facts
- Attack vector
- Network
- Privileges required
- None
- User interaction
- None
- Attack complexity
- Low
- Impact type
- Denial of service
- Confidentiality · integrity · availability
- None · None · High
- Fix status
- Fixed
Attack profile from CVSS 3.1 · CNA. Fix status from CNA and GitHub. Impact type from CWE-400.
Summary
LiquidJS is a Shopify/GitHub Pages compatible template engine written in pure JavaScript. In versions 10.25.7 and below, the date filter's strftime implementation parses width specifiers like %9999999d and forwards the captured width unchecked into pad()/padStart(), leading to memory and render limit bypass. In src/util/underscore.ts, the pad loop performs unbounded string concatenation without consulting the Context's memoryLimit or renderLimit, so a single small template ({{ x | date: '%5000000d' }}) produces megabytes of output and unbounded CPU. The memoryLimit and renderLimit options the docs (src/liquid-options.ts:87-92) advertise as DoS controls — and which the docstring explicitly mentions for strftime — are entirely bypassed. Exploitation can cause large memory allocations, high CPU usage, or OOM crashes per render. This issue has been fixed in version 10.26.0.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- None
- Automatable
- Yes
- Technical impact
- Partial
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| harttle | liquidjs | before 10.26.0 | 10.26.0 | Patch available | CNA |
| — | liquidjs (npm) | before 10.26.0 | 10.26.0 | Patch available | GHSA-hh27-hf48-9f5q |
- liquidjs Vendorharttle Affected before 10.26.0 Fixed in 10.26.0 Patch available CNA
- liquidjs (npm) Vendor— Affected before 10.26.0 Fixed in 10.26.0 Patch available GHSA-hh27-hf48-9f5q
Remediation
- Fix · CNA liquidjs (harttle) Fixed in 10.26.0
- Fix · GHSA-hh27-hf48-9f5q liquidjs (npm) Fixed in 10.26.0 Advisory →
Timeline
- 2026-10-02 Threatist record created from CVE-2026-45357
- 2026-10-03 Alias added: GHSA-hh27-hf48-9f5q
- 2026-10-13 EPSS moved to the 50th–90th percentile
- 2026-10-25 EPSS moved to the below the 50th percentile
- 2026-10-25 Priority changed: MEDIUM → LOW
- 2026-10-28 Fix available: npm/[email protected] · GHSA-hh27-hf48-9f5q
- 2026-10-28 1 new reference · GHSA-hh27-hf48-9f5q
References
Other 5
- https://github.com/harttle/liquidjs/security/advisories/GHSA-hh27-hf48-9f5q
- https://github.com/harttle/liquidjs/commit/3129d46dc95efa357b00e5a57ee1af80a13d72ed
- https://github.com/harttle/liquidjs/releases/tag/v10.26.0
- https://github.com/harttle/liquidjs
- https://github.com/harttle/liquidjs/blob/v10.26.0/CHANGELOG.md
More harttle vulnerabilities
- TI-2026-33363 LiquidJS is Vulnerable to Remote Code Execution CVSS 3.1CRITICAL 10.0
- TI-2026-44110 LiquidJS: An infinite loop vulnerability in `strip_html` filter CVSS 4.0HIGH 8.7
- TI-2026-40114 LiquidJS: `pop` filter bypasses `memoryLimit` accounting that its array-filter siblings enforce CVSS 4.0HIGH 8.2
- TI-2026-33362 LiquidJS: ReDoS via Quadratic Backtracking in `strip_html` Filter Regex CVSS 3.1HIGH 7.5
- 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
Sources
- CVE-2026-45357 · CVE Program
- CVE-2026-45357 · NVD
- FIRST EPSS
- GHSA-hh27-hf48-9f5q · GitHub Advisory Database · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences