Skip to main content

Espruino EUVDEUVD-2026-86471

| CVE-2026-88388 HIGH
Stack-based Buffer Overflow (CWE-121)
2026-09-24 mitre GHSA-c28p-5mg4-7q2w
7.5
CVSS 3.1 · Vendor: mitre
View

Attack ChainAIDerived

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

  1. Access
    Reach 64-bit Espruino JS input surface
  2. Delivery
    Submit JS that raises an exception
  3. Exploit
    Trigger jsvGetLineAndCol 8-byte write into 4-byte int
  4. Execution
    Overwrite adjacent stack memory
  5. Impact
    Interpreter crash (DoS)

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Stack buffer bounds checking
MITRE ATT&CK

1 technique across 1 tactic: Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires a 64-bit build of Espruino (the vulnerability is specified as affecting 64-bit builds - the typical 32-bit microcontroller firmware is not indicated as affected), and the ability to supply JavaScript that triggers an exception reaching the error stack-trace path (jslPrintTokenLineMarker → jsvGetLineAndCol). Limiting factors: exploitation depends on the attacker having a channel to inject JS into the interpreter; on standard embedded deployments JS is loaded by the developer over USB/serial/Bluetooth rather than remotely, so genuine remote (AV:N) exploitation applies only where the interpreter is exposed to untrusted network input. Impact is constrained to a small (4-byte) stack overwrite with an attacker-uncontrolled value, realistically yielding a crash/DoS rather than code execution.

Impact

This is a stack-based buffer overflow (CWE-121) where jsvGetLineAndCol() performs an 8-byte write through a pointer that actually addresses a 4-byte int column variable, overwriting 4 bytes of adjacent stack memory during error stack-trace formatting. The NVD CVSS vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, 7.5) scores this as a pure availability/DoS issue, which is consistent with the write value being a line/column count - the attacker has little control over what gets written, making it hard to weaponize beyond a crash. Signals converge on LOW real-world priority: EPSS is only 0.17% (6th percentile), the flaw is NOT in CISA KEV (no confirmed active exploitation), and no public exploit code is identified. One important caveat: AV:N assumes the attacker can remotely feed JavaScript to the interpreter, but Espruino is normally a microcontroller firmware fed JS over USB/serial/Bluetooth by a developer - and this bug is explicitly limited to 64-bit builds (the Linux/desktop/emulator port), not the typical 32-bit embedded target. Verify actual exposure: if the JS interpreter is not network-reachable, effective attack vector is local and remote risk is overstated. C:N/I:N are appropriate - no evidence the constrained 4-byte overwrite yields code execution or disclosure.

Exploit ScenarioDerived

An attacker who can submit JavaScript to a 64-bit Espruino build supplies code that throws an exception; during error stack-trace rendering, jslPrintTokenLineMarker() invokes jsvGetLineAndCol() which writes 8 bytes into a 4-byte stack int, corrupting adjacent stack memory and crashing the interpreter (denial of service). No public exploit is identified, and the overwrite value is a line/column count, so reliable code execution is unlikely.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
No patch listed yet 0.2% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Sep 25, 2026

A stack-based buffer overflow in Espruino 2v29 (commit bffc6d0) lets an unauthenticated remote attacker crash the JavaScript interpreter by supplying script input that raises an exception and drives execution into the error stack-trace formatting path, where jslPrintTokenLineMarker() passes the address of a 4-byte int column variable to jsvGetLineAndCol(), which performs an 8-byte write through that mismatched pointer on 64-bit builds. The overwrite is small and the written value is not attacker-controlled, so the realistic outcome is a denial-of-service crash rather than code execution (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, availability impact only), and the flaw is specific to 64-bit builds - the ordinary 32-bit microcontroller firmware is not indicated as affected. Risk signals are currently low: EPSS is 0.17% (6th percentile), there is no CISA KEV entry, and no public exploit code has been identified at time of analysis, although genuine remote exploitation requires the interpreter to be reachable by untrusted input, since typical embedded deployments load JavaScript over USB, serial or Bluetooth from the developer.

RemediationAI

Upstream fix available (PR/commit); released patched version not independently confirmed. The advisory points to the Espruino commit https://github.com/espruino/Espruino/commit/ecd7d43e084ba9aafa8245609347fe0f4383b38c, so rebuild the affected 64-bit target from source at or after that commit and verify that the resulting patch actually corrects the jsvGetLineAndCol() size_t parameter or the caller's int column variable, since the supplied diff excerpt touches jslGetTokenValueAsString() and jsvGetString() instead; the NVD entry (https://nvd.nist.gov/vuln/detail/CVE-2026-88388) and VulDB record (https://vuldb.com/vuln/409800) should be checked for a tagged release once one is published. As temporary compensating controls, restrict how untrusted JavaScript can reach the interpreter: do not expose the Espruino JS console, Web IDE/HTTP server or telnet interfaces to untrusted networks, keeping code upload on USB, serial or Bluetooth as intended - the trade-off is loss of remote programming and telemetry. Where 64-bit builds are used only for emulation or Linux tooling, prefer a 32-bit build, where int and size_t are both 4 bytes and the overflow does not occur, at the cost of the larger address space and workload capacity a 64-bit host provides. Building with stack-protector/stack-canary and ASLR reduces the reliability of any attacker attempt to turn the 4-byte overwrite into control-flow hijacking, but since the overwritten value is not attacker-controlled the practical impact remains a crash; disabling or stubbing the stack-trace formatting path (jslPrintTokenLineMarker/jsvGetLineAndCol) removes the vulnerable code path entirely at the cost of losing source-position details in error messages, which degrades diagnostics for developers.

Affected VersionsENISA

n/a n/a

Affects your stack

Find out whether the stacks and servers you run are on an affected version.

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The root cause is a pointer-width mismatch falling under CWE-121 (stack-based buffer overflow) in Espruino's JavaScript error stack-trace handling. In the affected code path, jslPrintTokenLineMarker() declares a column value as a 4-byte int and passes its address to jsvGetLineAndCol(), whose parameter is a size_t pointer; on a 64-bit (LP64) build a size_t is 8 bytes wide, so the callee writes 8 bytes through a pointer that only spans 4 bytes of stack memory, corrupting the adjacent 4 bytes. On 32-bit targets size_t and int are both 4 bytes, which is why the defect manifests only on 64-bit builds such as desktop/emulator/Linux ports. The type-width assumption is the classic failure mode of code written primarily for 32-bit microcontrollers and then compiled for a 64-bit host, where the error-reporting path (jslPrintTokenLineMarker -> jsvGetLineAndCol) is reached whenever a JavaScript exception is formatted with source-position information. The upstream commit referenced against this CVE (github.com/espruino/Espruino/commit/ecd7d43e084ba9aafa8245609347fe0f4383b38c) is shown in the supplied diff modifying src/jslex.c (removal of a token null-termination line in jslGetTokenValueAsString) and src/jsvar.c (jsvGetString returning len-1 instead of len); that excerpt does not itself exhibit the jsvGetLineAndCol() size_t change, so the relationship between the commit and this specific flaw should be verified against the full patch before relying on it.

Know when Espruino 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 (mitre) PRIMARY 7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
vuln.today AI 7.5 HIGH

Feeding error-triggering JS needs no auth or UI and deterministically corrupts the stack (PR:N/UI:N/AC:L); constrained overwrite yields crash only, so C:N/I:N/A:H; AV:N retained but hinges on network exposure.

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

Primary rating from Vendor (mitre).

CVSS VectorVendor: mitre

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Lifecycle Timeline

3
CVSS changed
Sep 25, 2026 - 16:37 NVD
7.5 (HIGH)
CVE Published
Sep 24, 2026 - 00:00 cve.org
HIGH 7.5
CVE Published
Sep 24, 2026 - 00:00 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.org

Espruino 2v29 (commit bffc6d0) contains a stack-based buffer overflow vulnerability in the JavaScript error stack-trace handling path on 64-bit builds. A remote attacker can supply JavaScript input that triggers an exception and reaches jslPrintTokenLineMarker(), which passes the address of a 4-byte int column variable to jsvGetLineAndCol() as a size_t pointer. jsvGetLineAndCol() performs an 8-byte write through the mismatched pointer, overwriting adjacent stack memory.

Executive ViewAI

Why It Matters

Espruino 2v29 (commit bffc6d0) on 64-bit builds contains a remotely triggerable memory corruption flaw that can crash the JavaScript interpreter and cause denial of service when it processes crafted script input. Organizations using 64-bit Espruino deployments that accept remote or untrusted script input are affected, while typical 32-bit microcontroller firmware is not indicated as affected. Leadership should care because a successful attack can disrupt availability of affected services or devices, and no vendor-released patch is currently identified.

Business Impact: Medium
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: restrict remote access to Espruino script input, disable untrusted script execution, deploy input validation or sandboxing, monitor interpreter logs for crashes, and migrate to non-affected 32-bit builds where feasible.

Threat Intelligence Overview

EPSS Score
0.2%
Top 94% exploitable
Prevalence
Low
niche JS-on-microcontroller firmware; 64-bit desktop/emulator build even less deployed
Data Quality
6 sources
Confidence: High

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 HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available No
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.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· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
Medium

Priority Score

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

Attack Technique

A buffer overflow occurs when a program writes more data to a memory buffer than it was allocated to hold, causing the excess data to spill into adjacent memory regions.

A stack-based buffer overflow occurs when a program writes more data to a buffer located on the stack than it was allocated to hold.

CVE-2022-25465 HIGH POC
7.8 Mar 05

Espruino 2v11 release was discovered to contain a stack buffer overflow via src/jsvar.c in jsvGetNextSibling. Rated high

CVE-2022-25044 HIGH POC
7.8 Mar 05

Espruino 2v11.251 was discovered to contain a stack buffer overflow via src/jsvar.c in jsvNewFromString. Rated high seve

CVE-2018-20201 HIGH POC
7.8 Dec 18

There is a stack-based buffer over-read in the jsfNameFromString function of jsflash.c in Espruino 2V00, leading to a de

CVE-2018-11595 HIGH POC
7.8 May 31

Espruino before 1.99 allows attackers to cause a denial of service (application crash) and a potential Escalation of Pri

CVE-2024-25201 HIGH POC
7.5 Feb 07

Espruino 2v20 (commit fcc9ba4) was discovered to contain an Out-of-bounds Read via jsvStringIteratorPrintfCallback at sr

CVE-2024-25200 HIGH POC
7.5 Feb 07

Espruino 2v20 (commit fcc9ba4) was discovered to contain a Stack Overflow via the jspeFactorFunctionCall at src/jsparse.

CVE-2018-11598 HIGH POC
7.1 May 31

Espruino before 1.99 allows attackers to cause a denial of service (application crash) and a potential Information Discl

CVE-2018-11593 HIGH POC
7.1 May 31

Espruino before 1.99 allows attackers to cause a denial of service (application crash) and potential Information Disclos

CVE-2018-11594 MEDIUM POC
5.5 May 31

Espruino before 1.99 allows attackers to cause a denial of service (application crash) with a user crafted input file vi

CVE-2018-11592 MEDIUM POC
5.5 May 31

Espruino before 1.98 allows attackers to cause a denial of service (application crash) with a user crafted input file vi

CVE-2018-11591 MEDIUM POC
5.5 May 31

Espruino before 1.98 allows attackers to cause a denial of service (application crash) with a user crafted input file vi

CVE-2018-11590 MEDIUM POC
5.5 May 31

Espruino before 1.99 allows attackers to cause a denial of service (application crash) with a user crafted input file vi

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