Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit arity-0 expression to embedding app
-
Deliverynew_expr() under-allocates te_expr buffer
-
ExploitUndefined behavior on undersized object
-
ExecutionUBSan aborts process
-
ImpactDenial of service
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Buffer size calculation
|
| Exploitation Conditions | Two concrete conditions must hold. (1) The embedding application must pass attacker-influenced expression strings into tinyexpr's parser (new_expr) - tinyexpr is a library with no network surface of its own, so reachability is inherited from the host app. (2) Critically, the binary must be compiled with UndefinedBehaviorSanitizer (UBSan) for the 'deterministic process termination' to occur; this is a non-default, typically development/CI-only build mode. The trigger itself is trivial - any arity-0 node (a constant, a variable, or a zero-argument function) causes the undersized allocation. Primary LIMITING factor: in standard production (non-UBSan) builds the flaw is undefined behavior with no guaranteed crash, sharply reducing real-world availability impact; secondary limit is that untrusted expressions must actually reach the parser. |
| Impact | Signals conflict sharply and net out to LOW real-world risk despite the 7.5/High CVSS. The input vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H claims a network-reachable, unauthenticated, no-interaction availability impact, but the description constrains the only observable effect to 'deterministic process termination in UBSan-instrumented builds' - a non-default compile-time configuration. In ordinary (non-UBSan) production builds the undersized arity-0 allocation is undefined behavior that typically produces no crash, so the A:H rating is overstated for realistic deployments. Exploitation-probability signals agree this is not a priority: EPSS is 0.15% (4th percentile), there is no CISA KEV listing, and no public exploit was provided. No SSVC decision data was supplied. tinyexpr is also a library, not a service, so 'AV:N' only holds when the embedding application feeds attacker-controlled expression strings to the parser - the network vector is inherited from the host application, not intrinsic. Bottom line: this is a legitimate correctness/memory-sizing defect (CWE-131) but a high-CVSS-but-low-real-risk issue for most consumers; prioritize only if you ship UBSan/hardened builds that process untrusted expressions. |
| Exploit ScenarioDerived | An application embeds tinyexpr to evaluate user- or network-supplied math expressions and is compiled with UndefinedBehaviorSanitizer. An attacker submits any arity-0 expression - a bare constant like '1', a variable, or a zero-argument function - causing new_expr() to allocate less than sizeof(te_expr) while the code treats the buffer as a full te_expr, which UBSan detects and aborts, denying service. No public exploit code was identified; triggering requires only a trivially simple expression but depends on the UBSan-instrumented build to produce the deterministic crash. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 06, 2026
Incorrect buffer size arithmetic in tinyexpr's new_expr() causes an undersized heap allocation for every arity-0 expression node (constants, variables, and zero-argument functions), which the parser then uses as a complete te_expr object. Because tinyexpr is a parsing library with no network surface of its own, exploitation requires a host application that feeds attacker-influenced expression strings to te_compile(), and the visible failure (deterministic process termination) is primarily observed in UBSan-instrumented development or CI builds rather than standard production builds. The binary-unauthenticated CVSS 3.1 score of 7.5 reflects a worst-case A:H impact, but our assessment downgrades availability to Low (AV:N/AC:L/PR:N/UI:N/C:N/I:N/A:L) because plain release builds exhibit undefined behavior without a guaranteed crash; EPSS is 0.15% (4th percentile), there is no CISA KEV entry, and no public exploit code was identified at time of analysis. An upstream fix commit is available.
RemediationAI
The primary fix is to update the vendored tinyexpr source to the upstream correction at github.com/szaydel/tinyexpr/commit/fe7459728c2ab8d2f91365abe56601cdd0e24f9b or any later upstream revision, which changes the allocation to sizeof(te_expr) + psize + (IS_CLOSURE(type) ? sizeof(void*) : 0) and converts parameters[1] to a flexible array member; released tagged versions of tinyexpr are not independently confirmed to include this change, so verify the patched lines in your vendored copy rather than assuming a version bump (patch status: upstream fix available via commit only). If you cannot rebuild the library, the highest-value compensating control is to stop attacker-controlled strings from reaching the parser: strict allow-listing of expression grammar (operators, literals, and a fixed function/variable set) before te_compile() prevents the arity-0 node path being reached with untrusted input, at the cost of rejecting some legitimate dynamic expressions and requiring careful sanitizer maintenance. Second, treat UBSan-instrumented builds as dev/CI-only and ensure the affected snapshots are not shipped in sanitizer-enabled artifacts, since UBSan converts the latent heap under-allocation into a hard abort; note this is a mitigation of symptom visibility, not of the underlying out-of-bounds access. Third, where expressions must be evaluated, run the parser in a sandboxed or restarted worker with memory-safety hardening (ASan/allocator hardening, process supervision) so that the undefined behavior cannot escalate beyond the parsing context; this adds latency and operational complexity. Monitor the upstream issue at github.com/codeplea/tinyexpr/issues/145 and the NVD entry at nvd.nist.gov/vuln/detail/CVE-2026-88355 for a tagged release confirmation.
Affected VersionsENISA
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 flaw class is CWE-131 (Incorrect Calculation of Buffer Size). The te_expr object is a tagged union ending in a flexible-style array of child pointers declared as void *parameters[1]; new_expr() computed its allocation as (sizeof(te_expr) - sizeof(void*)) + psize + (IS_CLOSURE(type) ? sizeof(void*) : 0), i.e. it subtracted one pointer's worth of storage. For arity-0 nodes psize is 0, so the allocation is a full pointer smaller than a te_expr, yet the code writes to and returns it as a complete object - out-of-bounds heap access and undefined behavior under the C standard. The upstream fix (commit fe7459728c2ab8d2f91365abe56601cdd0e24f9b) corrects the size to sizeof(te_expr) + psize + (IS_CLOSURE(type) ? sizeof(void*) : 0) and, in tinyexpr.h, converts the trailing member from parameters[1] to the C99 flexible array member parameters[], so the base struct size no longer implicitly includes a child slot. The trigger is deterministic and trivial: any expression containing only a constant, a variable, or a call to a zero-argument function hits the undersized path; UBSan-instrumented binaries abort on the detected out-of-bounds condition, whereas unsanitized builds have undefined behavior whose runtime consequence is implementation- and allocator-dependent.
Know when N A 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
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Any arity-0 expression triggers it (AC:L), but a reliable crash needs non-default UBSan builds, so availability is Low not High; no confidentiality/integrity impact.
Primary rating from Vendor (mitre).
CVSS VectorVendor: mitre
Lifecycle Timeline
3DescriptionCVE.org
An incorrect buffer size calculation vulnerability exists in tinyexpr commit 4a7456e in new_expr(). For arity-0 expression nodes, including constants, variables, and zero-argument functions, the function allocates less memory than sizeof(te_expr) but treats the returned allocation as a complete te_expr object. This results in undefined behavior and can cause deterministic process termination in UBSan-instrumented builds.
Executive ViewAI
tinyexpr, a parsing library used by applications that evaluate expression strings, contains a heap allocation flaw that can crash host applications if they process attacker-controlled expressions. Leadership should care because affected applications may experience availability disruptions-particularly in development and CI environments where UBSan can trigger deterministic process termination-though production risk is reduced and no public exploit identified at time of analysis. No vendor-released patch identified at time of analysis, but an upstream fix commit is available.
No vendor-released patch identified at time of analysis. Interim mitigations: avoid passing attacker-influenced strings to te_compile(); validate and restrict expression inputs to a strict allowlist; run expression parsing in a separate, sandboxed process with limited privileges; enable UBSan in development and CI builds to detect the deterministic termination; and apply the available upstream fix commit if building tinyexpr from source.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
LibreNMS before 24.10.0 allows a remote attacker to execute arbitrary code via OS command injection involving AboutContr
Reachable assertion in Open5GS up to version 2.7.6 allows remote unauthenticated attackers to crash the Diameter CER han
A Command Injection issue in the payload build page in BYOB (Build Your Own Botnet) 2.0 allows attackers to execute arbi
Denial of service in Open5GS 2.7.6 and earlier allows network-adjacent attackers with low-privilege Diameter Gx peer acc
Denial of service in Open5GS HSS (Home Subscriber Server) versions 2.7.0 through 2.7.6 is triggered remotely by manipula
Remote command injection in Control Web Panel allows unauthenticated attackers to execute arbitrary OS commands as root
LINQPad before 5.52.01 Pro edition is vulnerable to Unsafe Deserialization in LINQPad.AutoRefManager::PopulateFromCache(
Remote code execution in dash-uploader (Python package for Plotly Dash) versions 0.1.0 through 0.7.0a2 allows unauthenti
Command injection in LiteLLM 1.18.10 lets attackers who can configure MCP (Model Context Protocol) servers supply arbitr
SQL injection in AzuraCast's backup restore flow (versions up to and including 0.23.7) lets an attacker achieve privileg
Arbitrary file read in Yu AI Code Mother v4.3 lets anonymous, remote attackers retrieve files outside the intended previ
Remote code execution in APScheduler (all versions through 3.10.x and 4.0.0a5) is achievable when applications deseriali
EUVD-2026-86286
GHSA-8v6x-g49v-x5cf
NVD
CVE.org
EPSS
Exploit-DB