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)
HAS_WEAKNESS (4)
AFFECTS (1)
VULNERABLE_TO (1)
Explore deeper with Ninja Signal's threat intelligence graph