Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate with low privileges
-
DeliveryPollute Array.prototype or supply inherited index data
-
ExploitTrigger template rendering affected array path
-
ExecutionRead prototype-provided element outside readJSProperty
-
ImpactDisclose values ownPropertyOnly should hide
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK
2 techniques across 2 tactics: Collection, Discovery The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires the ownPropertyOnly LiquidJS option to be ENABLED (it is the very protection being bypassed) AND the attacker to control or influence prototype state (e.g., a polluted Array.prototype) or inherited array-index data on a scope array. The attacker must additionally be able to cause a template to render one of the specific affected operations: negative indexing (arr[-1]), the .first/.last accessors, the first/last/join/reverse/slice/compact filters, or {% for %} iteration. Limiting factors: this is strictly a confidentiality exposure (no write/DoS); direct positive indexing and ordinary object-prototype reads remain blocked and are NOT exploitable; and the flaw is inert on applications that do not enable ownPropertyOnly or that are not already subject to prototype pollution - reflected by the AT:P (attack requirement) and PR:L metrics. |
| Impact | This is a genuine but moderate-severity information-disclosure flaw (CVSS 4.0 base 6.0, Medium) rather than a top-tier priority. The vendor-provided CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:L/UI:N/VC:H) tells a nuanced story: network-reachable and low-complexity, BUT it carries AT:P (a specific attack requirement) and PR:L (low-privilege authentication), and impact is confined to confidentiality (VI:N/VA:N) with no scope change. The AT:P flag is the key risk-limiter and aligns with the description, which requires the attacker to influence prototype state or inherited array-index data - i.e., some pre-existing prototype pollution or attacker-controlled inherited data must already be present. No EPSS score, CISA KEV listing, or public POC is present in the supplied intelligence, so there is no public exploit identified at time of analysis and no evidence of active exploitation. The signals are internally consistent (no CVSS-vs-description conflict), and the primary caveat is that real-world risk depends heavily on whether ownPropertyOnly is enabled AND the application is already exposed to prototype pollution - a compound precondition that makes widespread opportunistic exploitation unlikely and points toward targeted, environment-specific abuse. Treat as a defense-in-depth hardening fix: patch during normal cycles, prioritizing deployments that rely on ownPropertyOnly as a security boundary for untrusted data. |
| Exploit ScenarioDerived | In an application that renders Liquid templates with ownPropertyOnly enabled to shield an untrusted object, an attacker who can pollute Array.prototype (or otherwise supply inherited array-index data) crafts or triggers a template that uses an 'affected' array path - for example {{ arr.first }}, {{ arr | last }}, {{ arr[-1] }}, or a {% for %} loop. These paths bypass readJSProperty() and read the prototype-provided element, disclosing data that ownPropertyOnly was expected to hide. No public exploit code was identified in the provided intelligence; the attack is low-complexity once the prototype-pollution precondition (AT:P) and low-privilege template influence are satisfied. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 06, 2026
Information disclosure in LiquidJS versions prior to 10.27.2 lets an attacker read prototype-inherited array elements that the ownPropertyOnly option is supposed to hide. When ownPropertyOnly is enabled and an attacker can influence prototype state (for example a polluted Array.prototype) or inherited array-index data on a scope array, rendering a template that uses negative indexing, the .first/.last accessors, the first/last/join/reverse/slice/compact filters, or {% for %} iteration can surface values that direct positive indexing and ordinary object-prototype reads continue to block. The flaw is confidentiality-only (CVSS 4.0 base 6.0, Medium; assessed CVSS 3.1 AV:N/AC:H/PR:L/UI:N/C:H/I:N/A:N), requires low-privileged access together with control over prototype/inherited data and the specific template operations, and no public exploit identified at time of analysis; it is inert on applications that do not enable ownPropertyOnly or are not already subject to prototype pollution.
RemediationAI
Upgrade LiquidJS to the fixed release 10.27.2 (release tag v10.27.2, fix commit 552819a84b80c62306fe61072628a756272dc749, PR #924, advisory GHSA-fwxr-j5w2-587m); vendor-released patch: 10.27.2. If immediate upgrade is not possible, treat ownPropertyOnly as an incomplete control and add compensating layers: eliminate the prototype-pollution precondition by freezing or sealing Array.prototype and Object.prototype at process start (Object.freeze(Array.prototype)) or running Node.js with --disable-proto=delete, accepting the trade-off that libraries which legitimately extend native prototypes may break; avoid passing unsanitised objects into LiquidJS scopes at all; and do not render attacker-supplied templates or template fragments, since an attacker who controls the template can reach every affected access path directly. Where template content is trusted but data is not, strip inherited/non-own array indices from scope objects before rendering, at the cost of extra serialisation overhead and the risk of dropping legitimately inherited values. Note that the patched documentation clarifies ownPropertyOnly only applies to property/index access on scope objects, so even after upgrading, filter transforms and iteration still follow standard JavaScript semantics and should not be relied on as a data-sanitisation boundary - preventing prototype pollution and keeping untrusted data out of scope objects remains the durable control.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in npm
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
LiquidJS is a pure-JavaScript implementation of the Shopify/GitHub Pages Liquid template language, and its template variable resolution runs through a Context object that walks a scope stack. The security control at issue is the ownPropertyOnly option, which routes scope lookups through readJSProperty() so that a key such as foo.bar only resolves when the property physically exists on the object rather than anywhere on the prototype chain, mitigating prototype-pollution-style data exposure. The CVE (CWE-200) is an incomplete-enforcement bug: readJSProperty() blocks plain positive indices and ordinary object prototype reads, but the alternate array access paths never passed through it. Negative indexing (arr[-1] computed as obj[obj.length + key]), the readFirst()/readLast() helpers used for .first/.last, the first, last, join, reverse, slice and compact filters, and for-loop iteration read from the array with raw JavaScript semantics, so an element provided by Array.prototype (for example Array.prototype[0] = 'POLLUTED' on a sparse array of length 1) is returned even when ownPropertyOnly is true. The upstream fix in PR #924 introduces a readArrayElement() helper that honours the ownPropertyOnly flag and replaces direct element access and prototype-reachable array methods (array.join, array.filter, value.slice, value.concat) with explicit Array.prototype/String.prototype invocations, and it widens the option's documentation to state that ownPropertyOnly governs scope property/index access while filter transforms and iteration retain standard JavaScript semantics.
Know when Liquidjs gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
AC:H and PR:L because exploitation depends on pre-existing prototype pollution and authenticated template influence; confidentiality-only (C:H, I:N/A:N) as it discloses data ownPropertyOnly should hide.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
LiquidJS is a Shopify / GitHub Pages compatible template engine in pure JavaScript. Prior to 10.27.2, enabling ownPropertyOnly does not consistently restrict inherited array indices because negative indexing, .first, .last, the first filter, the last filter, join, reverse, slice, compact, and for-loop iteration can read prototype-provided elements outside readJSProperty(). An attacker who can influence prototype state or inherited array-index data and cause templates to render affected operations can disclose values that ownPropertyOnly is expected to hide. Direct positive indexing and ordinary object prototype reads are blocked, but the alternate array paths remain affected. This issue is fixed in 10.27.2.
Blast Radius
ecosystem impact- 31 npm packages depend on liquidjs (15 direct, 16 indirect)
Ecosystem-wide dependent count for version 10.27.2.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Infinite-loop denial of service in LiquidJS affects the strip_html filter across versions 10.26.0 through 10.27.0, allow
Unbounded memory allocation in LiquidJS pop filter (prior to 10.27.1) allows remote attackers to exhaust server memory b
Memory accounting bypass in LiquidJS prior to 10.27.2 enables remote denial of service by exhausting V8 heap or process
The package liquidjs before 10.0.0 are vulnerable to Information Exposure when ownPropertyOnly parameter is set to False
liquidjs is a Shopify / GitHub Pages compatible template engine in pure JavaScript. versions up to 10.25.0 is affected b
EUVD-2026-93772
GHSA-fwxr-j5w2-587m
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB