Skip to main content

LiquidJS CVE-2026-106120

| EUVDEUVD-2026-93772 MEDIUM
Information Exposure (CWE-200)
2026-10-06 GitHub_M GHSA-fwxr-j5w2-587m
6.0
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate with low privileges
  2. Delivery
    Pollute Array.prototype or supply inherited index data
  3. Exploit
    Trigger template rendering affected array path
  4. Execution
    Read prototype-provided element outside readJSProperty
  5. Impact
    Disclose 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

liquidjs < 10.27.2

Affected Packages

npm liquidjs fix: 10.27.2

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

Vendor (GitHub_M) PRIMARY 6.0 MEDIUM
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
vuln.today AI 5.3 MEDIUM

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.

3.1 AV:N/AC:H/PR:L/UI:N/S:N/C:H/I:N/A:N
4.0 AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Oct 06, 2026 - 20:04 EUVD
CVE Published
Oct 06, 2026 - 18:04 cve.org
MEDIUM 6.0

DescriptionCVE.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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 31 npm packages depend on liquidjs (15 direct, 16 indirect)

Ecosystem-wide dependent count for version 10.27.2.

Threat Intelligence Overview

EPSS Score
0.4%
Top 73% exploitable
Prevalence
High
popular pure-JavaScript template engine, millions of weekly npm downloads
Threat Intel
1
1 source
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact· derived
High
Technical Impact
Partial

Priority Score

30
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +30
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy