Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain JavaScript execution in embedded QuickJS engine
-
DeliveryDefine Proxy with ownKeys trap returning length near 2^32
-
ExploitCall Object.keys() to invoke js_proxy_get_own_property_names
-
ExecutionWrap 32-bit len+extra_len so js_realloc under-allocates
-
PersistCopy loop overflows heap buffer
-
ImpactCorrupt heap metadata for potential code execution
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Integer overflow checks
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 | Two concrete preconditions must both hold: (1) the embedding application must execute attacker-controlled JavaScript in QuickJS-NG < 0.16.0 (the engine must evaluate untrusted script - a sandbox, plugin host, or script-driven embedded device); and (2) the host must be a 32-bit platform - the GHSA explicitly states that on 64-bit platforms the allocation size is correct and the overflow does not occur. The specific trigger is a Proxy whose ownKeys trap returns an array-like object with length near 2^32 (e.g. 0x20000000-0xffffffff), followed by Object.keys() or Object.getOwnPropertyNames() on that Proxy, which reaches js_proxy_get_own_property_names() and wraps the 32-bit count. Limiting factors beyond raw CVSS: not exploitable on 64-bit hosts; requires the ability to run JavaScript (PR:L, not anonymous network access); no user interaction required once script runs. |
| Impact | This is a genuine but conditionally-scoped memory-corruption flaw rather than an inflated high-CVSS issue. The vendor CVSS 4.0 vector (AV:L/AC:L/AT:N/PR:L/UI:N) with VC:H/VI:H/VA:H and the RCE tag reflect full triple-impact corruption, but the attack vector is LOCAL and requires PR:L - the attacker must already be able to execute JavaScript inside the embedded engine, so this is not a remote-unauthenticated internet-facing bug. The single most important limiting signal is in the source evidence, not the CVSS: the overflow only occurs on 32-bit hosts (IoT, embedded, some WASM runtimes); on 64-bit platforms the GHSA states the allocation size is correct and the overflow does not occur. No EPSS score was provided, so exploitation probability cannot be quantified. The CVE is NOT in CISA KEV, so there is no confirmed active exploitation. A public reproducer/PoC reference exists (the vendor's own regression tests in the fix commit and the VulnCheck advisory), but it is a crash reproducer and is not verified as a working weaponized code-execution exploit. The vuln.today decision label is 'this_week', consistent with a patched, locally-exploitable RCE-class flaw that is serious where the preconditions (32-bit host + untrusted JS) hold but not an emergency for the typical 64-bit deployment. One data conflict to verify with the vendor: the CVE description says 'before 0.16.0' (fixed in 0.16.0) while the GHSA package record lists 'vulnerable: <= 0.8.0', which is an inconsistent version range. |
| Exploit ScenarioDerived | An application embedding QuickJS-NG (< 0.16.0) on a 32-bit device evaluates attacker-supplied JavaScript. The attacker defines a Proxy whose ownKeys trap reports a length close to 2^32 and invokes Object.keys()/Object.getOwnPropertyNames() on it, wrapping the 32-bit allocation-size arithmetic so js_realloc allocates a small buffer while the copy loop writes far more entries, corrupting the heap for a crash or potential code execution. A public reproducer exists in the vendor's test suite (proxy_own_keys_huge_length / test_proxy_own_keys_huge_length), but it is a crash test, not a verified working exploit. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 02, 2026
Heap buffer overflow in QuickJS-NG releases before 0.16.0 gives JavaScript code a path to memory corruption on 32-bit hosts: a Proxy whose ownKeys trap reports an array-like result with a length near 2^32 wraps a 32-bit property count in js_proxy_get_own_property_names(), so the buffer allocated for enumerated keys is far smaller than the number of entries later copied into it. Only 32-bit deployments are affected - the GHSA states explicitly that on 64-bit platforms the allocation size is correct and the overflow does not occur - and the attacker must already be able to execute JavaScript inside the embedding host (CVSS 4.0 AV:L/PR:L), with no user interaction required once script runs. Successful exploitation corrupts heap metadata and can crash the host or potentially lead to code execution; there is no CISA KEV listing and no public exploit identified at time of analysis, though the upstream fix commit includes regression tests that demonstrate the trigger. Vendor-released patch: 0.16.0.
RemediationAI
Upgrade to QuickJS-NG 0.16.0 or later, which contains the rewritten js_proxy_get_own_property_names() from commit 252209d99cf112568160548bdcaa98d95e0d0068; vendor patch availability is confirmed and the release is published at https://github.com/quickjs-ng/quickjs/releases/tag/v0.16.0, with details in GHSA-jp52-chwg-2p9p. Where upgrading is not immediately possible, the highest-value compensating control is deployment posture: switch affected embedded or WASM deployments to a 64-bit build, since the GHSA states the allocation size is correct and the overflow does not occur on 64-bit platforms - the trade-off is higher memory footprint and possible toolchain or firmware-size constraints, and this is only viable if the host platform supports it. Second, stop passing untrusted script into the engine: restrict who can submit JavaScript to the embedding host (plugin signing, allow-listed scripts, disabling user-supplied rules or expressions), accepting the loss of scripting flexibility. Third, impose a JS_SetMemoryLimit on the runtime alongside script timeouts - upstream's own regression test uses a memory limit to force the huge allocation to fail - but treat this as reducing reliability of the crash rather than eliminating the flaw, since a wrapped allocation may still succeed and the copy loop remains unguarded. Audit embedded dependencies for the pre-0.16.0 source and re-verify any 32-bit firmware images; hiding or filtering the Proxy ownKeys result is not a supported mitigation because the corruption happens inside the enumeration path itself.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
QuickJS-NG is a small embeddable JavaScript engine used in IoT firmware, embedded devices, plugin hosts, sandboxes and WASM runtimes. ECMAScript Proxy objects let script supply an ownKeys trap that returns an array-like list of property keys; when the engine enumerates them (Object.keys(), Object.getOwnPropertyNames(), JSON-style reflection), js_proxy_get_own_property_names() in quickjs.c reads the trap result length with js_get_length32() into a uint32_t and computes the storage requirement with 32-bit arithmetic. In vulnerable builds (the advisory references quickjs.c line 51509 of v0.15.1), the combined count len + extra_len wraps to a small value when a trap reports a length close to 2^32 (the added tests use 0x20000000, 0x40000000, 0xfffffffe and 0xffffffff), js_mallocz/js_realloc then reserves a buffer sized from the truncated count, and the subsequent copy loop writes the full, untruncated number of property entries past the end of that buffer. This is CWE-190 integer overflow leading directly to CWE-122 heap-based buffer overflow. On 64-bit hosts the allocation size is computed correctly and the condition does not arise, which is why the affected population is the 32-bit embedded and WASM segment. The upstream fix (commit 252209d99cf112568160548bdcaa98d95e0d0068) replaces the single up-front allocation with a growing table: it tracks len and target_len separately, grows tab_size geometrically from a minimum of 8, clamps the growth to target_len, rejects sizes exceeding SIZE_MAX / sizeof(tab[0]) with an out-of-memory exception, and only stores a validated key after the capacity check. The regression tests assert that a huge trap length fails on the very first entry with 'TypeError: proxy: properties must be strings or symbols' rather than allocating or copying.
Know when Quickjs Ng 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
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
AV:L and PR:L because the attacker must execute JavaScript inside the engine; AC:L as the trigger is deterministic; heap corruption stays in-process (S:U) with full C/I/A impact.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
QuickJS-NG before 0.16.0 contains an integer overflow in js_proxy_get_own_property_names() in quickjs.c that causes a heap buffer overflow on 32-bit hosts. Attackers running JavaScript can return a large array-like object from a Proxy ownKeys trap to wrap the allocation size, causing crashes or potential code execution.
Technical POC Analysis
CWE-190 (integer overflow / wraparound) leading to CWE-122 (heap-based buffer overflow) in jsproxygetownpropertynames() in quickjs.c of quickjs-ng.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A heap buffer overflow vulnerability in QuickJS-NG releases before version 0.16.0 affects only 32-bit host deployments, requiring an attacker to already have the ability to execute JavaScript within the embedding host. While this limits exposure to specific architectures and authenticated contexts, a successful exploit could cause host crashes or potential code execution, disrupting embedded services. Leadership should prioritize upgrading affected 32-bit systems to eliminate risk and prevent operational downtime.
Apply vendor patch.
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
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.
Integer overflow occurs when an arithmetic operation produces a result that exceeds the maximum value a given integer type can store.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
More in Quickjs Ng
View allquickjs-ng through 0.9.0 has a missing length check in JS_ReadString for a string, leading to a heap-based buffer overfl
quickjs-ng through 0.9.0 has an incorrect size calculation in JS_ReadBigInt for a BigInt, leading to a heap-based buffer
Heap-based buffer overflow in QuickJS up to version 0.11.0 within the js_typed_array_constructor function allows unauthe
A vulnerability was found in quickjs-ng QuickJS up to 0.8.0. Rated medium severity (CVSS 5.3), this vulnerability is rem
Heap buffer overflow in QuickJS-NG before 0.16.0 allows JavaScript code executed by the embedding application to drive a
Heap memory exhaustion in QuickJS-NG versions before 0.16.0 lets JavaScript executed by an embedding host drain the proc
Use-after-free in QuickJS up to version 0.11.0 within the Atomics Ops Handler allows remote attackers to trigger memory
Heap-based buffer overflow in QuickJS up to version 0.11.0 within the js_typed_array_sort function allows remote attacke
Heap-based buffer overflow in QuickJS up to version 0.11.0 within the js_typed_array_constructor_ta function allows remo
EUVD-2026-115198
GHSA-m9xj-cppc-fm6c
NVD
CVE.org
EPSS
Exploit-DB