Skip to main content

qs CVE-2026-82562

| EUVDEUVD-2026-68141 MEDIUM
Allocation of Resources Without Limits or Throttling (CWE-770)
2026-08-29 harborist GHSA-x5fp-wj9c-mxmx
6.3
CVSS 4.0 · Vendor: harborist
View

Attack ChainAIDerived

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

  1. Access
    Send HTTP request with oversized `a[]=` comma payload
  2. Delivery
    `parseValues` sets `isFlatArrayValue=false` for `[]=` key
  3. Exploit
    Pre-split comma count check skipped in `parseArrayValue`
  4. Execution
    Configured `arrayLimit` guard bypassed
  5. Persist
    Large inner array allocated in Node.js heap
  6. Impact
    Memory pressure causes service degradation or OOM crash

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource allocation limits
MITRE ATT&CK

1 technique across 1 tactic: Impact

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

Exploitation Conditions

Both comma: true AND throwOnLimitExceeded: true must be explicitly present in the options passed to qs.parse or a wrapping library - neither is enabled by default in any qs release. The attacker must be able to supply untrusted data to an endpoint that reaches the affected parse call, either via query string or URL-encoded request body. Exploitation is further bounded by transport-layer controls: Node.js's default 16 KB HTTP header size limit caps query-string payloads, and Express body-parser defaults to a 100 KB body size limit, so a multi-megabyte allocation requires a body parser with an elevated or absent size limit. Only qs versions 6.14.2 through 6.15.3 are in scope; versions below 6.14.2 fall under CVE-2026-2391, and v6.16.0 and later are fixed.

Impact

The CVSS 3.1 score of 3.7 (AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L) accurately reflects the significant exploitation constraint: both comma: true and throwOnLimitExceeded: true must be explicitly set by the application developer, as neither is enabled by default, gating real-world exposure to the subset of qs deployments that have consciously opted into this configuration pairing. No EPSS score is present in the provided data, so exploitation probability cannot be independently quantified. The CVE is absent from CISA KEV, confirming no observed active exploitation at time of analysis. A proof-of-concept is confirmed in the advisory. The DoS impact is further bounded by transport-layer controls: Node.js enforces a default 16 KB HTTP header size limit that caps query-string length, and body-parser middleware in Express defaults to a 100 KB request size limit, meaning the maximum allocatable array is constrained by infrastructure controls even without the fix. This makes the flaw a security control bypass - the configured hard limit fails open on one key spelling - rather than unbounded resource exhaustion from a small input, and the real-world blast radius is substantially lower than a raw CVSS assessment of network-reachable DoS would suggest.

Exploit ScenarioDerived

An attacker submits an HTTP request containing a query string or URL-encoded body with a parameter such as a[]= followed by one million comma-separated values to an application that calls qs.parse with { comma: true, throwOnLimitExceeded: true, arrayLimit: 20 }. Because the bracket-push key form bypasses the pre-split comma count check, the parser allocates a one-million-element inner array without throwing the expected RangeError, consuming heap memory proportional to the payload. A proof-of-concept confirming this behaviour is included in the vendor advisory.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

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

Alert me

AnalysisAI

Comma-split value parsing in the qs npm library (versions 6.14.2 through 6.15.3) bypasses the caller-configured arrayLimit when the bracket-push key form (a[]=) is combined with both comma: true and throwOnLimitExceeded: true options. An isFlatArrayValue flag in parseArrayValue incorrectly excluded []= key forms from the pre-split comma count check introduced by the CVE-2026-2391 patch, allowing a single crafted parameter to allocate an arbitrarily large inner array while the documented limit silently fails open. A proof-of-concept is confirmed in the vendor advisory; the CVE is not listed in CISA KEV and no active exploitation has been confirmed. The fix ships in v6.16.0 via commit 8859c37.

RemediationAI

Upgrade qs to v6.16.0 or later; this is the vendor-released patch (commit 8859c37, https://github.com/ljharb/qs/commit/8859c37470e11b42b547b275e4e9bd0bc8cc5464) that removes the isFlatArrayValue gate so that all comma-separated values, regardless of key form, are counted against arrayLimit before splitting. If an immediate upgrade is blocked, the most targeted workaround is to pre-validate or reject query strings and URL-encoded bodies containing []= before they reach qs.parse; note that this may break legitimate use of bracket-push syntax. Alternatively, disabling comma: true eliminates the vulnerable code path entirely if comma-splitting is not a product requirement, with no functional side effect for applications that do not rely on it. Disabling throwOnLimitExceeded (already the default) does not introduce new exposure but removes the intended hard-limit guarantee. Ensure any HTTP framework body-parser size limits are configured and enforced as a defence-in-depth control regardless of qs version.

Affected VersionsENISA

qs 6.14.2 <6.16.0

Affected Packages

npm qs fix: 6.16.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

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

Technical ContextAI · show details

The qs library (cpe:2.3:a:ljharb:qs:*:*:*:*:*:*:*:*) is a widely used Node.js query-string and URL-encoded body parser. CWE-770 (Allocation of Resources Without Limits or Throttling) captures the root cause: in lib/parse.js, the parseArrayValue function previously accepted an isFlatArrayValue parameter that gated whether the pre-split comma count check fired. For any query parameter whose key contained []=, parseValues set this flag to false, bypassing the arrayLimit guard before the string was split into an array. As a result, the opt-in hard limit introduced in v6.14.2 (as the CVE-2026-2391 fix) silently failed open for bracket-push key forms. Commit 8859c37 resolves this by removing the isFlatArrayValue parameter entirely, making the pre-split count apply uniformly to all key forms. The throwOnLimitExceeded: false default path is unchanged.

Know when Qs 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 (harborist) PRIMARY 6.3 LOW
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
vuln.today AI 3.7 LOW

AC:H reflects the requirement for two explicit non-default options; A:L reflects bounded, transport-constrained memory impact with no confidentiality or integrity consequence.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L
4.0 AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
SUSE 5.3 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Red Hat 3.7 LOW

Primary rating from Vendor (harborist).

CVSS VectorVendor: harborist

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
Low
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

3
CVE Published
Aug 31, 2026 - 10:50 cve.org
MEDIUM 6.3
Severity Changed
Aug 30, 2026 - 01:22 NVD
LOW MEDIUM
CVSS changed
Aug 30, 2026 - 01:22 NVD
3.7 (LOW) 6.3 (MEDIUM)

DescriptionCVE.org

Summary

When qs.parse is called with comma: true and throwOnLimitExceeded: true, a comma-separated value under a bracket-push key (a[]=1,2,3,4) is split into an array without being compared against arrayLimit, while the same value under a flat key (a=1,2,3,4), an indexed key (a[0]=), a nested key (a[b]=), or a dotted key (a.b= with allowDots) throws the documented RangeError. A single parameter such as a[]=1,2,2,... therefore produces an inner array of arbitrary length even though the caller opted into the hard limit. This is the []= key form that the fix for CVE-2026-2391 (qs 6.14.2) did not cover.

Details

In lib/parse.js, a comma-separated value under a []= key is split and then wrapped as a single nested element (val = [val], so that each a[]=x,y group counts as one element of the outer array). The arrayLimit check that 6.14.2 added for comma values runs after that wrap, so for []= parts it only ever saw the wrapper of length 1. 6.15.3 added a pre-split comma count so that an oversized value throws before it is allocated, but gated it on an isFlatArrayValue flag that parseValues set to false for any part containing []=, and did not pass it for object-valued input, so the gap remained.

PoC
js



var qs = require('qs');



var options = { comma: true, arrayLimit: 3, throwOnLimitExceeded: true };



qs.parse('a=1,2,3,4', options);   // RangeError: Array limit exceeded. Only 3 elements allowed in an array.



qs.parse('a[]=1,2,3,4', options); // { a: [ [ '1', '2', '3', '4' ] ] }  (no throw)



qs.parse('a[]=' + '1,'.repeat(1000000) + '1', { comma: true, arrayLimit: 20, throwOnLimitExceeded: true });



// no throw; a 1,000,001-element inner array is allocated


Fix

lib/parse.js, applied in 8859c37 on main and released as v6.16.0: the isFlatArrayValue gate is removed, so every comma-split value is counted against arrayLimit before splitting regardless of key form. An in-limit group under a[]= still counts as one element of the outer array, and the default (throwOnLimitExceeded: false) path is unchanged.

Affected versions

>=6.14.2 <6.16.0, fixed in v6.16.0.

v6.14.2 introduced arrayLimit enforcement for comma values (the fix for CVE-2026-2391) but only for values not under a []= key, and every release from v6.14.2 through v6.15.3 has the same gap. v6.14.0 and v6.14.1, where throwOnLimitExceeded exists but does not apply to any comma form, are covered by CVE-2026-2391 rather than this record. Earlier lines (6.7.x through 6.13.x) have comma but no throwOnLimitExceeded, so there is no hard cap on any comma path to bypass; releases before 6.7.0 have no comma option.

Impact

An unauthenticated attacker who can reach an application that parses untrusted query strings or urlencoded bodies with both comma: true and throwOnLimitExceeded: true (both non-default) can bypass the configured limit with a single a[]= parameter and force the parser to allocate an array proportional to the request size. The cost is strictly linear in the attacker-supplied bytes (about 0.1 microseconds and 6 to 7 retained bytes per input byte; the same out-of-memory threshold as the documented default throwOnLimitExceeded: false path), so a transport-layer request or body size limit bounds it completely (and node's default maximum HTTP header size of 16 KB already bounds the request line, so multi-megabyte payloads need a body parser). The impact is that an opt-in hard limit fails open on one key spelling, not unbounded allocation from a small input.

Threat Intelligence Overview

EPSS Score
0.3%
Top 76% exploitable
Prevalence
High
widely-used npm package, core dependency across Express and Node.js ecosystems
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Social Media
1
Sightings
Data Quality
8 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA Vendor CIRCL GitHub VulDB

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 MEDIUM
CISA KEV No
Public POC Yes
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.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
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
High
Technical Impact
Partial

Priority Score

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

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected
SUSE Linux Enterprise High Performance Computing 12 Not-Affected
SUSE Linux Enterprise Micro 5.3 Not-Affected
SUSE Linux Enterprise Micro 5.3 Not-Affected
SUSE Linux Enterprise Micro 5.4 Not-Affected

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