CVE-2026-82562 in ljharbinfo

Summary

by MITRE • 08/30/2026

### 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.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Analysis

by VulDB Data Team • 08/30/2026

The vulnerability identified in this analysis represents a critical logic flaw within the query string parsing library qs, specifically affecting versions 6.14.2 through 6.15.3 when configured with specific options that enable strict array limit enforcement. The core issue arises from an inconsistency in how different key formats are processed during the parsing of comma-separated values. When the parser is instructed to split strings by commas and enforce a maximum array length, it correctly throws a RangeError for flat keys such as `a=1,2,3,4` when the count exceeds the configured limit. However, this enforcement mechanism fails to apply to bracket-push key formats like `a[]=1,2,3,4`. This discrepancy allows an attacker to bypass hard limits on array sizes by simply appending empty brackets to a parameter name, resulting in the allocation of arbitrarily large arrays that can lead to severe resource exhaustion and denial of service conditions.

The technical root cause lies in the internal logic flow within `lib/parse.js` during version 6.14.2 through 6.15.3. The previous fix for CVE-2026-2391 introduced checks against `arrayLimit` but only applied them to flat array values, identified by an `isFlatArrayValue` flag. For bracket-push keys containing comma-separated data, the parser first splits the string into individual elements and then wraps that entire set of split elements into a single nested array structure before applying limit checks. Consequently, the length check sees only one element—the wrapper array—rather than the actual number of items within it. This design oversight means that while `a=1,2,3,4` triggers an error for exceeding limits, `a[]=1,2,3,4` silently creates a nested structure containing all four elements without triggering any limit violation. The subsequent release 6.15.3 attempted to address pre-split counting but incorrectly gated this logic behind the same flawed flag, leaving the vulnerability intact until version 6.16.0 removed the gating condition entirely.

From an operational impact perspective, this flaw enables a denial of service attack against applications that parse untrusted query strings or URL-encoded bodies using qs with `comma: true` and `throwOnLimitExceeded: true`. An attacker can craft requests containing parameters like `a[]=1,2,...` with millions of comma-separated values. The server will then allocate memory proportional to the number of elements in the array rather than respecting the configured limit. Although the resource consumption is linear relative to input size and bounded by transport-layer limits such as HTTP header sizes or body parsers, the failure of an opt-in security control undermines application resilience. In environments where strict parsing policies are enforced to prevent abuse, this bypass allows attackers to exhaust server memory resources efficiently, potentially crashing services or degrading performance for legitimate users.

This vulnerability maps directly to CWE-787: Out-of-bounds Write in terms of resource allocation magnitude and CWE-20: Improper Input Validation regarding the failure to validate array sizes against configured constraints. In the context of the MITRE ATT&CK framework, this behavior aligns with T1496: Resource Hijacking, as it allows an attacker to consume excessive computational resources such as memory or CPU cycles through crafted input that bypasses intended safeguards. The attack vector is classified under T1190: Exploit Public-Facing Application, specifically targeting web applications that process query parameters or form data without adequate validation of array dimensions.

The recommended mitigation strategy involves upgrading the qs library to version 6.16.0 or later, where the `isFlatArrayValue` gating has been removed and all comma-split values are consistently counted against the `arrayLimit` before allocation occurs. For organizations unable to immediately upgrade, implementing a secondary validation layer that checks array lengths after parsing can provide temporary protection. Additionally, enforcing strict body size limits at the web server or reverse proxy level remains essential to bound the maximum possible memory consumption regardless of application-level logic flaws. Security teams should also audit configurations using `comma: true` and `throwOnLimitExceeded: true` to ensure that all key formats are uniformly validated against array limits in their current deployments.

Responsible

Harborist

Reservation

08/30/2026

Disclosure

08/30/2026

Moderation

accepted

CPE

ready

EPSS

0.00000

KEV

no

Activities

very low

Sources

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!