CRITICALCVSS v3.1 9.8Vulnerability

CVE-2026-44267

### Summary An unauthenticated attacker who controls a string passed to any Elo JavaScript-emission path — `defaultFormats.elo.parse()`, the `bin/elo` CLI, or the live browser playground at `elo-lang.org/try` — can execute arbitrary code in the host JavaScript runtime. A payload built from the `.constructor.constructor` chain compiles, without modification, to a live `Function` invocation in the emitted JavaScript, escaping any sandbox assumption around "Elo is a safe data/DSL language." ### Vulnerable sink and root cause Three interacting sites in `src/` produce the bug at commit `749af7b`: 1. **`src/transform.ts:144–158`** — the `member_access` handler allows access on types `any`, `object`, or `array` without filtering the property name. This is the only place an integrator could have plugged a denylist. 2. **`src/compilers/javascript.ts:210`** — the JS emitter writes `${objectExpr}.${ir.property}` verbatim into the output, so any property name that survives the transform step flows unescaped into emitted JavaScript. 3. **`src/parser.ts:163–170, 748–750`** — the parser accepts `constructor` (and other JS meta-property names) as an ordinary identifier, so `.constructor` clears type-checking without triggering any warning. Combined, the Elo expression `({}).constructor.constructor('…')()` compiles to a live `Function('…')()` call in the emitted JS, executing in the realm of whichever sink runs the compiled code. ### Attack surfaces All three surfaces share the same root cause (no denylist in `transform.ts`) and are addressed by the same one-file patch: | # | Entry point | Threat model | |---|---|---| | 1 | Browser playground — `https://elo-lang.org/try/?code=…&run=1` | **0-click XSS / account takeover** against elo-lang.org. `?run=1` triggers `setTimeout(() => this.run(), 100)` in `playground_controller.ts:531`; the server issues a 301 that preserves `?code=`. Any shared URL that contains a payload compromises the visitor's session on elo-lang.org. | | 2 |

Properties

Cvss score
9.8
First seen
2026-11-03T17:53:42+00:00
Last seen
2026-11-03T17:53:42+00:00
Euvd assigner
GitHub_M
Retrieved at
2026-11-03T21:26:50+00:00
Src batch id
euvd-20261103T193401Z-8f3acf
Source url
https://github.com/advisories/GHSA-33r5-xmm8-v6x5
Ghsa updated
2026-11-03T17:53:43Z
Score
9.8
Euvd base score version
3.1
Fetched at
2026-11-03T19:34:20+00:00
Euvd vendor
enspirit
Cvss vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
First seen by Signal
2026-11-03T19:34:21+00:00
Euvd base score
9.8
Is ghsa only
false
Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Content hash
d82633796f10fb79b3bc9d37591947d8bede5986f5a6cd128b73fa9e2dfca385
Published at
2026-11-03T18:18:03.130
Last modified
2026-11-03T18:18:03.130

Related Entities (6)

Explore deeper with Ninja Signal's threat intelligence graph

CVE-2026-44267 (CVSS v3.1 9.8) — Ninja Signal Threat Intelligence | Ninja Signal